[access查询]也谈多条件查询——刘小军查询示例的进阶
时 间:2011-11-07 10:26:50
作 者:轻风 ID:82 城市:福清
摘 要: 刘小军同志曾发了一个多条件查询的示例,成为众多新手学习多条件查询的首选教材,我也不例外。
只是当需要有很多条件组成时,特别是一个系统中需要多个不同的多条件查询窗体,写这些代码工作量也是不小,而且不小心就会写错。于是我在刘小军的基础上,做一个相对一劳永逸的方法,算是为初学者做个进阶的示例。
正 文:
方法其实也简单,就是用For...Each...Next遍历控件,通过对控件名的判断(当然也可利用控件的Tag属性等),来获取条件设置。
首先,先写个自定义函数:
↓↓↓↓↓↓↓↓
Public Function MyWhere(tForm As Form, tLogic As String) As String
'=========================================================
'函数作用:遍历控件,获取筛选条件。控件名称需按一定规则命名。
'引用技术:
'参数: tForm:当前窗体,如(Me)
' tLogic:逻辑运算符,"And" 或 "Or"
'返回: 筛选条件
'最后更新:2011-11-4
'改进: 2011-11-7
'改进内容:增加逻辑运算符参数
'调用示例:Me.Child1.Form.Filter = MyWhere(Me,"And")
'作者: 轻风 QQ:119398787
'=========================================================
Dim Ctl As Object
Dim ctlName As String
Dim strWhere As String
For Each Ctl In tForm.Controls '遍历控件
ctlName = Mid(Ctl.Name, 5) '提取去掉前缀后的控件名,亦为字段名。
Select Case Left(Ctl.Name, 4)
'判断控件名的前缀,“w”代表此控件是条件值,后三位代表类型:
' “Str”为文本型,“Ble”为布尔型,
' “In”加1或2为数值型,“Da”加1或2为日期型。1为下限,2为上限。
' “bet”为前缀的可选框用来激活设置条件上限输入框。
Case "wStr":
If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " like '" & Ctl & "') " & tLogic & " " '文本型支持通配符*、!等,输入条件时按需要加入。
Case "wBle":
If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " = " & Ctl & ") " & tLogic & " "
Case "wIn1":
If tForm.Controls("bet" & ctlName) Then '如果激活设置条件上限,则运算符为>=下限
If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " >= " & Ctl & ") " & tLogic & " "
Else '否则就=下限
If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " = " & Ctl & ") " & tLogic & " "
End If
Case "wIn2":
'如果激活设置条件上限,则运算符为<=上限
If tForm.Controls("bet" & ctlName) Then If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " <= " & Ctl & ") " & tLogic & " "
Case "wDa1":
If tForm.Controls("bet" & ctlName) Then '如果激活设置条件上限,则运算符为>=下限
If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " >= #" & Ctl & "#) " & tLogic & " "
Else '否则就=下限
If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " = #" & Ctl & "#) " & tLogic & " "
End If
Case "wDa2":
'如果激活设置条件上限,则运算符为<=上限
If tForm.Controls("bet" & ctlName) Then If Nz(Ctl) <> "" Then strWhere = strWhere & "(" & ctlName & " <= #" & Ctl & "#) " & tLogic & " "
End Select
Next
If Len(strWhere) > 0 Then '如果条件不为空,则去掉后面多余字符:
strWhere = Left(strWhere, Len(strWhere) - Len(tLogic) - 2)
Else '否则设置条件为真,即所有记录。
strWhere = True
End If
MyWhere = strWhere
End Function
↑↑↑↑↑↑↑↑
以上也可算是通用函数吧,只是需要对做为条件输入的控件命名遵守规则:4位前缀+字段名。其中4位前缀也有分教:
第1位:w,表明此为条件输入的控件。(这其实也可不用,加一个是为了其他需要,如要清空所有条件输入控件的值时,便于判断。)
第2-4位:类型区分。一般有4种类型:文本型、逻辑型、数值型、日期型。查询中经常对于数值型和日期型需要查询一定范围内的值,所以我对这两个类型分别分成下限和上限两个,就有了6种类型:
“Str”为文本型;
“Ble”为布尔型;
“In1”数值型下限;
“In2”数值型上限;
“Da1”为日期型下限;
“Da2”为日期型上限。
另外,用可选框来激活是否需要查询一个范围,可选框以前缀“bet”+字段名命名,如果未选,表明只需查询单个值,如果选中,则打开上限输入框,表明需查询范围值。在我的示例中,还有一个组合框(cobLogic),是用来选择逻辑运算符(And、Or)的,如下图:
如此,以后需要做多条件查询时,只需要按以上规则命名控件,然后在查询按钮单击事件中调用函数来获取筛选条件即可,不用重复写太多代码:
↓↓↓↓↓↓↓↓
Private Sub cmdCX_Click()
'传递查询条件方法各有不同,本例是将条件传递到子窗体的Filter属性,并激活筛选。
Me.Child1.Form.Filter = MyWhere(Me, cobLogic)
Me.Child1.Form.FilterOn = True
End Sub
附 件:
Access软件网官方交流QQ群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access系统自带的日期选择器不...(11.08)
- 分享一下Access工程中的acw...(11.07)
- Access快速开发平台--让有权...(11.04)
- Access快速开发平台--审批选...(11.01)
- ACCESS两张表先各自排序,然后...(10.31)
- Access对子窗体数据进行批量+...(10.30)
- SqlServer中如何用SQL命...(10.29)
- Access报表中的分组功能用代码...(10.28)
- 用Access计算库存结余的一个方...(10.26)
- 最精简的组合框行来源数据快速输入(...(10.25)