我有一个从dbf填充的网格。如何根据两个给定日期过滤网格中的数据。我有两个日历控件,一个用于开始日期,另一个用于结束日期。
SET FILTER TO dateRegistration > THISFORM.olecontrol1.oBJECT.VALUE and dateRegistration <= THISFORM.olecontrol1.oBJECT.VALUE
答案 0 :(得分:1)
Boniette, FWIW不在VFP中使用“SET FILTER”命令,如果您仍然这样做,则不要将其与网格一起使用。它的行为是不可预测的,加上与网格一起使用时,你也可能(也会)得到令人讨厌的视觉效果。
相反,如果您的列“过滤开”已编入索引,则可以使用“设置范围”。但更好的是,由于您不太可能使用此网格进行编辑,因此请使用SQL RecordSourceType和SQL来“过滤”您的行。
其次,请注意日期/时间范围选择。您的olecontrol的值是日期时间(包含时间),并且具有日期时间值,无法准确指定结束值。最好将日期时间范围设为&gt; =和&lt;。即:要说明2016年1月的所有记录,你应该有这样的事情:
... where theDateTime >= datetime(2016,1,1) and ;
theDateTime < datetime(2016,2,1)
请注意,此范围从2016年1月1日午夜(含)开始,到2016年2月1日午夜(独家)正确,包括2016年1月以来的所有记录。
第三,看看你的代码,看起来你试图过滤你的记录而不是范围,而dateRegistraion的日期部分是所选择的日期,而不管其中的时间值,对吗?应用上面的规则,那么你的表达式将是:
dateRegistration >= cast(thisform.olecontrol1.object.value as date) and ;
dateRegistration < cast(thisform.olecontrol1.object.value as date)+1
说完这些后,您的网格将设置如下:
With Thisform.MyGrid
.RecordSourceType = 4 && SQL
TEXT to .RecordSource noshow pretext 15
select * from myTable
where dateRegistration >= cast(thisform.olecontrol1.object.value as date) and
dateRegistration < cast(thisform.olecontrol1.object.value as date)+1
order by dateRegistration
into cursor crsData
nofilter
ENDTEXT
Endwith
更改datetimepicker控件中的值时,只需执行此操作即可刷新网格:
with thisform.MyGrid
.RecordSource = .RecordSource
endwith
这是一个完整的工作示例:
Public oForm
oForm = Createobject('SampleForm')
oForm.Show()
Define Class SampleForm As Form
Height=400
Width=600
Add Object oleControl1 As OleControl With ;
Top=10, Left=10, Width = 100, Height = 30, ;
OleClass='MSComCtl2.DtPicker.2'
Add Object myGrid As Grid With ;
top=50, Width=600, Height=350
Procedure Load
* Create sample data
Create Cursor myTable (Id i Autoinc, dateRegistration T)
Rand(-1)
Local ix
For ix = 1 To 10000
Insert Into myTable (dateRegistration) Values ( Datetime() - (Rand()*86400*30) )
Endfor
Locate
Endproc
Procedure Init
* Setup Grid
With Thisform.myGrid
.RecordSourceType = 4 && SQL
TEXT to .RecordSource noshow pretext 15
select * from myTable
where dateRegistration >= cast(thisform.olecontrol1.object.value as date) and
dateRegistration < cast(thisform.olecontrol1.object.value as date)+1
order by dateRegistration
into cursor crsData
nofilter
ENDTEXT
Endwith
Endproc
Procedure oleControl1.Change
* Update grid on date change
*** ActiveX Control Event ***
With Thisform.myGrid
.RecordSource = .RecordSource
Endwith
Endproc
Enddefine
最后一点说明:
在我作为作者的FoxyClasses中,现在已经向公众发布了很长时间,你可以使用超过15个课程开箱即用,让这样的事情变得更容易。 ie:它具有PeriodPicker控件以从用户获取“日期/时间范围”,它具有locatorGrid控件以从SQL创建可搜索,可排序的...等网格等等。如果要检查并使用其类,可以从以下位置下载: