回 帖 发 新 帖 刷新版面

主题:糊模查询

查询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
这样的本意是模糊查询,例如客户姓名中输入“三”,如果客户姓名中有“张三时”、“黄三里”,则都可查到。现在麻烦的是,如果只要其中一个文本框中什么也不输入,则什么也查不到。怎样避免这种情况?

回复列表 (共19个回复)

11 楼

在给个分步查询的方式吧:

SELECT * FROM 客户表 INTO CURSOR temp READWRITE 
xm=alltrim(thisform.text1.value)
IF NOT EMPTY(xm)
   SELECT * FROM temp WHERE 客户姓名 like '%'+xm+'%' INTO CURSOR temp
ENDIF
gd=alltrim(thisform.text2.value)
IF NOT EMPTY(gd)
   SELECT * FROM temp WHERE 高端 like '%'+gd+'%' INTO CURSOR temp
ENDIF
hy=alltrim(thisform.text3.value)
IF NOT EMPTY(hy)
   SELECT * FROM temp WHERE 行业 like '%'+hy+'%' INTO CURSOR temp
ENDIF
dh=alltrim(thisform.text4.value)
IF NOT EMPTY(dh)
   SELECT * FROM temp WHERE 电话 like '%'+dh+'%' INTO CURSOR temp
ENDIF
sj=alltrim(thisform.text5.value)
IF NOT EMPTY(sj)
   SELECT * FROM temp WHERE 手机 like '%'+sj+'%' INTO CURSOR temp
ENDIF
hd=alltrim(thisform.text6.value)
IF NOT EMPTY(hd)
   SELECT * FROM temp WHERE 走访活动 like '%'+hd+'%' INTO CURSOR temp
ENDIF
dz=alltrim(thisform.text7.value)
IF NOT EMPTY(dz)
   SELECT * FROM temp WHERE 客户地址 like '%'+dz+'%' INTO CURSOR temp
ENDIF
thisform.grid1.recordsource="temp"
thisform.refresh

注意grid1的recordsourcetype始终保持1,言下之意,属性窗口中grid1的recordsourcetype为1,不用再在代码中设置。

12 楼

回上楼,是我打错了,原来的语名是
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%'));
noconsole into  cursor temp"
多了noconsole就提示“命令中含有不能识别的短语或关键字”。
而thisform.grid1.recordsource="select * from 客户表.dbf where (客户表.客户姓名 like '%&xm%') noconsole into cursor temp"则不出错。
想不到少了个noconsole又可以了,害我绕了个弯。

13 楼

1楼的wherestr = iif(right(wherestr,4) = 'and ',left(wherestr,n-4))不知怎改,
还有上面的noconsole为什么出错,谁答出了这两个问题,再给分。

14 楼

搞个Temp 到 Temp,看花眼睛了.

15 楼

表格查询出来的日期显示格式为月日年,如12/31/09,打印预览中也是这样(是从临时表来的)。
要想显示为年月日2009/12/31这种格式,可以加上这两条语句:
set century on
set date to ymd
在表的工具--选项--区域,设日期格式反而不行。

16 楼

Vii理解错了吧?难道不是AND连接每个条件吗?

你要
[quote]比如客户名称为:AAA 或者 地址为 广东 的同时出来.就出不来了.[/quote]

那岂不成了OR连接了。

17 楼

问题的关键就是:

逻辑运算符用错了!

应当用“OR”,而不应当用“AND”

模糊查询表述出来就是:“或者”、“只要”满足一定的条件,而“AND”表述的是:“必须”、“并且”

18 楼

楼主是好样的,本人很赞赏!
一楼贴子的问题在于iif(条件,值1,值2)没用对,缺了"值2",写成下列句子就对了.
wherestr = iif(right(wherestr,4) = 'and ',left(wherestr,n-4),wherestr)
但我认为楼主在三楼的贴子更简捷!因为是单表查询,如果将句子中的"客户表."去掉则会更简捷!
我的句子是为了给以后编写更一般的,针对任意表的模糊查询表单做准备的.
换句话说,楼主现已具备编写一个针对当前工作区中任意表的模糊查询表单.

19 楼

如何避免在其中一个文本框中没有输入还可以查到相应的数据,前面大家都说的很好,另种思路。

查询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)

**建立一个数组,如果文本框为空就保存一个'!'(不等于),然后加在查询语句中。如:如果 hd=alltrim(thisform.text6.value)没输入,kk(6)='!',查询语句中成了:and !hd$走访活动。 
(查找走访字段中为空的记录,由于你在表中都输入内容,所以,没有符合条件,将显示走访全部)
for i=1 to 7
local kk(7)
dd='text'+allt(str(i))
if empty(alltrim(thisform.&dd..value))
kk(i)='!'
else
kk(i)=''
endif
endfor
select * from 客户表.dbf where &kk(1) xm$客户表.客户姓名 and &kk(2) gd$客户表.高端 and &kk(3) hy$客户表.行业 and &kk(4) dh$客户表.电话 and &kk(5) sj$客户表.手机 and &kk(6) hd$客户表.走访活动 and &kk(7) dz$客户表.客户地址 into dbf temp

我来回复

您尚未登录,请登录后再回复。点此登录或注册