注册 登录
编程论坛 VFP论坛

求给个思路!

dragonman19 发布于 2021-11-11 14:50, 3115 次点击
我开发了一个办公室用品查询系统,筛选项如下图:
只有本站会员才能查看附件,请 登录


  代码如下:
 SELECT * FROM ch WHERE zt<1 and;
zcname LIKE ("%"+ALLTRIM()+"%") AND;
  syzt LIKE ("%"+ALLTRIM()+"%") AND ;         
   glbm LIKE ("%"+ALLTRIM()+"%") AND ;
     syr LIKE ("%"+ALLTRIM()+"%");
                                           into dbf temp         
现在用户说,想同时筛选多项资产名称,我想做个LIST,但是筛选项的数目不确定,那SQL该如何写?
而且用户需要的是“或”的查循结果,就是,比如要查询资产名称为“电脑”和“办公桌”,查询出的表中应该有这二项。
18 回复
#2
mywisdom882021-11-11 16:08
cmb1 = ALLTRIM(
cmb2 = ALLTRIM(
cmb3 = ALLTRIM(
cmb4 = ALLTRIM(
cwh = ""
if !empty(cmb1)
   cwh = cwh + iif(!empty(cwh)," and syr LIKE ('%'+cmb1+'%')"," syr LIKE ('%'+cmb1+'%')")
endif
if !empty(cmb2)
   cwh = cwh + iif(!empty(cwh)," and zcname LIKE ('%'+cmb2+'%')"," zcname LIKE ('%'+cmb2+'%')")
endif

if !empty(cmb3)
   cwh = cwh + iif(!empty(cwh)," and syzt LIKE ('%'+cmb3+'%')"," syzt LIKE ('%'+cmb3+'%')")
endif
if !empty(cmb4)
   cwh = cwh + iif(!empty(cwh)," and glbm LIKE ('%'+cmb4+'%')"," glbm LIKE ('%'+cmb4+'%')")
endif
if !empty(cwh)
    SELECT * FROM ch WHERE zt<1 and (cwh) && 或者 SELECT * FROM ch WHERE zt<1 and &cwh
else
    SELECT * FROM ch WHERE zt<1
endif
*没测试,你自己测试一下


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

#3
xuminxz2021-11-11 19:15
回复 楼主 dragonman19
你自己已经给出思路了
list是选中的数据,依此生成4个单字段表。
tmp1-zcname
tmp2-####
……………………
select * from ch  into cursor chtmp where zcname in (select zcname from tmp1) or syzt in (select syzt from tmp2) ………………
具体看你的 list准备如何建立。它有很多建立方式以资产项目为例:
1、建立两个list,一侧是未选中的,一侧是选中的。
2、在List上方,加一个Text,录入模糊查找
3、保留你的combox,选择项目加入下方的List
你想用哪种?

[此贴子已经被作者于2021-11-12 07:09编辑过]

#4
mywisdom882021-11-11 20:27
* 接上,还可以这样
cmb1 = ALLTRIM()
cmb2 = ALLTRIM()
cmb3 = ALLTRIM()
cmb4 = ALLTRIM()
cwh = ""
if !empty(cmb1)
   cwh = cwh + iif(!empty(cwh)," and syr LIKE ('%'+cmb1+'%')"," syr LIKE ('%'+cmb1+'%')")
endif
if !empty(cmb2)
   cwh = cwh + iif(!empty(cwh)," and zcname LIKE ('%'+cmb2+'%')"," zcname LIKE ('%'+cmb2+'%')")
endif

if !empty(cmb3)
   cwh = cwh + iif(!empty(cwh)," and syzt LIKE ('%'+cmb3+'%')"," syzt LIKE ('%'+cmb3+'%')")
endif
if !empty(cmb4)
   cwh = cwh + iif(!empty(cwh)," and glbm LIKE ('%'+cmb4+'%')"," glbm LIKE ('%'+cmb4+'%')")
endif
if !empty(cwh)
 text to str1 textmerge noshow pretext 4
 SELECT * FROM ch WHERE zt<1 and ;
 <<cwh>> ;
 order by ... ;
 into ... ;
 endtext
 else
 text to str1 textmerge noshow pretext 4
  SELECT * FROM ch WHERE zt<1 ;
  order by ... ;
  into ... ;
 endtext
endif
execscript(str1) && 执行多行VFP命名


[此贴子已经被作者于2021-11-11 20:29编辑过]

#5
laowan0012021-11-12 08:07
我理解楼主的意思是某个选项需要有多个可选内容,如:资产名称为“电脑”或“办公桌”,单独对各个LIST做加工可能还不能满足需求
如果我理解的对的话,应该由用户进行多次选择,记录下每次的选择内容,并且指定联结关系,如:或、并且、不等于,然后再组合出查询语句

[此贴子已经被作者于2021-11-12 08:26编辑过]

#6
mywisdom882021-11-12 08:45
金蝶就有这个,自定义查询
根据条件,查询,但也是利用3,4楼的方法,先拼接查询语句,然后再运行execscript(),但这个拼接会复杂一些。
#7
wcx_cc2021-11-15 02:52
楼主的问题,单纯用 combo,或 list,直接查询恐怕难完成,因为1次只能选取1个值.这些值必须要汇集,构成多值的查询条件才能一次性查询.如果我做的话,
可能考虑使用 grid 打勾.
#8
dragonman192021-11-16 13:48
感谢楼上各位指点
#9
xuminxz2021-11-16 17:01
只有本站会员才能查看附件,请 登录

根据个人习惯,用列表框或表格都可以。如果是单纯的选择,我更习惯用列表框。这是我做的一个报名系统,由于右边的数据不全来自库,所以用了表格;如果参赛学校都来自库表中,用列表框代码更简单。
#10
chansnsn2021-11-28 10:07
我一般用一个过滤表单来选择过滤条件
只有本站会员才能查看附件,请 登录
#11
厨师王德榜2021-11-29 14:13
如果要实现多选的话,你可能需要这样的一个自制控件: 支持多选的组合框
使用效果如图:
只有本站会员才能查看附件,请 登录

类中的代码还不完善,只是中午抽时间给你做了一个示范,你可以在这个框架下,继续完善类中的代码.
按自定义类这个思路,应该可以解决你的问题.

[此贴子已经被作者于2021-11-29 14:57编辑过]

#12
厨师王德榜2021-11-29 14:16
自定义类,源代码如下,你可以继续完善它:
只有本站会员才能查看附件,请 登录



[此贴子已经被作者于2021-11-29 14:59编辑过]

#13
kangss2021-12-08 13:42
回复 楼主 dragonman19
只有本站会员才能查看附件,请 登录

这个思路你看一下

条件随便添加,需要把表格里面的内容转换成 where 语句即可。

[此贴子已经被作者于2021-12-8 13:44编辑过]

#14
厨师王德榜2021-12-10 09:20
看看这个是不是你想要的效果:
只有本站会员才能查看附件,请 登录
#15
schtg2021-12-11 05:30
回复 14楼 厨师王德榜
高!
#16
sqlren2021-12-29 15:40
xuexi 学习
#17
laowan0012021-12-29 16:01
牛啊
#18
aqyejun2021-12-30 09:11
查询思路值得学习!
#19
dragonman192022-02-16 11:12
谢谢@厨师王德榜,太牛了!
1