Access编程交流网
  • 设为首页|收藏本站|繁体中文|手机版
  •     
  • Access培训-Access开发平台-Access行业开发

  • 首页
  • 资讯
  • 技巧
  • 源码
  • 行业
  • 资源
  • 活动
  • 关于

技巧

ACCESS数据库

启动/设置/选项/背景

修复/压缩

安全/加密/解密

快捷键

版本升级/其它等

数据表

命名方式/设计规范

表设计

查询

Sql语言基础

选择查询

更新查询

删除查询

追加查询

生成表查询

交叉表查询

SQL特定查询

查询参数

查询综合应用

界面/窗体/控件

标签

文本框

命令按钮

组合框/列表框

选项组/复选框/选项按钮

选项卡

子窗体

窗体本身/综合应用

其它

报表打印

报表设计

高级报表

模块/函数/VBA/API/系统

VBA基础

内置函数

调试/跟踪/Debug

模块/类模块

API/COM/系统相关

字符数字日期

网络通信游戏

加密解密安全

文件处理

经典算法

宏/菜单/工具栏/功能区

宏/脚本

菜单/工具栏

功能区/Ribbon

图表/图形/图像/多媒体

图表

图形/图像

音频

视频/动画

DAO/链接表/ADO/ADP

DAO/链接表/ODBC

ADO/RDO

ADP

ActiveX/第三方控件/插件

Treeview树控件

ListView列表控件

Toolbar工具栏控件

微软其它控件

Dbi-Tech

CodeJock

Grid++Report

FastReport

ComponentOne

加载项/插件/Addin

OFFICE集成/导入导出/交互

Excel导入导出/交互

Word导入导出/交互

PPT交互

Outlook控制/邮件

Text文本文件/INI/CSV

PDF/SWF/XML格式

CAD格式

Sharepoint/其它Office

SqlServer/其它数据库

表

视图

存储过程/触发器

函数

用户/权限/安全

调试/维护

SqlServer其它/综合

发布/打包/文档/帮助

开发版/运行时

打包/发布/部署

开发文档/帮助制作

Access完整行业系统

采购管理系统

销售管理系统

仓库管理系统

人力资源管理HRM

CRM管理系统

MRP/ERP管理系统

BRP/流程优化

其它管理系统

心得/经验/绝招
其它/杂项
Excel技巧

Excel应用与操作

Excel开发编程

Word技巧

Word应用与操作

Word开发编程

Outlook技巧

Outlook应用与操作

Outlook开发编程

热门文章

  • 获取唯一的文件名
  • 别让MsgBox中断了一些..
  • 返回文件路径
  • 模块的使用技巧
  • 如何判断二个日期是否为同一..
  • API改变主窗口背景

最新文章

  • Access或VB VBA..
  • 关于VBA的0、""(空字..
  • Access导出函数Out..
  • Access日期与日期区间..
  • RecordSource ..
  • Access子窗体事件控制..

联系方式

Access交流网(免费Access交流)

QQ:18449932 

网  址:www.access-cn.com

当前位置:首页 > 技巧 > 模块/函数/VBA/API/系统 > VBA基础
VBA基础

一个常用的组合多条件查询 WHERE 子句的函数

 

方法一:

 
本方法编写了几个函数来完成上述工作

 

 

Option Compare Database
'先定义几个枚举常量
Public Enum ValueTypeEnum
    vDate = 1
    vString = 2
    vNumber = 3
End Enum
Public Enum OperatorEnum
    vLessThan = 0
    vMorethan = 1
    vEqual = 2
    vLike = 3
End Enum

 

Function JoinWhere(ByVal strFieldName As String, _
                    ByVal varValue As Variant, _
                    Optional ByVal strValueType As ValueTypeEnum = 2, _
                    Optional ByVal intOperator As OperatorEnum = 3) As String
                    

'作者           :cg1
'说明:
'JoinWhere 函数专门用于组合常用的多条件搜索的Where子句
'参数说明:
'   strFieldName   :用于传入需要查询的字段名
'   varValue       :用于传入窗体上对应控件的值,可能是 NULL
'   strValueType   :可选参数,用于指定数据类型,默认为 string
'   intOperator    :可选参数,用于指定操作符类型,默认为 like


    Dim strOperateor As String
    Select Case intOperator
    Case 0
        strOperator = " <= "
    Case 1
        strOperator = " >= "
    Case 2
        strOperator = " = "
    Case 3
        strOperator = " Like "
    Case Else
        strOperator = " Like "
    End Select
    
    Select Case strValueType
    Case 1  'date
        If IsNull(varValue) = False Then
            If IsDate(varValue) = True Then
                JoinWhere = " (" & strFieldName & strOperator & " #" & CheckSQLWords(CStr(varValue)) & "#) and "
            Else
                MsgBox "“" & CStr(varValue) & "”不是有效的日期,请再次复核!", vbExclamation, "查询参数错误..."
            End If
        End If
    Case 2  'string
        If IsNull(varValue) = False Then
            JoinWhere = " (" & strFieldName & strOperator & " '*" & CheckSQLWords(CStr(varValue)) & "*') and "
        End If
    Case 3  'number
        If IsNull(varValue) = False Then
            If IsNumeric(varValue) Then
                JoinWhere = " (" & strFieldName & strOperator & CheckSQLWords(CStr(varValue)) & ") and "
            Else
                MsgBox "“" & CStr(varValue) & "”不是正确的数值,请再次复核!", vbExclamation, "查询参数错误..."
            End If
        End If
    Case Else
        JoinWhere = ""
    End Select
End Function
Public Function CheckSQLWords(ByVal strSQL As String) As String
'检查 SQL 字符串中是否包含非法字符
    If IsNull(strSQL) Then
        CheckSQLWords = ""
        Exit Function
    End If
    CheckSQLWords = Replace(strSQL, "'", "''")
End Function

Public Function CheckWhere(ByVal strSQLWhere As String) As String
'用于判断最终结果是否有 WHERE 子句,因为有可能是不需要条件,查询出所有的结果集合
    If IsNull(strSQLWhere) = True Then
        Exit Function
    End If
    If strSQLWhere <> "" Then
        strSQLWhere = " where " & strSQLWhere
    End If
    If Right(strSQLWhere, 5) = " and " Then
        strSQLWhere = Mid(strSQLWhere, 1, Len(strSQLWhere) - 5)
    End If
    CheckWhere = strSQLWhere
End Function

Function CheckSQLRight(ByVal strSQL As String) As Boolean
'用 EXECUTE 执行一遍来检测 SQL 是否有错误,只适用于耗时较少的 SELECT 查询
    On Error Resume Next
    CurrentProject.Connection.Execute strSQL
    If Err <> 0 Then
        Debug.Print Err.Number & " -> " & Err.Description
        CheckSQLRight = False
        Exit Function
    End If
    CheckSQLRight = True
End Function


 


实际使用时如下:

 

Private Sub Command12_Click()
    Dim strSQL As String
    Dim strWhere As String
    
    strSQL = "select * " & _
             "FROM tbl_user"
    
    '注意,查 FirstName 的时候并没有使用后面的两个参数,
    '因为那两个参数是默认值,默认为字符串按LIKE 查询

    strWhere = JoinWhere("id", Me.id, vNumber, vEqual) & _
                JoinWhere("FirstName", Me.FirstName) & _
                JoinWhere("createdate", Me.CreateDate1, vDate, vMorethan) & _
                JoinWhere("createdate", Me.CreateDate2, vDate, vLessThan) & _
                JoinWhere("worknumber", Me.WorkNumber1, vNumber, vMorethan) & _
                JoinWhere("worknumber", Me.WorkNumber2, vNumber, vLessThan)
    '你无需关心JoinWhere函数是如何编写出来的。你只要关心JoinWhere有4个
    '参数,该如何填写即可。记得组织完 WHERE 子句后用 CheckWhere 函数检查一遍。

                
    '以下用于判断最终结果是否有 WHERE 子句,因为有可能是不需要条件,查询出所有的结果集合
    strWhere = CheckWhere(strWhere)
    
    strSQL = strSQL & strWhere
    
   
    '以下部分用于检测 SQL 语句语法是否有错误,觉得没必要可以去掉
    If CheckSQLRight(strSQL) = False Then
        MsgBox "SQL 语句有错误,请查看“立即窗口”"
        Exit Sub
    End If
        
    Me.Sub_Frm_UserList.Form.RecordSource = strSQL
End Sub

 

 

 

方法二:
 

 

 

以下将上述几个函数写成了一个类模块,供大家参考:

Option Compare Database

 

'-----------------------------------------------------
'类模块名   :clsWhere
'建立方法   :VBE 界面 -> 菜单 -> 插入 -> 类模块
'作用       :根据界面输入,动态组织 SQL 语句的 Where 子句
'作者       :cg1
'-----------------------------------------------------


'先定义几个枚举常量
Public Enum ValueTypeEnum
    vDate = 1
    vString = 2
    vNumber = 3
End Enum
Public Enum OperatorEnum
    vLessThan = 0
    vMorethan = 1
    vEqual = 2
    vLike = 3
End Enum
Private strSQLWhere As String
Private strErrorDescription As String

Public Property Get ErrorDescription() As String
    ErrorDescription = strErrorDescription
End Property

Public Property Get WhereWords() As String
'用于判断最终结果是否有 WHERE 子句,因为有可能是不需要条件,查询出所有的结果集合
    Dim strOutput As String
    
    If strErrorDescription <> "" Then
        Debug.Print strErrorDescription
        WhereWords = ""
        Exit Property
    End If
    If IsNull(strOutput) = True Then
        WhereWords = ""
        Exit Property
    Else
        strOutput = strSQLWhere
    End If
    
    If strOutput <> "" Then
        strOutput = " where " & strOutput
    End If
    If Right(strOutput, 5) = " and " Then
        strOutput = Mid(strOutput, 1, Len(strOutput) - 5)
    End If
    WhereWords = strOutput
End Property

Public Function JoinWhere(ByVal strFieldName As String, _
                    ByVal varValue As Variant, _
                    Optional ByVal strValueType As ValueTypeEnum = 2, _
                    Optional ByVal intOperator As OperatorEnum = 3, _
                    Optional ByVal strAlertName As String = "")
                    
'出处           :http://access911.net
'作者           :cg1
'说明:
'JoinWhere 函数专门用于组合常用的多条件搜索的Where子句
'参数说明:
'   strFieldName   :用于传入需要查询的字段名
'   varValue       :用于传入窗体上对应控件的值,可能是 NULL
'   strValueType   :可选参数,用于指定数据类型,默认为 string
'   intOperator    :可选参数,用于指定操作符类型,默认为 like
'   strAlertName   :可选参数,如果有错误,提示用户是哪个项目出错了,默认为 ""


    Dim strOperateor As String
    Select Case intOperator
    Case 0
        strOperator = " <= "
    Case 1
        strOperator = " >= "
    Case 2
        strOperator = " = "
    Case 3
        strOperator = " Like "
    Case Else
        strOperator = " Like "
    End Select
    
    Select Case strValueType
    Case 1  'date
        If IsNull(varValue) = False Then
            If IsDate(varValue) = True Then
                JoinWhere = " (" & strFieldName & strOperator & " #" & CheckSQLWords(CStr(varValue)) & "#) and "
            Else
                strErrorDescription = strErrorDescription & "您" & IIf(strAlertName = "", "", "在“" & strAlertName & "”中") & "填写的“" & CStr(varValue) & "”不是有效的日期,请再次复核!" & vbCrLf
            End If
        End If
    Case 2  'string
        If IsNull(varValue) = False Then
            JoinWhere = " (" & strFieldName & strOperator & " '*" & CheckSQLWords(CStr(varValue)) & "*') and "
        End If
    Case 3  'number
        If IsNull(varValue) = False Then
            If IsNumeric(varValue) Then
                JoinWhere = " (" & strFieldName & strOperator & CheckSQLWords(CStr(varValue)) & ") and "
            Else
                strErrorDescription = strErrorDescription & "您" & IIf(strAlertName = "", "", "在“" & strAlertName & "”中") & "填写的“" & CStr(varValue) & "”不是正确的数值,请再次复核!" & vbCrLf
            End If
        End If
    Case Else
        JoinWhere = ""
    End Select
    
    strSQLWhere = strSQLWhere & JoinWhere
    
End Function

Private Function CheckSQLWords(ByVal strSQL As String) As String
'检查 SQL 字符串中是否包含非法字符
    If IsNull(strSQL) Then
        CheckSQLWords = ""
        Exit Function
    End If
    CheckSQLWords = Replace(strSQL, "'", "''")
End Function

Public Function CheckSQLRight(ByVal strSQL As String) As Boolean
'用 EXECUTE 执行一遍来检测 SQL 是否有错误,只适用于耗时较少的 SELECT 查询
    On Error Resume Next
    CurrentProject.Connection.Execute strSQL
    If Err <> 0 Then
        Debug.Print Err.Number & " -> " & Err.Description
        CheckSQLRight = False
        Exit Function
    End If
    CheckSQLRight = True
End Function


 

调用时代码如下:

 

Private Sub Command12_Click()
    Dim strSQL As String
    Dim c As New clsWhere
   
    strSQL = "select * " & _
             "FROM tbl_user"
    
    '注意,查 FirstName 的时候并没有使用后面的两个参数,
    '因为那两个参数是默认值,默认为字符串按LIKE 查询。
    '注意,参数“strAlertName”并不一定要等于参数“varValue”的控件名

    
    With c
        .JoinWhere "id", Me.id, vNumber, vEqual, "id"
        .JoinWhere "FirstName", Me.FirstName, , , "FirstName"
        .JoinWhere "createdate", Me.CreateDate1, vDate, vMorethan, "From CreateDate"
        .JoinWhere "createdate", Me.CreateDate2, vDate, vLessThan, "To CreateDate"
        .JoinWhere "worknumber", Me.WorkNumber1, vNumber, vMorethan, "From WorkNumber"
        .JoinWhere "worknumber", Me.WorkNumber2, vNumber, vLessThan, "To WorkNumber"
    End With
    
    If c.ErrorDescription = "" Then
        Debug.Print c.WhereWords
        '以下部分用于检测 SQL 语句语法是否有错误,觉得没必要可以去掉
        'If c.CheckSQLRight(strSQL) = False Then
        '    MsgBox "SQL 语句有错误,请查看“立即窗口”"
        '    Exit Sub
        'End If

        Me.Sub_Frm_UserList.Form.RecordSource = strSQL & c.WhereWords
    Else
        MsgBox c.ErrorDescription, vbExclamation
        Exit Sub
    End If
    Set c = Nothing
End Sub

 

 

 

示例下载:
http://access911.net/down/eg/eg_query_property.rar (35KB)

发布人:cg1『文章…-Access911  
分享到:
点击次数:  更新时间:2005-02-06 00:26:25  【打印此页】  【关闭】
上一条:使用ADO修改数据库的密码  下一条:如何实现动态查询余额



相关文章

  • • Access或VB VBA判断数组的值是否为空的几种方法
  • • 关于VBA的0、""(空字符串)、Null、Empty、与 Nothing 的区别
  • • Access导出函数OutPutto解释
  • • Access日期与日期区间的筛选
  • • RecordSource SourceObject ControlSource属性的区别
  • • Access子窗体事件控制父窗体
  • • 事件​change和AfterUpdate的区别
  • • 代码修改完善方法示例(初学者必读)

热门文章

  • [2013-07-04] [经验分享]Access中判断表是否存在的通用函数access数据库
  • [2013-10-23] Access变量的命名规则access数据库
  • [2009-06-13] 为ACCESS添加多个Timer功能access数据库
  • [2009-05-08] 自动编号的函数access数据库
  • [2004-01-06] 指定字符开头和结束的查找access数据库
  • [2009-05-09] VBA语句集400句(六部分)access数据库

热门产品

公司动态|在线留言|在线反馈|友情链接|会员中心|站内搜索|网站地图

中山市天鸣科技发展有限公司 版权所有 1999-2023 粤ICP备10043721号

QQ:18449932

Access应用 Access培训 Access开发 Access平台

access|数据库|access下载|access教程|access视频|access软件

Powered by MetInfo 5.3.12 ©2008-2025  www.metinfo.cn