回 帖 发 新 帖 刷新版面

主题:日期查询问题

高手,你好,我设计一个表单上面有三个文本框,分别输入编号,查询起始日期和查询终止日期,要从表中查找符合条件的记录,我的代码如下,select * from b where b.编号=thisform.text1.value and b.办理日期>=ctod(thisform.text2.text)and b.办理日期<ctod(thisform.text3.text),现在问题是,结果出来是编号符合要求的记录,后面日期那一条不起作用,查不出符合日期条件的记录,请问我的代码错那儿了,谢谢了。

回复列表 (共9个回复)

沙发

如果没有提示错误,只是查不出来,有可能是查询字符串中的空格影响,加上ALLTRIM()试试。

板凳

thisform.text2.value、thisform.text3.value定义为日期型 (初始值设为{})
条件表达式:
...between(b.办理日期,thisform.text2.value,thisform.text3.value)

3 楼

楼上的二位,二位的方法我都试用过了,现在才发现,是后面的条件语句完全不起作用,编号输入得不对,也能把所有记录选择出来,为什么会这样呢,我错到那儿了?请指点。

4 楼

1、既然你用字符来显示日期,那么你的ctod(thisform.text3.text)应该改为ctod( alltrim( thisform.text3.value)),注意是value,不是text。
2、一般在sql语句中,应提前把变量写好,否则影响速度。参考如下:
loacl gcid, gnupdate, gndndate
gcid = alltrim( thisform.text1.value) 
gnupdate = ctod( alltrim( thisform.text2.value))
gndndate = ctod( alltrim( thisform.text3.value))
select * from b where b.编号 == gcid and BETWEEN( b.办理日期, gtuptime, gtdntime)

5 楼


楼上的,你好,谢谢帮忙,可是现在问题是一个记录也选不出来了,我的表单查询按钮的CLICK事件代码如下:
thisform.text1.readonly=.f.
thisform.text2.readonly=.f.
thisform.text3.readonly=.f.
thisform.text1.value=""
thisform.text2.value=""
thisform.text3.value=""
thisform.text1.setfocus
local gcid,gnupdate,gndndate
gcid=alltr(thisform.text1.value)
.....
....
thisform.grid2.columncount=4
thisform.grid2.recordsourcetype=4
thisform.grid2.recordsource=""
thisform.grid2.recordsource="这里是你给我的SELECT语句“
thisform.grid2.refresh
thisform.refresh
表中明明有符合条件的记录,可就是一个记录也选择不出来?郁闷!!!
对了还有为什么我的查询按钮只可以用一次,再查得把表单关了,再开?郁闷极了!!!SOS!!

6 楼

[color=0000FF][b]gcid=alltr(thisform.text1.value)[/b][/color]
在这行设置断点,用调试器看一看 gcid 的值,再单步运行,看一看其它变量的值是否正确,查看一下 sele 语句是否有问题。用这个方法很容易找到问题的根源所在。
值得一提的是,在这个语句之前,你已经把三个文本框清空了。

7 楼

首先,我不明白你这段代码是什么作用:
thisform.text1.readonly=.f.
thisform.text2.readonly=.f.
thisform.text3.readonly=.f.
thisform.text1.value=""
thisform.text2.value=""
thisform.text3.value=""
thisform.text1.setfocus
如果是为了查询后自动清除文本框中的数据,你应该将它们放在thisform.refresh前,而不是click事件前面。就像楼上所说的,你的数据已经清空了,后面的查询就根本没有效果。

其次,我不知道你grid2的表是个什么表,是数据环境中的表还是个临时表。现在假设你的表名叫archi
如果是数据环境中的表,你可以使用 SET FILTER TO b.编号 == gcid and BETWEEN( b.办理日期, gtuptime, gtdntime)
而如果是临时表,你可以用select * from b where b.编号 == gcid and BETWEEN( b.办理日期, gtuptime, gtdntime) into cursor archi
这样都可以实现你需要的功能。没有必要再设置你的表格属性了。我个人比较喜欢使用临时表,这样可以防止误操作。

再次,建议你将控制控件属性的代码放在表单单独的方法中,你可以在系统“菜单”中选择“表单”-“新建方法程序”来新建一个方法,如新建方法叫 set_txt,将你的thisform.text1.setfocus和它前面的代码放在该方法中,你在查询代码中需要使用的话,可以这样引用:thisform.set_txt()
这样便于整体维护,提高代码的可读性、可写性、可靠性及可维护性。

最后,建议你不要想着一次性解决问题,而是要把问题细化分解,分解成几个小功能,然后分别解决。
就像你在5楼帖出来的代码,就可以分解成3个部分:1、文本框的控制 2、查询控制 3、页面刷新。你可以分别在不同的按钮中试验一下,如果成功了再放到一起,尽量不要一开始就把代码写在一起。

至于你查询按钮只可以用一次的问题,你没有表述清楚,是按钮不可用还是再次点击没有效果。查一下是不是其他语句对该按钮进行了操作。

8 楼


楼上大侠,万分感激帮忙,我把你讲的代码放后面以后,可以了,按钮只可以用一次是,因为我没设按钮的ENABLE现在也好了,就是为什么选择出来的记录只能显示第一条,后面的显示不出来?还有就是SET FILTER TO 命令怎么用,可以把完整代码给下吗?我实在太菜,自学了VFP,麻烦处,抱歉!

9 楼

1、只能显示第一条?你怎么判断出只是第一条的?拉动表格右侧的上下进度尺也没有显示其他数据么?注意:between()的用法,日期小的要放到前面,日期大的在后面。

2、假设你的表格的数据源为archi,你可以在click事件中加入:
select archi
set filter to b.编号 == gcid and BETWEEN( b.办理日期, gtuptime, gtdntime)
thisform.refresh()
关于set filter to 的详细使用,你自己查一下帮助,上面写的很清楚。

我来回复

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