回 帖 发 新 帖 刷新版面

主题:[请教] EVALUATE()在SELE查询语句中为什么出问题?

请看下面两个实例:

1、错误
  FOR II=1 TO FCOU("操作表名")
    VV="LSB_"+ALLTRIM(STR(II))
    SELE 操作表名
    VVV=FIEL(II)
    SELECT &VVV. FROM 操作表名 WHERE NOT EMPTY(EVALUATE(VVV)) ;
    GROUP BY &VVV INTO TABLE (VV)
    USE
  NEXT II


2、改为下式后正确
  FOR II=1 TO FCOU("操作表名")
    VV="LSB_"+ALLTRIM(STR(II))
    SELE 操作表名
    VVV=FIEL(II)
    COPY TO LSB_JH FOR NOT EMPTY(EVALUATE(VVV))
    SELECT &VVV. FROM LSB_JH GROUP BY &VVV INTO TABLE (VV)
    USE
    USE IN LSB_JH
  NEXT II

看来问题出在EVALUATE()上,但觉得不应该,百思不得其解,敬请高师指教。

回复列表 (共17个回复)

沙发

老兄:你好
你太大意了。

该问题在 帮助文档中已明确指出:
在 SQL 查询的 WHERE 子句中包含 EVALUATE( ) 函数可能返回不正确的数据。

这与 SQL 查询 语句的运行扫描数据方式有关。

板凳

SELE 名次表
  FOR II=1 TO FCOUNT("名次表")
    VV="LSB_"+LTRIM(STR(II))
    VVV=FIELD(II,"名次表")
    SELECT &VVV. FROM 名次表 WHERE NOT EMPTY(CURVAL(VVV)) ;
    GROUP BY 1 INTO TABLE (VV)
    USE IN (VV)
  NEXT II

3 楼

& 宏替换最好在查询语句中,只出现一次。
如果需要多次调用,可把整条查询命令,写成表达式,再用宏替换执行。

4 楼

[quote]SELE 名次表
  FOR II=1 TO FCOUNT("名次表")
    VV="LSB_"+LTRIM(STR(II))
    VVV=FIELD(II,"名次表")
    SELECT &VVV. FROM 名次表 WHERE NOT EMPTY(CURVAL(VVV)) ;
    GROUP BY 1 INTO TABLE (VV)
    USE IN (VV)
  NEXT II
[/quote]
cb1518弟你好:
    我采用上面方式后,在“SELECT &VVV. FROM 名次表 WHERE NOT EMPTY(CURVAL(VVV)) GROUP BY 1 INTO TABLE (VV)”语句出现“函数要求使用行缓冲或表缓冲方式。”,是怎么回事?

5 楼

[quote]老兄:你好
你太大意了。

该问题在 帮助文档中已明确指出:
在 SQL 查询的 WHERE 子句中包含 EVALUATE( ) 函数可能返回不正确的数据。

这与 SQL 查询 语句的运行扫描数据方式有关。[/quote]
多谢cb1518弟,看来我是误入禁区了。

6 楼

如果函数在SQL查询过程中是恒定不变的,
也就是说函数值与字段之间没有关系的话,
完全有必要使用变量值代替这样的函数,
因为SQL对每条记录进行查询的时候都需要计算一次函数的值.
因为VFP的SQL的智能还没能清楚分辨函数是否与字段有关的那个程度.
势必对查询速度与时间造成很大的浪费.

7 楼

moz兄弟你好:
    从0楼你能看出,实际需求中的字段名是多个,表也是多个,因而字段的名字只好用变量代,过去求得变量的值一直用EVAL()了,可没想到在SQL的查询语句中却出了问题。

8 楼

嗯,你在0楼的代码里好像忽略一个地方,你再试试看看:
SELECT &VVV. FROM 操作表名 WHERE NOT EMPTY(EVALUATE([color=ff00ff]&[/color]VVV)) ;
    GROUP BY &VVV INTO TABLE (VV)

9 楼

[quote]嗯,你在0楼的代码里好像忽略一个地方,你再试试看看:
SELECT &VVV. FROM 操作表名 WHERE NOT EMPTY(EVALUATE([color=ff00ff]&[/color]VVV)) ;
    GROUP BY &VVV INTO TABLE (VV)[/quote]
moz兄弟你好:
    我觉得有两点不妥:
    1、1楼讲了,SQL查询语句中不能用EVAL()函数。
    2、EVAL()函数里好象不能再用&了。

10 楼

经VFP9测试,完全推翻9楼所言.

我来回复

您尚未登录,请登录后再回复。点此登录或注册