Office中国论坛/Access中国论坛

标题: 一个全字段多条件模糊查询函数 [打印本页]

作者: t小宝    时间: 2007-12-27 17:32
标题: 一个全字段多条件模糊查询函数
请各位测试并提出宝贵意见
在7楼已有更新
Public Function 模糊搜索(数据源 As String, 条件 As String) As String
''=================================================================================
'' 函数说明:
'' 此函数执行成功则返回一个包含全字段模糊查询条件的查询语句,
'' 可以作为窗体数据源、列表框的行来源、查询的SQL语句。
'' 参数说明:
'' 数据源 参数: 必填 可以是表名、查询名、SQL语句
'' 条件   参数: 必填 可以是任何字符,多个条件用空格隔开
'' 使用示例:
'' Me.列表框1.RowSource = 模糊搜索("人员表", Me.文本1)
'' Me.子窗体.Form.RecordSource = 模糊搜索("Select * From 人员表", "张小 大力 韦 001")
'
'' 设计:t小宝 于2007-12-27
''================================================================================
Dim dbs As dao.Database
Dim r字段 As dao.Recordset
Dim stsql As String
Dim s数组() As String
Dim s条件 As String
Dim i条件 As Integer
Dim i As Integer
Dim i1 As Integer
s条件 = Trim(条件)
If Len(数据源) = 0 Then                                                             ' 不输入数据源,退出
    Exit Function
End If
' 转换数据源参数为SQL语句
If InStr(1, 数据源, "select ", 1) = 0 Then                                          ' 如果数据源是查询语句
    stsql = "Select * From (Select * From " & 数据源 & ") As a "
Else                                                                                ' 数据源是表名或查询名称
    stsql = "Select * From (" & 数据源 & ") As a "
End If
If Len(s条件) = 0 Then                                                              ' 不输入条件
    模糊搜索 = stsql
    Exit Function
End If
' 清除条件中多余的空格,转换为数组
Do Until InStr(1, s条件, "  ", 0) = 0
    s条件 = Replace(s条件, "  ", " ")                                                ' 用一个空格替换两个空格
Loop
s数组 = Split(s条件)
i条件 = UBound(s数组)
' 循环组合字段条件
Set dbs = CurrentDb
Set r字段 = dbs.OpenRecordset(stsql & " Where False")
With r字段
    For i = 0 To .Fields.Count - 1                                                    ' 循环字段
        For i1 = 0 To i条件                                                           ' 循环条件
            模糊搜索 = 模糊搜索 & .Fields(i).Name & " Like '*" & s数组(i1) & "*' or " ' 组合字段和条件
        Next
    Next
    .Close
End With
Set r字段 = Nothing
Set dbs = Nothing
模糊搜索 = " Where " & Left(模糊搜索, Len(模糊搜索) - 3)                              ' 去掉最后面的 "or ",加上" Where "
模糊搜索 = stsql & 模糊搜索
End Function

[ 本帖最后由 t小宝 于 2007-12-28 20:52 编辑 ]
作者: Victor_Duane    时间: 2007-12-27 19:53
一定打了不少字,支持一下,呵呵
作者: t小宝    时间: 2007-12-27 20:22
原帖由 cuxun 于 2007-12-27 18:26 发表
哈哈,支持,第一次见中文的函数有点亲切感


要的就是这种效果,给不懂代码的人容易理解

原帖由 Victor_Duane 于 2007-12-27 19:53 发表
一定打了不少字,支持一下,呵呵


变量名打一次,然后就复制
作者: tmtony    时间: 2007-12-27 20:33
小宝 出招 中西合壁 简明易懂
作者: goto2008    时间: 2007-12-27 23:24
学习一下哦。。。。。。
作者: t小宝    时间: 2007-12-28 20:50
此函数在一楼的基础上作了更新,主要是改变了组合查询条件字符的方式,增加了关系参数,多条件之间的关系可以选择"与"或"或"。2007-12-30再次修改:表名和字段名加上 [ ] 号,防止表名和字段中间有空格。

Public Function 模糊搜索(数据源 As String, Optional 条件 As String, Optional 关系 As Boolean) As String
''=================================================================================
'' 函数说明:
'' 此函数执行成功则返回一个包含全字段模糊查询条件的查询语句,否则返回一个空字符串。
'' 参数说明:
'' 数据源 参数: 必填 可以是表名、查询名、SQL语句
'' 条件   参数: 可选 可以是任何字符,多个条件用空格隔开
'' 关系   参数: 可选 为真假值,确定多个条件之间的关系,为真关系是"or",为假关系是"and"
'' 使用示例:
'' Me.列表框1.RowSource = 模糊搜索("人员表", Me.文本1)
'' Me.子窗体.Form.RecordSource = 模糊搜索("Select * From 人员表", "张小 大力 001",true)
'
'' 设计:t小宝
'' 创建日期:2007-12-27
'' 更新日期:2007-12-30
''==================================================================================
On Error GoTo Err1
Dim dbs As dao.Database
Dim r字段 As dao.Recordset
Dim stsql As String
Dim s数组() As String
Dim s字段 As String
Dim s条件 As String
Dim s关系 As String
Dim i条件 As Integer
Dim i As Integer
Dim i1 As Integer

If Len(数据源) = 0 Then                                                            ' 不输入数据源,退出
    Exit Function
End If

' 转换数据源参数为SQL语句
If InStr(1, 数据源, "select", 1) = 0 Then                                           ' 如果数据源是查询语句
    stsql = "Select * From [" & 数据源 & "] "
Else                                                                                               ' 数据源是表名或查询名称
    stsql = "Select * From (" & 数据源 & ") As a "
End If

s条件 = Trim(条件)
If Len(s条件) = 0 Then                                                                  ' 不输入条件
    模糊搜索 = stsql
    Exit Function
End If

' 清除条件中多余的空格,转换为数组
Do Until InStr(1, s条件, "  ", 0) = 0
    s条件 = Replace(s条件, "  ", " ")                                               ' 用一个空格替换两个空格
Loop
s数组 = Split(s条件)
i条件 = UBound(s数组)

' 循环组合字段条件
Set dbs = CurrentDb
Set r字段 = dbs.OpenRecordset(stsql & " Where False")
With r字段
    For i = 0 To .Fields.Count - 1                                                   ' 循环组合条件字段
        s字段 = s字段 & "[" & .Fields(i).Name & "] & ' ' & "
    Next
    .Close
End With
s字段 = Left(s字段, Len(s字段) - 8)                                              ' 去掉后面多余的字符

' 关系字符
If 关系 Then
    s关系 = "*' or "
Else
    s关系 = "*' and "
End If

For i1 = 0 To i条件                                                                           ' 循环条件
    模糊搜索 = 模糊搜索 & s字段 & "Like'*" & s数组(i1) & s关系        ' 组合字段和条件
Next
模糊搜索 = " Where " & Left(模糊搜索, Len(模糊搜索) - 4)               ' 去掉后面多余的字符,加上" Where "
模糊搜索 = stsql & 模糊搜索

Set r字段 = Nothing
Set dbs = Nothing

Exit1:
    Exit Function
Err1:
    模糊搜索 = ""
    MsgBox Err.Description, vbExclamation, "发生错误"
    Resume Exit1
End Function

[ 本帖最后由 t小宝 于 2007-12-30 14:12 编辑 ]
作者: sbsfhgl    时间: 2007-12-30 11:29
好东西,没什么会沉在这下面
作者: t小宝    时间: 2007-12-30 14:13
7楼函数再次修改:表名和字段名加上 [ ] 号,防止表名和字段中间有空格。
作者: chenlugen    时间: 2008-8-20 21:52
能说说在窗体中怎么调用 吗?????[:30] [:31]
作者: hf791119    时间: 2009-3-11 21:33
要有实例就好了。
作者: luhao    时间: 2009-3-11 22:00
想看个样板
作者: zzwxm98    时间: 2009-5-3 11:25
要的就是这种效果,给不懂代码的人容易理解
作者: chaojianan    时间: 2009-10-14 20:58
谢谢收藏了。
作者: xxiaoxin321    时间: 2009-10-15 14:47
好东西啊,谢谢分享!
作者: 风啸啸    时间: 2010-3-17 19:04
好东西啊,谢谢分享!
作者: hannanrenjie    时间: 2014-7-25 10:32
收藏起来,不会代码真可怜。
作者: sunqingyu    时间: 2014-12-7 21:24
thl   




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3