Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-查询/SQL语句

[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群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助