2017-10-12 44 views
1

我试图创建一个漂亮的骨架搜索工具来从表(“ApplicationTable”)拉记录。向用户呈现包含多个文本框控件的表单,每个表单对应于表中的一个字段(ApplicationID,FirstName,LastName等)。它们将数据输入到他们希望的任何字段中,然后单击按钮。搜索应返回相应字段包含搜索参数的每个记录,并忽略任何空白的搜索字段。数据显示在弹出的报告中。试图定制一个查询搜索功能没有vba

例如,如果在ApplicationID控件中输入“A17”,它将返回ApplicationID字段包含“A17”的所有记录。如果在ApplicationName和“John”中输入“A17”到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来进行,但是我无法获得正确的语法,并且它会抛出错误或返回错误的结果。

回答

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

+0

完美的工作! –