回 帖 发 新 帖 刷新版面

主题:糊模查询

查询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个回复)

沙发

查询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
请试一下吧,本人没有测试.如果满意,别忘了给加分.

板凳

1.条件:WHERE 客户表.客户姓名 LIKE '%三%' AND 客户表.高端 LIKE '%%'...

2.还可以参考这样一种条件方式:

where (xm$客户表.客户姓名 or xm='') and (gd$客户表.高端 or gd='') ...

有数据显示条件数据,没有条件则显示全部.

3 楼

下面语句可以:
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 楼

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 楼

    加上“走访日期”查又该怎么办呀,我知道要用between ...and ...,是不是要用两个文本框,怎么整合到上面语句中去,即要什么也不输入时显示全部。
    附件已上传。

6 楼

走访日期可用两个文本框实现,一个开始日期,一个结束日期,设它们的value值为{},可以限定输入日期型数据。默认是年份在后的,如果把它设成2009-12-11这种年月日的格式,不知又应怎样设。
    上面的两个问题还要继续探索。

7 楼

日期:text8.value={},text8.dateformat=12 年月日
     text9.value={},text9.dateformat=12 年月日
    这样设置可以了。
    再顶,还剩两个问题未解决。还觉得用13 短格式好。

8 楼

用分支结构,用{}判断日期是否为空:
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 楼

where 后面要这么多()干什么?
还有每句 ; 前面有没有留空格?

10 楼

先说说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

我来回复

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