具有多标准搜索的表单 - 使用字符串和过滤器

时间:2014-01-23 19:15:46

标签: string forms search filter access-vba

我有一个搜索表单,其中空白字段绑定到表格,四个条件搜索框和一个按钮,用于从搜索框中获取输入,搜索表格,并在表单的空白字段中填充结果。

截至目前,只要所有四个标准框都不为空,它就会起作用 我使用过滤器来实现这一点,只要所有四个框都不为空,这里的代码就可以运行。 (我的标准框如下:一个名为“Keyword”的文本框和三个名为HRCombo,BuildingCombo和RoomCombo的组合框,以及它们绑定的字段如下:“项目描述”“HR Holder”“Building”“房间“)我的第一行”Me.Filter = ...“被拆开以便于查看。

Me.Filter = "[Item Description] Like " & Chr(34) & Me.Keyword & "*" & Chr(34) & "
 AND [HR Holder] = '" & Me.HRCombo & "'" & " AND [Building] = '" & Me.BuildingCombo
 & "'" & " AND [Room] = '" & Me.RoomCombo & "'"
Me.FilterOn = True
Me.Requery

无论标准框的哪个组合输入,我都需要它才能进行搜索。有人建议使用if语句执行以下操作: 创建四个字符串,每个条件框一个。使用4 if语句检查该框是否为null - 如果为null,则为其字符串分配星号,如果它不为null,则将我用于上述Me.Filter语句的值分配给每个框的字符串。然后,使用Me.Filter并在最后连接四个字符串。

这是我用于此的代码,而且由于我的知识有限,我无法让它工作。

Dim StrA as String, StrB as String, StrC as String, StrD as String

If Me.Keyword is null then
StrA = "*"
else
StrA = [Item Description] Like " & Chr(34) & Me.Keyword & "*" & Chr(34)
End If

If Me.HRCombo is null then
StrB = "*"
else
StrB = [HR Holder] = '" & Me.HRCombo & "'"
End If

If Me.BuildingCombo is null then
StrC = "*"
else
StrC = [Building] = '" & Me.BuildingCombo & "'"
End If

If Me.RoomCombo is null then
StrD = "*"
else
StrD = [Room] = '" & Me.RoomCombo & "'"
End If

Me.Filter = "StrA & " AND "StrB & " AND "StrC &" AND "StrD"
Me.FilterOn = True
Me.Requery

就像我说的那样,我的知识有限,所以我确信可能缺少引号和逗号,或者说它们太多了。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您缺少一些重要的引号,检查null的逻辑对于SQL是正确的,但对于VBA则不正确。我在这里发帖,我认为这是一种更干净的方式。请注意,您没有转义可能在控件中输入的单引号,我也不在此代码中(除了在第一个代码中,因此您可以使用Replace函数查看如何执行此操作)。当单个引用可能出现在其中一个搜索/过滤控件中时,这是非常重要的事情。

Dim strWhere as String

If Nz(Me.Keyword, "") <> "" Then
    strWhere = strWhere & "[Item Description] Like '*" & Replace(Me.Keyword, "'", "''") & "*' AND "
End If

If Nz(Me.HRCombo, "") <> "" Then
    strWhere = strWhere & "[HR Holder] = '" & Me.HRCombo & "' AND "
End If

If Nz(Me.BuildingCombo, "") <> "" Then
    strWhere = strWhere & "[Building] = '" & Me.BuildingCombo & "' AND "
End If

If Nz(Me.RoomCombo, "") <> "" Then
    strWhere = strWhere & "[Room] = '" & Me.RoomCombo & "' AND "
End If

If strWhere <> "" Then
    strWhere = Left(strWhere, Len(strWhere)-5) 'Remove the extra AND
    Me.Filter = strWhere
    Me.FilterOn = True
Else
    Me.Filter = ""
    Me.FilterOn = False
End If