主题:循环运行到第一个skip命令时就提示:已到文件尾!!是何原因?
baotong88
[专家分:0] 发布于 2012-04-12 16:26:00
大家好:
以下程序运行到第一个skip命令时就提示:已到文件尾!!但事实上表Lorderse(是select语句生成的临时表)
有6个记录,但是指针还是在第一个记录上,没有移动,是何原因?请各位多多指教,感激不尽!!!急!!
sele Lorderse
go top
do while !eof() &&更新
update taborderse set 颜色=Ltabtest.颜色,型号=Ltabtest.型号;
where 定单号==dindanhao and 颜色=Lorderse.颜色 and 型号=Lorderse.型号
sele Lorderse
skip
sele Ltabtest
skip
enddo
最后更新于:2012-04-12 16:41:00
回复列表 (共10个回复)
沙发
taifu945 [专家分:240] 发布于 2012-04-12 16:52:00
原因么就是你在Update语句的where子句中用到了Lorderse表文件呀,该表在Update对taborderse表字段更新时也会同步移动指针的,以响应where子句。你试试下面这条语句(其它语句全部拿掉):
update taborderse from Ltabtest,Lorderse set 颜色=Ltabtest.颜色,型号=Ltabtest.型号;
where 定单号==dindanhao and 颜色=Lorderse.颜色 and 型号=Lorderse.型号
板凳
baotong88 [专家分:0] 发布于 2012-04-12 18:08:00
很感谢你的回复,我试一下。。。
3 楼
baotong88 [专家分:0] 发布于 2012-04-12 18:55:00
好像不是你说的问题,我改成如下还是出提示:已到文件件尾!!
sele Lorderse
go top
do while !eof()
messagebox(" ttttttttt",48,"UBUR")
sele Lorderse
skip
sele Ltabtest
skip
enddo
4 楼
sywzs [专家分:5650] 发布于 2012-04-13 06:19:00
你的 Ltabtest 表有几条记录?
do while !eof() 这条语句是判断 Lorderse 表呢,还是判断 Ltabtest 表呢?
根据你的代码,应该是在 Ltabtest 的 SKIP 时已到了文件尾。
do while !eof() .... enddo 循环体内应该只针对一个表进行判断。
5 楼
taifu945 [专家分:240] 发布于 2012-04-13 08:05:00
根据你后面的那段程序来看,你有两个skip,分别针对两个表文件。你用跟踪窗口和监视窗口联合起来看看,到底是哪个表文件的记录溢出。这两个窗口很轻易就能看得到:跟踪窗口用F6或F8一句句走,监视窗口分别输入EOF("Lorderse")、EOF("Ltabtest")。如果值发生变化,FoxPro会自动用红色显示的。
6 楼
baotong88 [专家分:0] 发布于 2012-04-13 18:19:00
经过多次试验,复制这段到双击事件后再复制回click事件中又可以运行,我总感觉用到临时表有时总会莫名,明明有一个临时表Labc,可用sele Labc这句命令都会在调试时出错箭头指在此行,事实是这样吗?还是程序中受空格多少的影响,有这种情况吗?
7 楼
baotong88 [专家分:0] 发布于 2012-04-13 18:24:00
[quote]你的 Ltabtest 表有几条记录?
do while !eof() 这条语句是判断 Lorderse 表呢,还是判断 Ltabtest 表呢?
根据你的代码,应该是在 Ltabtest 的 SKIP 时已到了文件尾。
do while !eof() .... enddo 循环体内应该只针对一个表进行判断。
[/quote]
有5条记录,do while !eof() 这条语句是判断 Lorderse 表。谢!
8 楼
taifu945 [专家分:240] 发布于 2012-04-14 15:40:00
[quote][quote]你的 Ltabtest 表有几条记录?
do while !eof() 这条语句是判断 Lorderse 表呢,还是判断 Ltabtest 表呢?
根据你的代码,应该是在 Ltabtest 的 SKIP 时已到了文件尾。
do while !eof() .... enddo 循环体内应该只针对一个表进行判断。
[/quote]
有5条记录,do while !eof() 这条语句是判断 Lorderse 表。谢![/quote]
如果是判断Lorderse表,那就应该把你循环里最后两组SELECT...SKIP倒过来写,或把“!eof()”写成“!eof("Lorderse")”。另外,命令中单词之间的分隔空格没有限制必须是几个,可以是一个,也可以是多个。还有,FoxPro发展到9.0,关键字已经非常多,以往dBASE时代只写前四个字符的习惯建议改掉,还是把关键字写全比较好。一来自己以后维护方便,二来可以减少些莫名其妙的错误。
9 楼
taifu945 [专家分:240] 发布于 2012-04-14 15:45:00
[quote]经过多次试验,复制这段到双击事件后再复制回click事件中又可以运行,我总感觉用到临时表有时总会莫名,明明有一个临时表Labc,可用sele Labc这句命令都会在调试时出错箭头指在此行,事实是这样吗?还是程序中受空格多少的影响,有这种情况吗?[/quote]
临时表使用一点也不复杂,和正式表文件一样。但要你时刻注意一个问题:是否在使用半途被关闭!以你这篇回帖为例:如果在SELECT Labc之前已经有命令关闭了该临时表,那Labc这个临时表将被FoxPro自动删除,你再用SELECT命令选择那个工作区当然就发生错误了。临时表在使用过程中请务必保持打开,一旦要使用关闭命令关闭某个数据库或某个表文件,请一定要注意命令关闭的是哪个工作区的表文件,实在不行,就用“USE IN 工作区/别名”这条命令关闭。有了IN子句,无论当前工作区在哪里,总能准确关闭你想要关的工作区。
10 楼
baotong88 [专家分:0] 发布于 2012-04-16 13:02:00
谢谢!!!我再学习学习。
我来回复