我试图创建一个非常简单的搜索工具来从表中提取记录(" ApplicationTable")。向用户呈现包含多个文本框控件的表单,每个控件对应于表中的字段(ApplicationID,FirstName,LastName等)。他们将数据输入到他们希望的任何字段中,然后单击按钮。搜索应返回相应字段包含搜索参数的每个记录,并忽略任何空白的搜索字段。数据显示在弹出的报告中。
例如,如果您输入" A17"在ApplicationID控件中,它将返回ApplicationID字段包含的所有记录" A17"。如果您输入" A17"进入ApplicationID和" John"进入FirstName,它将返回ApplicationID字段包含的所有记录" A17"并且FirstName字段包含" John"。如果您点击搜索按钮并将所有字段留空,则只返回表格中的所有记录。
不幸的是,对于我的生活,我无法通过简单的查询获得SQL权利,所以我不得不使用vba。但我不想,因为它使许多事情变得比它需要的更复杂。 (例如,我试图将结果导出到Excel,这很麻烦,因为传输表格不能接受动态SQL。)
SO!
以下是我目前使用的vba代码:
Dim QueryStr As String
Dim AddAnd As Boolean
AddAnd = False
If Not IsNull([Forms]![ClientSearchForm]![ApplicationID]) Then
QueryStr = QueryStr & "((ApplicationTable.ApplicationID) Like '*' &
[Forms]![ClientSearchForm]![ApplicationID] & '*')"
AddAnd = True
End If
If Not IsNull([Forms]![ClientSearchForm]![NevadaApplicationID]) Then
If AddAnd = True Then
QueryStr = QueryStr & " AND "
End If
QueryStr = QueryStr & "((ApplicationTable.NevadaApplicationID) Like '*'
& [Forms]![ClientSearchForm]![NevadaApplicationID] & '*')"
AddAnd = True
End If
If Not IsNull([Forms]![ClientSearchForm]![FirstName]) Then
If AddAnd = True Then
QueryStr = QueryStr & " AND "
End If
QueryStr = QueryStr & "((ApplicationTable.ClaimantFirstName) Like '*' &
[Forms]![ClientSearchForm]![FirstName] & '*')"
AddAnd = True
End If
If Not IsNull([Forms]![ClientSearchForm]![LastName]) Then
If AddAnd = True Then
QueryStr = QueryStr & " AND "
End If
QueryStr = QueryStr & "((ApplicationTable.ClaimantLastName) Like '*' &
[Forms]![ClientSearchForm]![LastName] & '*')"
AddAnd = True
End If
If Not IsNull([Forms]![ClientSearchForm]![AssignedStaff]) Then
If AddAnd = True Then
QueryStr = QueryStr & " AND "
End If
QueryStr = QueryStr & "((ApplicationTable.AssignedStaff) Like '*' &
[Forms]![ClientSearchForm]![AssignedStaff] & '*')"
AddAnd = True
End If
If Not IsNull([Forms]![ClientSearchForm]![VictimDescription]) Then
If AddAnd = True Then
QueryStr = QueryStr & " AND "
End If
QueryStr = QueryStr & "((ApplicationTable.VictimDescription) Like '*' &
[Forms]![ClientSearchForm]![VictimDescription] & '*')"
AddAnd = True
End If
DoCmd.OpenReport "ClientSearchQuery", acViewReport, , QueryStr
" ClientSearchQuery"是我正在使用的核心查询,没有任何过滤器:
SELECT ApplicationTable.PrimaryAppID, ApplicationTable.ApplicationID, ApplicationTable.NevadaApplicationID,
ApplicationTable.EarliestReceivedDate, ApplicationTable.ClaimantFirstName, ApplicationTable.ClaimantLastName,
ApplicationTable.AssignedStaff, ApplicationTable.ContactDate, ApplicationTable.VictimDescription
FROM ApplicationTable;
帮助?我假设我需要使用iif来使用SQL来解决这个问题,但我无法正确使用语法,并且会抛出错误或返回错误的结果。
答案 0 :(得分:0)
救援的布尔逻辑!
像这样制作静态查询,但您不需要任何VBA。
SELECT stuff
FROM ApplicationTable
WHERE (ApplicationID Like '*' & [Forms]![ClientSearchForm]![ApplicationID] & '*'
OR [Forms]![ClientSearchForm]![ApplicationID] IS NULL)
AND (NevadaApplicationID Like '*' & [Forms]![ClientSearchForm]![NevadaApplicationID] & '*'
OR [Forms]![ClientSearchForm]![NevadaApplicationID] IS NULL)
AND ...
对于每个AND子句,如果相应的搜索控件为NULL,则该子句始终为TRUE。
注意:对于有效的VBA解决方案,请参阅http://allenbrowne.com/ser-62.html