注册 登录
编程论坛 VFP论坛

麻烦请问代码问题出在哪?

dragonman19 发布于 2024-05-31 15:15, 333 次点击
我做了一个LIST见下图


只有本站会员才能查看附件,请 登录
  
 图片看不到的话,其实就是数据表里有几十种资产名称,用户就通过LIST选择需要筛选的资产名称,获得所需要的数据表

筛选命令框代码:
   PUBLIC cwh
thisform.grid1.RecordSource=""

LOCAL  cmb(999)
cwh=" "



tjshu=thisform.list6.ListCount
cwh ="zcname like('%'+ALLTRIM(thisform.list6.list(1))+'%')"
IF  tjshu >1
   
     FOR i= 2 TO tjshu


   cmb(i)=ALLTRIM(thisform.list6.list(i))

  cwh="  "+cwh+"  "+"  or  "+" zcname like('%'+ cmb(i)+'%')"


next

ELSE





endif

 SELECT * FROM ch WHERE  cwh   into dbf temptemp    &&&&&执行到这行报错,---"SQL:WHERE字句无效"
 
  请问哪里有问题呢?
7 回复
#2
csyx2024-05-31 16:10
先 messagebox(cwh) 看看过滤条件有没有语法错误
cwh 没问题的话: SELECT * FROM ch WHERE  &cwh   into dbf temptemp
#3
dragonman192024-05-31 16:26
如果这样的话--- SELECT * FROM ch WHERE  &cwh   into dbf temptemp
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


cwh 的值
只有本站会员才能查看附件,请 登录
#4
csyx2024-05-31 16:58
zcname like('%'+ALLTRIM(thisform.list6.list (1)+'%') or zoname like('%'+ cmb(i)+ '%') or zcname like('%'+ cmb(i) + '%')
这是最后的 cwh ? 这作为筛选条件也太离谱了吧

你要组合出来的 cwh 应该是这样
(zcname like '%更衣柜%') or (zcname like '%双节柜抽屉%') or (zcname like '%台式机%') or ...
最后再
SELECT * FROM ch WHERE  (&cwh) into dbf temptemp

[此贴子已经被作者于2024-5-31 17:01编辑过]

#5
csyx2024-05-31 17:07
按照你前面组合出 cwh 的方案,怎么着也该大概是这样

cwh = "(zcname like '%" + ALLTRIM(thisform.list6.list(1)) + "%')"
IF  tjshu >1
     FOR i= 2 TO tjshu
        cmb(i) = ALLTRIM(thisform.list6.list(i))
        cwh = cwh + " or (zcname like '%" + cmb(i) + "%')"
     next

随便瞅瞅就知道这种方案还有其他漏洞,例如,一个都没选的情况

[此贴子已经被作者于2024-5-31 17:12编辑过]

#6
csyx2024-05-31 17:35
最好习惯使用 textmerge 文本合并语句或函数,查错就容易多了

tjshu = thisform.list6.ListCount
If tjshu < 1
    MessageBox('没有选择要查询什么', 16)
Else
    cwh = ''
    For i = 1 to thisform.list6.ListCount
        cmb(i) = ALLTRIM(thisform.list6.list(i))
        cwh = cwh + Textmerge(" or (zcname like '%<<cmb(i)>>%')")
    Next
    cwh = Substr(cwh, 5)
    SELECT * FROM ch WHERE (&cwh) into dbf temptemp
    。。。
EndIf

单个条件复杂时用 textmerge 语句方式更容易看出毛病在哪(特别是条件中可能同时存在 ' " [] 这些符号时),例如:
    cwh = ''
    For i = 1 to thisform.list6.ListCount
        cmb(i) = ALLTRIM(thisform.list6.list(i))
        Text to cc Noshow textmerge pretext 1+2+4+8
            or (zcname like '%<<cmb(i)>>%')
            or (1 == 0)
            。。。以及其他可能的条件,每行写一个条件都行
        EndText
        cwh = cwh + ' ' + cc
    Next
    cwh = Substr(cwh, 5)
    。。。



[此贴子已经被作者于2024-5-31 17:54编辑过]

#7
dragonman192024-06-03 11:21
感谢楼上,代码通过了。
  汗颜自己用了这么多年,还是三脚猫
#8
laowan0012024-06-03 15:50
VFP的&是其他语言所不具备的,具有超级的灵活性和适应性,但是如果用不好,也会让人抓狂的。
建议组合SQL时可以一部分一部分加到变量里,尽量提高程序的可读性,查错也会比较方便,否则以后看程序都可以看不懂了
慢慢练吧,会好的
1