Sql 尝试在没有vba的情况下为搜索功能定制查询
我正在尝试创建一个非常简单的搜索工具来从表中提取记录(“ApplicationTable”)。用户将看到一个表单,其中包含多个textbox控件,每个控件对应于表中的一个字段(ApplicationID、FirstName、LastName等)。用户可以在任意字段中输入数据,然后单击按钮。搜索应返回对应字段包含搜索参数的每条记录,并忽略任何空白搜索字段。数据显示在弹出的报告中 例如,如果在ApplicationID控件中输入“A17”,它将返回ApplicationID字段包含“A17”的所有记录。如果在ApplicationID中输入“A17”,在FirstName中输入“John”,它将返回ApplicationID字段包含“A17”且FirstName字段包含“John”的所有记录。如果在所有字段都为空的情况下点击搜索按钮,它只返回表中的所有记录 不幸的是,就我的一生而言,我无法正确地使用SQL来通过一个简单的查询来实现这个功能,因此我不得不使用vba。但我不想,因为它让很多事情变得比它需要的更复杂。(例如,我正在尝试将结果导出到Excel,这是一个难题,因为transferspreadsheet无法接受动态SQL。) 所以 以下是我当前使用的vba代码:Sql 尝试在没有vba的情况下为搜索功能定制查询,sql,ms-access,Sql,Ms Access,我正在尝试创建一个非常简单的搜索工具来从表中提取记录(“ApplicationTable”)。用户将看到一个表单,其中包含多个textbox控件,每个控件对应于表中的一个字段(ApplicationID、FirstName、LastName等)。用户可以在任意字段中输入数据,然后单击按钮。搜索应返回对应字段包含搜索参数的每条记录,并忽略任何空白搜索字段。数据显示在弹出的报告中 例如,如果在ApplicationID控件中输入“A17”,它将返回ApplicationID字段包含“A17”的所有记
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;
帮忙?我假设我需要使用iifs来实现这一点,但我无法获得正确的语法,它要么抛出错误,要么返回错误的结果。布尔逻辑解救了我 这样进行静态查询,就不需要任何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解决方案,请参见《拯救布尔逻辑》 这样进行静态查询,就不需要任何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解决方案,请参见