标题:locate 查找命令运行后一个值得注意的问题。
只看楼主
总是出错
Rank: 2
等 级:论坛游民
威 望:1
帖 子:248
专家分:24
注 册:2012-12-24
结帖率:73.47%
已结贴  问题点数:20 回复次数:11 
locate 查找命令运行后一个值得注意的问题。
LOCATE FOR 命令是一个经常用到的命令。但是当查找失败后,在这个时候运行CALCULATE 命令时可能引起计算结果失真。
请看如下代码:
 SELE 库存数据表
                             locate  FOR 商品代码=c商品代码1 AND 仓库名称=ALLTRIM(仓库名称.VALUE)
                              
                              
                              IF FOUND()=.T.
                              
                                 REPLACE 数量 WITH n进库数量汇总1-n出库数量汇总1 ,单号 with alltrim(THISFORM.TEXT单号.VALUE);     
                                 商品类别 with c商品类别1  &&最新库存数量和最后单号写入
                              ELSE  
                             
                                 
                                CALCULATE MAX(val(序号)) TO c库存数据序号1 all &&读出最大序号
                               c库存数据序号1=alltrim(str(c库存数据序号1+1))
                              
                              
                               APPEND BLANK
                               REPLACE 数量 WITH n进库数量汇总1-n出库数量汇总1 ,单号 with alltrim(THISFORM.TEXT单号.VALUE);     
                                 商品类别 with c商品类别1,商品代码 with c商品代码1,商品名称 with c商品名称1, 单价 with n单价1;
                                  仓库名称 with ALLTRIM(仓库名称.VALUE), 序号 with c库存数据序号1,进出库性质 with ALLTRIM(出库性质.VALUE)
                              
                              
                              endif
我在调试这段程序的时候,最后写入表的序号是“1”
经过反复检查后,我确定程序没有问题,但是问题是处在什么地方呢,后来我在调试过程中,打开表,此时表没有数据显示,也就是说,当使用locate命令查找失败后,需要用SET FILTER TO命令把表重新整理后才能使用CALCULATE命令。
不知道我的理解是否正确,请各位指正。
搜索更多相关主题的帖子: 数据表 仓库 
2015-09-11 10:19
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:5 
可以用FOUND()判断是否找到了所要的记录。

坚守VFP最后的阵地
2015-09-11 10:22
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
应该与 locate 命令无关,可能之前使用了SET FILTER TO ......
2015-09-11 10:50
总是出错
Rank: 2
等 级:论坛游民
威 望:1
帖 子:248
专家分:24
注 册:2012-12-24
得分:0 
回复 3楼 吹水佬
绝对没有
2015-09-11 11:15
总是出错
Rank: 2
等 级:论坛游民
威 望:1
帖 子:248
专家分:24
注 册:2012-12-24
得分:0 
回复 3楼 吹水佬
我用表试过。具体的是,先打开一个表,使用查找命令,同时设定条件使查找失败,在此时使用CALCULATE命令,结果失真。
2015-09-11 11:19
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:5 
使用SELECT 好像不会出现这个问题,但SELECT 的结果和 CALCULATE有区别的。

SELECT MAX(val(序号)) FROM 表 INTO ARRAY 最大序号  &&当整个表没数据时,结果是 NULL,而用CALCULATE,结果是0
CALCULATE MAX(val(序号)) TO c库存数据序号1 all &&读出最大序号
2015-09-11 11:52
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 5楼 总是出错
可能是个例,问题是否出在相关表数据和代码算法?放上来一试就明。
一般性测试无问题:
CREATE CURSOR 表 (f1 C(10), f2 C(10))
FOR i = 1 TO 100
    INSERT INTO 表 VALUES (PADL(i, 10, "0"), TRANSFORM(i))
ENDFOR
LOCATE FOR f1 == "101"
IF !FOUND()
    CALCULATE MAX(VAL(f2)) TO nF2 ALL
    ? nF2   
ENDIF
2015-09-11 14:28
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:5 
没有查到符合条件的记录时,表指针已经是EOF,此时再对字段进行计算,不出错才怪呢。

活到老,学到老! http://www. E-mail:hu-jj@
2015-09-11 17:18
总是出错
Rank: 2
等 级:论坛游民
威 望:1
帖 子:248
专家分:24
注 册:2012-12-24
得分:0 
回复 7楼 吹水佬
你是对的。判断之准确,佩服!
2015-09-12 00:32
总是出错
Rank: 2
等 级:论坛游民
威 望:1
帖 子:248
专家分:24
注 册:2012-12-24
得分:0 
回复 7楼 吹水佬
教训之一,尽可能不要使用屏蔽命令,而使用查询命令。
教训之二,万不得已使用了屏蔽命令,应在使用完毕后立即解除屏蔽。
教训之三,还是要多看帮助文件,尽自己的能力理解每一条命令或者函数的内涵和外延。
谢谢你的指正。
2015-09-12 01:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-457216-1-1.html




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

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