注册 登录
编程论坛 VFP论坛

排查了一个多小时了,以前正确的代码现在老是提示错误,是不是我的系统出问题了?

琅拿度 发布于 2021-07-07 15:45, 4576 次点击
for i_zdxx=1 To 3
            iic=Allt(Str(i_zdxx))
            zdxx&iic=""
            Sele yinglijilu
            Go Top
            Do While Eof()=.F.
                If fangan&iic=.T. && 发生错误的行
                    zdxx&iic=Substr(Item,3,2)+'-'+Left(Allt(end_time),5)+':'+Chr(13)+zdxx&iic
                Endi
                Skip
            Enddo
endfor


如上述代码,yinglijilu 里面是有 fangan1~fangan3字段的,逻辑型,以前运行也没出现什么问题,今天老是提示错误,提示操作类型不正确,明明是逻辑型啊,打开表也没发现坏,真的不知道怎么排查了

[此贴子已经被作者于2021-7-7 15:52编辑过]

41 回复
#2
sdta2021-07-07 16:10
CLEAR
CREATE CURSOR yinglijilu (fangan1 L, fangan2 L, fangan3 L, item1 c(5), end_time c(8))
INSERT INTO yinglijilu VALUES (.T., .F., .T., "12345", "01:02:03")
INSERT INTO yinglijilu VALUES (.T., .F., .T., "23456", "02:03:04")
INSERT INTO yinglijilu VALUES (.T., .T., .F., "54321", "03:02:01")
FOR i_zdxx=1 TO 3
    iic=ALLTRIM(STR(i_zdxx))
    zdxx&iic=""
    SELECT yinglijilu
    GO TOP
    Do WHILE EOF()=.F.
        IF fangan&iic=.T. && 发生错误的行
            zdxx&iic=Substr(Item1,3,2)+'-'+Left(Allt(end_time),5)+':'+Chr(13)+zdxx&iic
        ENDIF
        SKIP
    ENDDO
ENDFOR
?ZDXX3

模拟代码没有问题,可能是表yinglijilu中fangan1-fangan3字段类型问题
#3
琅拿度2021-07-07 16:21
以下是引用sdta在2021-7-7 16:10:52的发言:

CLEAR
CREATE CURSOR yinglijilu (fangan1 L, fangan2 L, fangan3 L, item1 c(5), end_time c(8))
INSERT INTO yinglijilu VALUES (.T., .F., .T., "12345", "01:02:03")
INSERT INTO yinglijilu VALUES (.T., .F., .T., "23456", "02:03:04")
INSERT INTO yinglijilu VALUES (.T., .T., .F., "54321", "03:02:01")
FOR i_zdxx=1 TO 3
    iic=ALLTRIM(STR(i_zdxx))
    zdxx&iic=""
    SELECT yinglijilu
    GO TOP
    Do WHILE EOF()=.F.
        IF fangan&iic=.T. && 发生错误的行
            zdxx&iic=Substr(Item1,3,2)+'-'+Left(Allt(end_time),5)+':'+Chr(13)+zdxx&iic
        ENDIF
        SKIP
    ENDDO
ENDFOR
?ZDXX3

模拟代码没有问题,可能是表yinglijilu中fangan1-fangan3字段类型问题


我这里提示的的:命令中含有不能识别的短语或关键字
#4
mywisdom882021-07-07 17:56
VFP版本多少
#5
琅拿度2021-07-07 18:33
以下是引用mywisdom88在2021-7-7 17:56:46的发言:

VFP版本多少


9.0 sp2
#6
琅拿度2021-07-07 18:36
以下是引用琅拿度在2021-7-7 16:21:54的发言:



我这里提示的的:命令中含有不能识别的短语或关键字



                Sele yinglijilu
                Go Top
                Do While Eof()=.F.
                    Sele yinglijilu
                    If fangan&izdc=.T. && 就是这行出错
                        i_zdsl=i_zdsl+1
                    Endi
                    Skip
                Enddo


都改成这样了,都提示出错,提示:命令中含有不能识别的短语或关键字。明明fangan1~3都是逻辑型,感觉智商被践踏啊。。。。。
#7
琅拿度2021-07-07 18:37
宏替换也改成唯一名称了,都不行
#8
琅拿度2021-07-07 18:53
                Sele yinglijilu
                Go Top
                Do While Eof()=.F.
                    Sele yinglijilu
                    If fangan1=.T. && fangan2也行,fangan3也行,不用宏替换就没问题
                        i_zdsl=i_zdsl+1
                    Endi
                    Skip
                Enddo


天啊,我的宏替换到处都用了,但怎么就这一小段提示出错? 以前一直也怎样用的啊???

我的宏替换
i_zdxx=1 To 3
izdc=Allt(Str(i_zdxx))
#9
xuminxz2021-07-07 18:53
把你的表放上来,是不是有.null.。用调试器看看相关变量的值。
#10
琅拿度2021-07-07 18:54
真的不知道问题在哪里了
#11
琅拿度2021-07-07 18:56
以下是引用xuminxz在2021-7-7 18:53:53的发言:

把你的表放上来,是不是有.null.。用调试器看看相关变量的值。


fangan1里是没值的,但默认就是 .f.嘛

我直接写 If fangan1=.T. 这样也不会提示错误啊
#12
琅拿度2021-07-07 19:07
以下是引用xuminxz在2021-7-7 18:53:53的发言:

把你的表放上来,是不是有.null.。用调试器看看相关变量的值。


只有本站会员才能查看附件,请 登录
#13
xuminxz2021-07-07 19:12
空值不等于.f.
#14
sdta2021-07-07 19:19
以下是引用琅拿度在2021-7-7 19:07:28的发言:

表中缺少ITEM及END_TIME字段
#15
sdta2021-07-07 19:24
用12楼的数据测试没有问题
卸载VFP,重新安装试试
#16
sdta2021-07-07 19:26
代码中的空格是不是有非半角空格,上传PRG程序
#17
xuminxz2021-07-07 19:27
这一段代码没有问题
#18
琅拿度2021-07-07 19:28
以下是引用sdta在2021-7-7 19:19:13的发言:


表中缺少ITEM及END_TIME字段

内容太多,我只是简化传上来,不会是其它字段的问题的

目前使用:

 if Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))

这样代替宏替换,就没有问题,真的搞不懂了
#19
sdta2021-07-07 19:28
以下是引用琅拿度在2021-7-7 18:36:25的发言:




                Sele yinglijilu
                Go Top
                Do While Eof()=.F.
                    Sele yinglijilu
                    If fangan&izdc=.T. && 就是这行出错  这行不出错就不正常了
                        i_zdsl=i_zdsl+1
                    Endi
                    Skip
                Enddo


都改成这样了,都提示出错,提示:命令中含有不能识别的短语或关键字。明明fangan1~3都是逻辑型,感觉智商被践踏啊。。。。。

#20
琅拿度2021-07-07 19:30
以下是引用sdta在2021-7-7 19:26:43的发言:

代码中的空格是不是有非半角空格,上传PRG程序


出错的就只有那个判断条件那句话,改成Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))就好了,就不知道宏替换那里错了,都用英文重打n次了,都一样,只能改iif就没问题
#21
xuminxz2021-07-07 19:35
你传上来的我运行了没有错。有3种可能。
#22
琅拿度2021-07-07 19:35
以下是引用xuminxz在2021-7-7 19:12:51的发言:

空值不等于.f.


逻辑字段,没有值的话,就是 .f.啊
#23
sdta2021-07-07 19:36
试试这样行不行(我的电脑上可以)
FOR i_zdxx=1 TO 3
    iic=ALLTRIM(STR(i_zdxx))
    zdxx&iic=""
    iic1="fangan" + ALLTRIM(STR(i_zdxx))
    SELECT yinglijilu
    GO TOP
    Do WHILE EOF()=.F.
        IF &iic1=.T.
            zdxx&iic=Substr(Item1,3,2)+'-'+Left(Allt(end_time),5)+':'+Chr(13)+zdxx&iic
        ENDIF
        SKIP
    ENDDO
ENDFOR

[此贴子已经被作者于2021-7-7 19:43编辑过]

#24
xuminxz2021-07-07 19:38
Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))

If fangan&izdc=.T. && 就是这行出错  这行不出错就不正常了
                        i_zdsl=i_zdsl+1
                    Endi
作用不一样
Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))
中没有对fangan1的值判断,只是赋值。
#25
xuminxz2021-07-07 19:41
用调试器看看吧。
#26
琅拿度2021-07-07 19:46
以下是引用xuminxz在2021-7-7 19:38:42的发言:

Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))

If fangan&izdc=.T. && 就是这行出错  这行不出错就不正常了
                        i_zdsl=i_zdsl+1
                    Endi
作用不一样
Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))
中没有对fangan1的值判断,只是赋值。


前面有个“if”  只是生成条件,不是要写入表里
#27
sdta2021-07-07 19:54
试试这样行不行(我的电脑上可以)
IF EVALUATE("fangan" + iic)=.T.
    ........
ENDIF
#28
xuminxz2021-07-07 19:56
If fangan&izdc=.T. 是根据fangan&izdc决定转向
Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))
是根据i_zdxx的值决定执行什么。
#29
琅拿度2021-07-07 20:31
以下是引用xuminxz在2021-7-7 19:56:21的发言:

If fangan&izdc=.T. 是根据fangan&izdc决定转向
Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))
是根据i_zdxx的值决定执行什么。


是 if Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))
#30
琅拿度2021-07-07 20:36
以下是引用sdta在2021-7-7 19:54:38的发言:

试试这样行不行(我的电脑上可以)
IF EVALUATE("fangan" + iic)=.T.
    ........
ENDIF


这个错误的诡异之处在于,同样的写法,上面 if 这行会出错,下面同样的写法 for 没有出错

        For i_zdxx=1 To 5
            izdc=Allt(Str(i_zdxx))
            Sele yinglijilu  && 盈利记录
            Go Top
            Do While Eof()=.F. And i_zdsl<=10
                Sele yinglijilu
                If Iif(i_zdxx=1,fangan1=.T.,Iif(i_zdxx=2,fangan2=.T.,Iif(i_zdxx=3,fangan3=.T.,Iif(i_zdxx=4,fangan4=.T.,fangan5=.T.))))&& 这里如果用 if fangan&izdc=.T.就出错
                    i_zdsl=i_zdsl+1
                Endi
                Skip
            Enddo
            Sum zzc&izdc To sum_zzc   For fangan&izdc=.T.  && 这里同样用了这个fangan&izdc=.T.宏代换,却不会出错
            Sum zsr&izdc To sum_zsr   For fangan&izdc=.T.  && 这里同样用了这个fangan&izdc=.T.宏代换,却不会出错
#31
琅拿度2021-07-07 20:37
真的费脑子
#32
xuminxz2021-07-07 21:11
回复 30楼 琅拿度
在我这,用 if fangan&izdc一样不出错。
把出错时调试器的截图发上来。

[此贴子已经被作者于2021-7-7 21:15编辑过]

#33
吹水佬2021-07-07 21:28
可能运行库乱了,有无安装使用过其他版本
#34
琅拿度2021-07-07 21:39
以下是引用吹水佬在2021-7-7 21:28:55的发言:

可能运行库乱了,有无安装使用过其他版本

一直用vfp9 sp2汉化版很久了

现在换一台电脑,重新安装,拷贝过去运行也是这样的错误,真的服了
#35
琅拿度2021-07-07 22:07
现在的解决办法是:

把这段代表,拷贝到一个表单的新建方法程序里面去,用的时候调用,一模一样的代码,在新地方不会出错。变量名也没有冲突的,不知为何老是出错。
#36
laowan0012021-07-08 08:09
这种情况可能是数据的问题,messagebox(zdxx&iic),看看是什么内容吧

#37
laowan0012021-07-08 08:10
iic=Allt(Str(i_zdxx))
把上面这句话换成下面的试试,其他语句不变
iic=transform(i_zdxx)
#38
radiofan2021-07-08 08:48
结果呢?
#39
吹水佬2021-07-08 10:11
以下是引用琅拿度在2021-7-7 22:07:44的发言:

现在的解决办法是:

把这段代表,拷贝到一个表单的新建方法程序里面去,用的时候调用,一模一样的代码,在新地方不会出错。变量名也没有冲突的,不知为何老是出错。

同一代码在不同的表单里表现不同,肯定是表单的问题。
把有问题的表单文件(SCX和SCT)放上来看看
#40
琅拿度2021-07-08 17:11
以下是引用吹水佬在2021-7-8 10:11:41的发言:


同一代码在不同的表单里表现不同,肯定是表单的问题。
把有问题的表单文件(SCX和SCT)放上来看看


放的是同一个表单,就是表单里新建一个方法程序,然后把出错的这一段剪切过去,在原来剪切掉的地方执行这个新建的方法程序就没有问题,

就单纯像一个快捷方式而已

另外:原来位置,我也做了实验:包含 if fangan&iic=.t. 的就会报错, 包含 for fangan&iic=.t. 却不会报错,搞得想不通
#41
wystone12021-08-11 16:30
IF fangan&iic=.T.

是否为  IF fangan&iic= =.T.
#42
whinda2021-08-12 19:55
把你目录中同名的已编译程序.fxp删掉就可以了。
1