2017-10-12 39 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

完美的工作! –