【问题标题】:Using a textbox with multiple criteria to search multiple fields使用具有多个条件的文本框来搜索多个字段
【发布时间】:2020-06-10 16:40:15
【问题描述】:

对 VBA 和一般编码非常陌生。我正在开发一个数据库,我正在尝试建立一个搜索。

数据库有文献编号、文献日期、不同平台等字段

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

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

对不起,如果所有这些听起来很乱,这是我第一次在这里提出问题,如前所述,我是一个整体编码的初学者。

提前致谢

【问题讨论】:

  • 虽然可以这样做,但这不是一个好主意。最好使用 1 个控件来搜索表中的 1 个字段,可能是列出可用值的组合框。
  • 在这种情况下,我是否可以在搜索表单中添加几个文本框,并让每个文本框对所有字段执行独立搜索?基本上,与其使用一个文本框并用逗号分隔所有内容,不如为每个条件设置多个文本框。

标签: vba ms-access search


【解决方案1】:

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

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

然后这将被调用如下:

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

请注意,我没有在 DocumentDate 字段中包含部分匹配项,因为这没有任何意义。

问候,

【讨论】:

  • 抱歉回复晚了,这和我需要的还是有点不同。我需要有一个绑定到用于搜索参数的文本框/es 的子表单,并且我需要在每次击键时更新子表单(假设按键是最好的方法),只显示包含精确或相似字段的记录价值观。例如,我在文本框中写“Android”,每次我添加/删除一个字母时,子表单会自动更新,只显示包含我输入的参数的字段,“Android”这个词是否在标题中,平台,或任何其他字段。提前致谢
  • 在这种情况下,与其设置 ListBox 的 RowSource,不如设置子表单的 RecordSource。
  • 我在将子表单的 RecordSource 设置为 SQL 行时遇到了一些问题。除此之外,我注意到子表单只显示了一条记录。我做错了吗?
  • 您用来设置 RecordSource 的代码是什么?子表单是否设置为连续的?
  • 没关系,我设法找出问题所在。该代码完美运行。非常感谢您的帮助!
【解决方案2】:

在未绑定的表单上放置 3 个文本框(txtDocument、txtDate 和 txtPlatform)、一个命令按钮 (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 的数据格式化为明确的日期并将其包装在 octothorpes ("#") 中。最后将这段 SQL 插入到 SQL SELECT 语句中,用作 ListBox 的 RowSource。

问候,

【讨论】:

  • 您好,感谢您的回复。这段代码的问题在于它不会随着每次击键而更新。我正在寻找一种方法来更新列表框或包含表格的子表单,同时用户键入他想要搜索的参数。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多