主题:糊模查询
hrduan268
[专家分:0] 发布于 2009-10-13 15:41:00
查询click:
xm=alltrim(thisform.text1.value)
gd=alltrim(thisform.text2.value)
hy=alltrim(thisform.text3.value)
dh=alltrim(thisform.text4.value)
sj=alltrim(thisform.text5.value)
hd=alltrim(thisform.text6.value)
dz=alltrim(thisform.text7.value)
select * from 客户表.dbf where xm$客户表.客户姓名 and gd$客户表.高端 and hy$客户表.行业 and dh$客户表.电话 and sj$客户表.手机 and hd$客户表.走访活动 and dz$客户表.客户地址 into dbf temp
这样的本意是模糊查询,例如客户姓名中输入“三”,如果客户姓名中有“张三时”、“黄三里”,则都可查到。现在麻烦的是,如果只要其中一个文本框中什么也不输入,则什么也查不到。怎样避免这种情况?
最后更新于:2009-10-14 11:43:00
回复列表 (共19个回复)
沙发
jinlonggao [专家分:17130] 发布于 2009-10-13 16:39:00
查询click:
xm=alltrim(thisform.text1.value)
xm = iif(empty(xm),'','xm$客户表.客户姓名 and ')
gd=alltrim(thisform.text2.value)
gd = iif(empty(gd),'','gd$客户表.高端 and ')
hy=alltrim(thisform.text3.value)
hy = iif(empty(hy),'','hy$客户表.行业 and ')
dh=alltrim(thisform.text4.value)
dh = iif(empty(dh),'','dh$客户表.电话 and ')
sj=alltrim(thisform.text5.value)
sj = iif(empty(sj),'','sj$客户表.手机 and ')
hd=alltrim(thisform.text6.value)
hd = iif(empty(hd),'','hd$客户表.走访活动 and ')
dz=alltrim(thisform.text7.value)
dz = iif(empty(dz),'','dz$客户表.客户地址')
wherestr = xm + gd + hy + dh + sj + hd + dz
n = len(wherestr)
wherestr = iif(right(wherestr,4) = 'and ',left(wherestr,n-4))
select * from 客户表 where &wherestr into dbf temp
请试一下吧,本人没有测试.如果满意,别忘了给加分.
板凳
Vii [专家分:1130] 发布于 2009-10-13 17:29:00
1.条件:WHERE 客户表.客户姓名 LIKE '%三%' AND 客户表.高端 LIKE '%%'...
2.还可以参考这样一种条件方式:
where (xm$客户表.客户姓名 or xm='') and (gd$客户表.高端 or gd='') ...
有数据显示条件数据,没有条件则显示全部.
3 楼
hrduan268 [专家分:0] 发布于 2009-10-14 10:34:00
下面语句可以:
select * from 客户表 where((客户表.客户姓名 like '%&xm%');
and (客户表.高端 like '%&gd%') and (客户表.行业 like '%&hy%');
and (客户表.电话 like '%&dh%') and (客户表.手机 like '%&sj%');
and (客户表.走访活动 like '%&hd%') and (客户表.客户地址 like '%&dz%'));
into dbf temp
注意由于xm是变量,所以前面一定要加&。
而用where (xm$客户表.客户姓名 or xm='') and (gd$客户表.高端 or gd='') ...则不行。
1楼的wherestr = iif(right(wherestr,4) = 'and ',left(wherestr,n-4))有误,不知怎么改。
现在又有两个问题出现了。。。下楼分讲
4 楼
hrduan268 [专家分:0] 发布于 2009-10-14 10:59:00
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource="select * from 客户表.dbf where (客户表.客户姓名 like '%&xm%') noconsole into cursor temp"
没有问题。
但是用
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource=;
"select * from 客户表 where((客户表.客户姓名 like '%&xm%');
and (客户表.高端 like '%&gd%') and (客户表.行业 like '%&hy%');
and (客户表.电话 like '%&dh%') and (客户表.手机 like '%&sj%');
and (客户表.走访活动 like '%&hd%') and (客户表.客户地址 like '%&dz%'));
into cursor temp"
就出错。不知怎改。
想了一下,如果先thisform.grid1.recordsourcetype=0,select ... into dbf temp,再thisform.grid1.recordsource="temp'表格可显示内容,但第二次查询,则总是提示是否覆盖原文件。有什么办法不提示,还有退出时应把temp删除。
上传附件给大家看,只需针对“修改删除”表单,其它不必理会。还有一个问题。。。
5 楼
hrduan268 [专家分:0] 发布于 2009-10-14 11:04:00
加上“走访日期”查又该怎么办呀,我知道要用between ...and ...,是不是要用两个文本框,怎么整合到上面语句中去,即要什么也不输入时显示全部。
附件已上传。
6 楼
hrduan268 [专家分:0] 发布于 2009-10-14 20:28:00
走访日期可用两个文本框实现,一个开始日期,一个结束日期,设它们的value值为{},可以限定输入日期型数据。默认是年份在后的,如果把它设成2009-12-11这种年月日的格式,不知又应怎样设。
上面的两个问题还要继续探索。
7 楼
hrduan268 [专家分:0] 发布于 2009-10-14 20:46:00
日期:text8.value={},text8.dateformat=12 年月日
text9.value={},text9.dateformat=12 年月日
这样设置可以了。
再顶,还剩两个问题未解决。还觉得用13 短格式好。
8 楼
hrduan268 [专家分:0] 发布于 2009-10-15 08:43:00
用分支结构,用{}判断日期是否为空:
set exac off
close all
thisform.exportexcel.enabled=.T.
thisform.printview.enabled=.T.
delete file temp.dbf &&每次查询前先删除上次查询留下的temp
xm=alltrim(thisform.text1.value)
gd=alltrim(thisform.text2.value)
hy=alltrim(thisform.text3.value)
dh=alltrim(thisform.text4.value)
sj=alltrim(thisform.text5.value)
hd=alltrim(thisform.text6.value)
dz=alltrim(thisform.text7.value)
rq1=thisform.text8.value
rq2=thisform.text9.value
if rq1={} or rq2={} &&如果其中一个日期为空
select * from 客户表 where;
((客户表.客户姓名 like '%&xm%') and (客户表.高端 like '%&gd%');
and (客户表.行业 like '%&hy%') and (客户表.电话 like '%&dh%');
and (客户表.手机 like '%&sj%') and (客户表.走访活动 like '%&hd%');
and (客户表.客户地址 like '%&dz%'));
into dbf temp
else
select * from 客户表 where;
((客户表.客户姓名 like '%&xm%') and (客户表.高端 like '%&gd%');
and (客户表.行业 like '%&hy%') and (客户表.电话 like '%&dh%');
and (客户表.手机 like '%&sj%') and (客户表.走访活动 like '%&hd%');
and (客户表.客户地址 like '%&dz%') and (客户表.走访日期 between rq1 and rq2));
into dbf temp
endif
close all
thisform.grid1.recordsourcetype=0
thisform.grid1.recordsource="temp"
thisform.grid1.refresh
thisform.refresh
似乎已解决了,但4楼问题还没弄明白。
怎么都是我自编自演,没人反应呀。
9 楼
Vii [专家分:1130] 发布于 2009-10-15 09:42:00
where 后面要这么多()干什么?
还有每句 ; 前面有没有留空格?
10 楼
Ilikefox [专家分:5770] 发布于 2009-10-15 10:10:00
先说说4楼问题,
[quote]
thisform.grid1.recordsourcetype=4
thisform.grid1.recordsource=;
"select * from 客户表 where((客户表.客户姓名 like '%&xm%');
and (客户表.高端 like '%&gd%') and (客户表.行业 like '%&hy%');
and (客户表.电话 like '%&dh%') and (客户表.手机 like '%&sj%');
and (客户表.走访活动 like '%&hd%') and (客户表.客户地址 like '%&dz%'));
into cursor temp"
[/quote]
这个俺用了无错,不知你是如何出错的,除了什么错?
[quote]想了一下,如果先thisform.grid1.recordsourcetype=0,select ... into dbf temp,再 thisform.grid1.recordsource="temp'表格可显示内容,但第二次查询,则总是提示是否覆盖原文件。有什么办法不提示,还有退出时应把temp删除。[\quote]
[/quote]
这个生成了表文件temp.dbf,第二次查询当然询问是否覆盖,除非SET SAFETY OFF,其实没有必要,还是用cursor吧。
thisform.grid1.recordsourcetype=1
select * from 客户表 where((客户表.客户姓名 like '%&xm%');
and (客户表.高端 like '%&gd%') and (客户表.行业 like '%&hy%');
and (客户表.电话 like '%&dh%') and (客户表.手机 like '%&sj%');
and (客户表.走访活动 like '%&hd%') and (客户表.客户地址 like '%&dz%'));
into cursor temp
[quote]还有退出时应把temp删除[/quote]
form的unload事件中:
if used("temp")
use in temp
endif
我来回复