Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用具有多个条件的文本框搜索多个字段_Vba_Ms Access_Search - Fatal编程技术网

Vba 使用具有多个条件的文本框搜索多个字段

Vba 使用具有多个条件的文本框搜索多个字段,vba,ms-access,search,Vba,Ms Access,Search,对VBA和一般的编码非常陌生。我正在研究一个数据库,我正试图建立一个搜索它的平台 数据库包含文档编号、文档日期和不同平台等字段 我正在处理的搜索表单有一个子表单显示数据库,每次按下搜索文本框中的键后,数据库都是uodatrd,有点像谷歌搜索 问题是,我需要文本框做两件事。首先,我需要能够将多个标准放在其中,用逗号分隔。例如,我可以搜索文档所基于的日期、标题和平台等参数(“Android Report 1,21/01/2020,Android”)。然后,我需要文本框来搜索数据库中的所有字段,只显示

对VBA和一般的编码非常陌生。我正在研究一个数据库,我正试图建立一个搜索它的平台

数据库包含文档编号、文档日期和不同平台等字段

我正在处理的搜索表单有一个子表单显示数据库,每次按下搜索文本框中的键后,数据库都是uodatrd,有点像谷歌搜索

问题是,我需要文本框做两件事。首先,我需要能够将多个标准放在其中,用逗号分隔。例如,我可以搜索文档所基于的日期、标题和平台等参数(“Android Report 1,21/01/2020,Android”)。然后,我需要文本框来搜索数据库中的所有字段,只显示包含我输入的所有条件的记录

抱歉,如果这一切听起来很混乱,这是我第一次在这里问问题,正如前面所说的,我是一个完整的编码初学者

提前感谢

在未绑定表单上放置3个文本框(txtDocument、txtDate和txtmplatform)、一个命令按钮(cmdSearch)和一个列表框(lstSearch)。将列表框设置为有3列。然后,在命令按钮的OnClick事件中,放置以下VBA代码:

Private Sub cmdSearch_Click()
    On Error GoTo E_Handle
    Dim strSQL As String
    If Len(Me!txtDocument) > 0 Then
        strSQL = strSQL & " AND DocumentNumber='" & Me!txtDocument & "' "
    End If
    If IsDate(Me!txtDate) Then
        strSQL = strSQL & " AND DocumentDate=" & Format(Me!txtDate, "\#mm\/dd\/yyyy\#")
    End If
    If Len(Me!txtPlatform) > 0 Then
        strSQL = strSQL & " AND Platform='" & Me!txtPlatform & "' "
    End If
    If Left(strSQL, 4) = " AND" Then
        strSQL = " WHERE " & Mid(strSQL, 5)
    End If
    strSQL = "SELECT DocumentNumber, DocumentDate, Platform " _
        & " FROM tblDocument " _
        & strSQL _
        & " ORDER BY DocumentDate, DocumentNumber, Platform;"
    Me!lstSearch.RowSource = strSQL
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "cmdSearch", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub
这将检查每个文本框中是否有数据,并构建SQL字符串的where部分。请注意,它将DocumentNumber和Platform的数据用单引号括起来,因为它们是文本,它将DocumentDate的数据格式化为明确的日期,并用八进制(“#”)括起来。最后,它将这段SQL插入一个SQL SELECT语句,用作ListBox的行源


关于,

您需要创建一个小函数,使用正在编辑的控件的
.Text
属性和其他控件的
.Value
属性动态构建行源。您构建的SQL将使用
和通配符。该过程将类似于:

Private Sub sFindData(strDocument As String, dtmDate As Date, strPlatform As String)
    On Error GoTo E_Handle
    Dim strSQL As String
    If Len(strDocument) > 0 Then
        strSQL = strSQL & " AND DocumentNumber LIKE '*" & strDocument & "*' "
    End If
    If (IsDate(dtmDate)) And (dtmDate <> #12/31/2099#) Then
        strSQL = strSQL & " AND DocumentDate=" & Format(Me!txtDate, "\#mm\/dd\/yyyy\#")
    End If
    If Len(strPlatform) > 0 Then
        strSQL = strSQL & " AND Platform LIKE '*" & strPlatform & "*' "
    End If
    If Left(strSQL, 4) = " AND" Then
        strSQL = " WHERE " & Mid(strSQL, 5)
    End If
    strSQL = "SELECT DocumentNumber, DocumentDate, Platform " _
        & " FROM tblDocument " _
        & strSQL _
        & " ORDER BY DocumentDate, DocumentNumber, Platform;"
    Me!lstSearch.RowSource = strSQL
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sFindData", vbOKOnly + vbCritical, "Error:  & err.n"
    Resume sExit
End Sub
请注意,我没有在
DocumentDate
字段中包含部分匹配,因为这没有意义


关于,

虽然可以这样做,但这不是一个好主意。最好使用1控件搜索表中的1个字段,可能是列出可用值的组合框。在这种情况下,我是否可以在搜索表单中添加两个文本框,并让每个文本框对所有字段执行独立搜索?基本上,不是使用一个文本框,而是用逗号分隔所有内容,而是为每个条件使用多个文本框。嗨,谢谢回复。这段代码的问题在于它不是每次击键都更新的。我正在寻找一种方法,在用户键入要搜索的参数时,使用每个按键更新包含表的列表框或子窗体。很抱歉,回复太晚,这与我需要的仍然有点不同。我需要有一个子表单绑定到我用来搜索参数的文本框,并且我需要在每次击键时更新该子表单(假设keypress是最佳方法),只显示包含精确或类似值字段的记录。例如,我在文本框中写“Android”,每次我添加/删除字母时,子表单都会自动更新,只显示包含我输入的参数的字段,无论“Android”一词是在标题、平台还是任何其他字段中。非常感谢在这种情况下,与其设置列表框的行源,不如设置子窗体的RecordSource。我在将子窗体的RecordSource设置为SQL行时遇到一些问题。除此之外,我注意到子窗体只显示一条记录。我做错什么了吗?你用来设置记录源的代码是什么?子窗体是否设置为连续?没关系,我设法找出了问题所在。代码工作得很好。非常感谢你的帮助!
Private Sub txtDate_AfterUpdate()
    Call sFindData(Nz(Me!txtDocument, ""), Nz(Me!txtDate, #12/31/2099#), Nz(Me!txtPlatform, ""))
End Sub

Private Sub txtDocument_Change()
    Call sFindData(Nz(Me!txtDocument.Text, ""), Nz(Me!txtDate, #12/31/2099#), Nz(Me!txtPlatform, ""))
End Sub

Private Sub txtPlatform_Change()
    Call sFindData(Nz(Me!txtDocument, ""), Nz(Me!txtDate, #12/31/2099#), Nz(Me!txtPlatform.Text, ""))
End Sub