2017-10-12 2 views
1

テーブル( "ApplicationTable")からレコードを取得するためのかなりの骨なし検索ツールを作成しようとしています。ユーザーは、テーブル内のフィールド(ApplicationID、FirstName、LastNameなど)に対応するテキストボックスコントロールの数を含むフォームが表示されます。フィールドにデータを入力してから、ボタンをクリックします。検索では、対応するフィールドに検索パラメータが含まれる各レコードが返され、空の検索フィールドは無視されます。データがポップアップするレポートに表示されます。vbaを使用せずに検索機能のクエリを調整しようとしています

たとえば、 "A17"をApplicationIDコントロールに入力すると、ApplicationIDフィールドに "A17"が含まれているすべてのレコードが返されます。 ApplicationIDに "A17"、FirstNameに "John"を入力すると、ApplicationIDフィールドに "A17"が含まれ、FirstNameフィールドに "John"が含まれているすべてのレコードが返されます。すべてのフィールドを空白にして検索ボタンを押すと、テーブル内のすべてのレコードが返されます。

残念ながら、私の人生の間、私はこのことを単純なクエリで動かすためのSQL権限を得ることができないので、vbaを使用する必要があります。しかし、私はそれが必要以上に複雑になっているので、したくないです。 (たとえば、私は結果をExcelにエクスポートしようとしています。これは、transferspreadsheetが動的SQLを受け入れることができないためです)。

SELECT ApplicationTable.PrimaryAppID, ApplicationTable.ApplicationID, ApplicationTable.NevadaApplicationID, 
    ApplicationTable.EarliestReceivedDate, ApplicationTable.ClaimantFirstName, ApplicationTable.ClaimantLastName, 
    ApplicationTable.AssignedStaff, ApplicationTable.ContactDate, ApplicationTable.VictimDescription 
    FROM ApplicationTable; 

ヘルプ:それは上の任意のフィルタなしで、

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" 私が使用しているコアのクエリは次のとおりです。ここで

は、私が現在使用しているVBAコードのですか?私はiifsを使用して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

これは完璧に機能しました。 –

関連する問題