| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1062 人关注过本帖
标题:[求助]关于VFP中一个逻辑判断的语句,难倒VFP本身有BUG?
只看楼主 加入收藏
iori2iori2
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-7-30
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:12 
[求助]关于VFP中一个逻辑判断的语句,难倒VFP本身有BUG?
例如:
表1:字段(姓名,生日,号码)    其中“号码”为数值型
表2:字段(姓名,生日,标识)    其中“标识”为数值型,初始全为0
以上两个自由表。
本人编制以下程序,实现在表2中找出与表1中“姓名”相同的并且“号码”数大于50的人,在表2相应位置将“标识”替换为 1:
select 表1
do while .not. eof()
    select 表2
    replace all 标识 with 1 for alltrim(姓名) = alltrim(表1.姓名) .and. 表1.号码 > 50
    select 表1
    skip
enddo
一个很简单的循环查找功能。本人初学VFP用的6.0,练习时发现一个问题:
这句语句:replace all 标识 with 1 for alltrim(姓名) = alltrim(表1.姓名) .and. 表1.号码 > 50
如果换为:replace all 标识 with 1 for alltrim(表1.姓名) = alltrim(表2.姓名) .and. 表1.号码 > 50
查找结果会出错,有一个满足条件的记录会不标记,也就是查找结果少1个人!!!
为什么“alltrim(表1.姓名) = alltrim(表2.姓名)”与 “alltrim(表2.姓名) = alltrim(表1.姓名)”的逻辑判断会不同? 难倒VFP本身在逻辑判断上有漏洞?
不过按说这么有名的编程软件不该有漏洞啊。
以上疑惑不懂,请高手指点。


[ 本帖最后由 iori2iori2 于 2011-7-30 16:37 编辑 ]
搜索更多相关主题的帖子: 标识 姓名 while 
2011-07-30 16:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
你那本教材没告诉你=符号比较的法则?不等长的两个字符串,左右对调的=比较是不同结果的。你要严格比较,用==比较符。另外,查SET EXACT指令的帮助,那里会告诉你字符串的比较法则是怎样的。

授人以渔,不授人以鱼。
2011-07-30 16:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2011-07-30 16:44
iori2iori2
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-7-30
收藏
得分:0 
哦,多谢!我看的教材比较薄,基本都是例子。
原来还可以用“==”来比较啊,我还没见过这样的VFP程序示例呢。
下面的图片也很给力!
谢谢!
2011-07-30 16:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
漏了一人,看看那人的名字在两个表中是不是真的一样?中间有个空格了吧?不要以为alltrim()函数是把所有空格都删掉的,它只删字符串前后的空格,嵌在中间的不删。你那个被漏掉的人名字,两个表中肯定不等长。

授人以渔,不授人以鱼。
2011-07-30 16:57
iori2iori2
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-7-30
收藏
得分:0 
不过还有个疑问: alltrim()以后,字符串不是等长的吗?
2011-07-30 16:58
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
=是快速比较,从左边开始,逐个逐个字符与右边的比,比如"ab"="abc",左边到第三个字符就结束了,恰好右边也有"ab",所以比较就当作成功。如果是空字符串""="abc",永远是真的,因为右边最开始确实是什么字符也没有(序号为0处是没有)。这样比较,当然是快。但反过来就不同了,"abc"="ab",左边要三个字符,而右边只有两个,第三个发现不同,所以结果为假。你的问题,被漏掉那个,可能是"张三"="张 三",输入时错误所致。

用==比较符,要两边严格相同,所以它的速度较慢。

在VFP中,如果开启Rushmore优化机制,它不接受==这样的比较符,因为这样就无法加快速度了,所以,含有这种算符的SQL查询语句,VFP会自动关闭Rushmore优化。

授人以渔,不授人以鱼。
2011-07-30 17:06
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
看看5、7两楼,估计应该是这个原因了。

你的问题,被漏掉那个,可能是"张三"="张 三",输入时错误所致。

"张三"="张三1"   .T.
"张三1"="张三"   .F.
"张三"=="张三1"  .F.
"张三1"=="张三"  .F.

还要警惕汉字空格,那是最害人的。在两个表找到那个被漏掉的人的纪录,看看LEN(ALLTRIM(表1.姓名))和LEN(ALLTRIM(表2.姓名))是不是一样?

[ 本帖最后由 TonyDeng 于 2011-7-30 17:16 编辑 ]

授人以渔,不授人以鱼。
2011-07-30 17:10
iori2iori2
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-7-30
收藏
得分:0 
多谢 TonyDeng
那么RUSHMORE优化在哪里关闭啊?
2011-07-30 17:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
通常不用关rushmore的,VFP自己会判断,上面只是提醒你如果发现异常,检查一下是不是这种原因造成的。需要关闭rushmore的情形极少。你上面的REPLACE,默认就是打开了rushmore优化,因为使用了=比较符,如果用==,VFP自己会关掉rushmore,视你实际需要而定,真的要严格比较,就用,不要为了迁就优化而出错。

授人以渔,不授人以鱼。
2011-07-30 17:24
快速回复:[求助]关于VFP中一个逻辑判断的语句,难倒VFP本身有BUG?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018464 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved