尝试在没有vba

时间:2017-10-12 16:51:42

标签: sql ms-access

我试图创建一个非常简单的搜索工具来从表中提取记录(" ApplicationTable")。向用户呈现包含多个文本框控件的表单,每个控件对应于表中的字段(ApplicationID,FirstName,LastName等)。他们将数据输入到他们希望的任何字段中,然后单击按钮。搜索应返回相应字段包含搜索参数的每个记录,并忽略任何空白的搜索字段。数据显示在弹出的报告中。

例如,如果您输入" A17"在ApplicationID控件中,它将返回ApplicationID字段包含的所有记录" A17"。如果您输入" A17"进入ApplicationID和" John"进入FirstName,它将返回ApplicationID字段包含的所有记录" A17"并且FirstName字段包含" John"。如果您点击搜索按钮并将所有字段留空,则只返回表格中的所有记录。

不幸的是,对于我的生活,我无法通过简单的查询获得SQL权利,所以我不得不使用vb​​a。但我不想,因为它使许多事情变得比它需要的更复杂。 (例如,我试图将结果导出到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来解决这个问题,但我无法正确使用语法,并且会抛出错误或返回错误的结果。

1 个答案:

答案 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