Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.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
Sql 尝试在没有vba的情况下为搜索功能定制查询_Sql_Ms Access - Fatal编程技术网

Sql 尝试在没有vba的情况下为搜索功能定制查询

Sql 尝试在没有vba的情况下为搜索功能定制查询,sql,ms-access,Sql,Ms Access,我正在尝试创建一个非常简单的搜索工具来从表中提取记录(“ApplicationTable”)。用户将看到一个表单,其中包含多个textbox控件,每个控件对应于表中的一个字段(ApplicationID、FirstName、LastName等)。用户可以在任意字段中输入数据,然后单击按钮。搜索应返回对应字段包含搜索参数的每条记录,并忽略任何空白搜索字段。数据显示在弹出的报告中 例如,如果在ApplicationID控件中输入“A17”,它将返回ApplicationID字段包含“A17”的所有记

我正在尝试创建一个非常简单的搜索工具来从表中提取记录(“ApplicationTable”)。用户将看到一个表单,其中包含多个textbox控件,每个控件对应于表中的一个字段(ApplicationID、FirstName、LastName等)。用户可以在任意字段中输入数据,然后单击按钮。搜索应返回对应字段包含搜索参数的每条记录,并忽略任何空白搜索字段。数据显示在弹出的报告中

例如,如果在ApplicationID控件中输入“A17”,它将返回ApplicationID字段包含“A17”的所有记录。如果在ApplicationID中输入“A17”,在FirstName中输入“John”,它将返回ApplicationID字段包含“A17”且FirstName字段包含“John”的所有记录。如果在所有字段都为空的情况下点击搜索按钮,它只返回表中的所有记录

不幸的是,就我的一生而言,我无法正确地使用SQL来通过一个简单的查询来实现这个功能,因此我不得不使用vba。但我不想,因为它让很多事情变得比它需要的更复杂。(例如,我正在尝试将结果导出到Excel,这是一个难题,因为transferspreadsheet无法接受动态SQL。)

所以

以下是我当前使用的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;

帮忙?我假设我需要使用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解决方案,请参见