2017-11-06 21 views
0

私はそれを一度も使ったことがないという点で、SQLの新機能です!私は現在Accessでクエリを書いていますが、クエリが複雑すぎると言ってエラーに遭遇し、SQLに直接書き込むことで解決できると考えていました。SQL検索フォーム

私は非常に単純なデータテーブルを持っており、複数の基準で検索フォームを作成しています。これには、名前と通りの検索、日付と数字の間の検索、ユーザーが入力したものよりも大きいものと低いものが含まれます(フォームのVBA、ドロップダウンメニュー、および検索の間に、ドロップダウンメニューから下限を選択します。VBAは、最初の「Between」テキストボックスにデータテーブルの日付または数字を置き、ユーザは2番目の日付または数字を入力します。

フォームのドロップダウンメニューの値を検索し、一致しない場合は、クエリのその部分を適用するwhere句になると思いますその部分をスキップします。

ここまでは以下のとおりですが、リモートで正しいかどうかはわかりません。

SELECT tblFOIData.Start_Date_of_Liability 
FROM tblFOIData 
WHERE ((([Forms]![frmSearch]![cmbStartDate_CriteriaSlection]<>""; 
(tblFOIData.Start_Date_of_Liability) Between [Forms]![frmSearch]![Between_Start_Date_1] And [Between_Start_Date_2]))); 

これはそれを行うための最善の方法ではありませんので、もし私が時間のためにこれに取り組んできていると、誰かが同じで20の検索条件を入力する機能で検索フォームを作成する簡単な方法をお勧めすることができます時間。 (うち6件はワイルドカード検索、14件は検索の間にある必要があります)、あなたの提案を聞くことに非常に感謝します。

UPDATE:

より見た後、私は、このSQLクエリが出ている:

SELECT * 
FROM tblFOIData 

WHERE (((tblFOIData.Area_Ref) Is Null Or (tblFOIData.Area_Ref) Like "*" & [Forms]![frmSearch]![cmbBilling_Authority] & "*") 
AND ((Nz([tblFOIData]![Ratepayer],"")) Is Null Or (Nz([tblFOIData]![Ratepayer],"")) Like "*" & [Forms]![frmSearch]![Rate_Payer] & "*") 
AND ((tblFOIData.Scheme_Reference) Is Null Or (tblFOIData.Scheme_Reference) Like "*" & [Forms]![frmSearch]![Scheme_Ref] & "*") 
AND ((tblFOIData.Account_Mailing_Address) Is Null Or (tblFOIData.Account_Mailing_Address) Like "*" & [Forms]![frmSearch]![Account_Mailing] & "*") 
AND ((tblFOIData.Empty_Prop) Is Null Or (tblFOIData.Empty_Prop) Like "*" & [Forms]![frmSearch]![Empt_Prop] & "*") 
AND ((tblFOIData.Charity) Is Null Or (tblFOIData.Charity) Like "*" & [Forms]![frmSearch]![Charity] & "*") 
AND ((tblFOIData.SBRR) Is Null Or (tblFOIData.SBRR) Like "*" & [Forms]![frmSearch]![SBRR] & "*") 
AND ((tblFOIData.Address) Is Null Or (tblFOIData.Address) Like "*" & [Forms]![frmSearch]![Address] & "*") 
AND ((tblFOIData.Postcode) Is Null Or (tblFOIData.Postcode) Like "*" & [Forms]![frmSearch]![Postcode] & "*") 
AND ((tblFOIData.Description) Is Null Or (tblFOIData.Description) Like "*" & [Forms]![frmSearch]![Description] & "*") 

AND ((tblFOIData.Start_Date_of_Liability) Is Null Or (tblFOIData.Start_Date_of_Liability) Between [Forms]![frmSearch]![Between_Start_Date_1] And [Forms]![frmSearch]![Between_Start_Date_2]) 
AND ((tblFOIData.[2017_RV]) Is Null Or (tblFOIData.[2017_RV]) Between [Forms]![frmSearch]![Between_2017_RV_1] And [Forms]![frmSearch]![Between_2017_RV_2]) 
AND ((tblFOIData.[2017_Effective_From]) Is Null Or (tblFOIData.[2017_Effective_From]) Between [Forms]![frmSearch]![Between_2017_Effective_1] And [Forms]![frmSearch]![Between_2017_Effective_2]) 
AND ((tblFOIData.[2017_Alteration_Date]) Is Null Or (tblFOIData.[2017_Alteration_Date]) Between [Forms]![frmSearch]![Between_2017_Alteration_1] And [Forms]![frmSearch]![Between_2017_Alteration_2]) 
AND ((tblFOIData.Compiled_2017_RV) Is Null Or (tblFOIData.Compiled_2017_RV) Between [Forms]![frmSearch]![Between_Compiled_RV_1] And [Forms]![frmSearch]![Between_Compiled_RV_2]) 
AND ((tblFOIData.Percentage_Increase) Is Null Or (tblFOIData.Percentage_Increase) Between [Forms]![frmSearch]![Between_Percentage_Increase_1] And [Forms]![frmSearch]![Between_Percentage_Increase_2]) 
AND ((tblFOIData.[2010_Rateable_Value]) Is Null Or (tblFOIData.[2010_Rateable_Value]) Between [Forms]![frmSearch]![Between_2010_RV_1] And [Forms]![frmSearch]![Between_2010_RV_2]) 
AND ((tblFOIData.[2017_UAR_Current]) Is Null Or (tblFOIData.[2017_UAR_Current]) Between [Forms]![frmSearch]![Between_UAR_Current_1] And [Forms]![frmSearch]![Between_UAR_Current_2]) 
AND ((tblFOIData.[2017_UAR_Historic]) Is Null Or (tblFOIData.[2017_UAR_Historic]) Between [Forms]![frmSearch]![Between_UAR_Historic_1] And [Forms]![frmSearch]![Between_UAR_Historic_2])); 

最初の部分は完璧に動作しますが、私は「の間を追加するとき、私は「複雑すぎる」というエラーが表示されます'検索します。

私はこの検索を実行する最も効果的な方法ではないかもしれないが、この作業を行う方法があることは知っていますか?私はフォームのそれぞれの 'Between'検索に割り当てられたドロップダウンオプションを持っています。ドロップダウンからオプションを選択しなかった場合、条件をバイパスする方法はありますか?

Dim strSQL As String 

    strSQL = "SELECT tblFOIData.Start_Date_of_Liability FROM tblFOIData WHERE" 

    If (((([Forms]![frmSearch]![cmbStartDate_CriteriaSlection]<>"") Then 
     strSQL = strSQL + "Start_Date = tblFOIData.Start_Date_of_Liability " 
    End If 

    If (otherCriterium = True) Then strSQL = strSQL + "AND myCol = " + [myForm.value] + " " 

    ' etc 

    strSQL = strSQL + ";" 

    ' now execute the query 

+0

あなたの 'のWHERE'句では、'; 'を ';' ';' 'から削除し、' AND'で置き換えます。セミコロンは、SQLの文ターミネータです。 –

+0

20の基準が多いです - 返されたレコードセットを「チャンク」で減らすことでこれを段階的に実行できませんか?私はここでサンプルを読んだりダウンロードしたりします。 http://allenbrowne.com/ser-62.html – Minty

+0

Paulさん、ありがとうございました。でも、cmbStart_Date_CriteriaSelectionに何も置かれていないときに私が得た結果は得られません。何も配置されていない場合、私はこのステップを迂回するクエリをしたい、多分私はIf文を入れる必要がありますか? – jufg

答えて

0

フォームでの基準に基づいて異なる複雑なSQLクエリを作成する最も簡単な方法は、あなたがたとえば(簡体字)、ステップ数で構築する文字列を作成することです文字列を作成した後、検査のために印刷することができます。

+0

ありがとうポール私は一見を持って、私はこれを動作させることができるかどうかを確認します。私はVBAと同じようなモジュールになっていますか?申し訳ありませんが、私は愚かな質問をしています! – jufg

+0

モジュールまたはクエリ情報を収集するために使用するフォームのコードのいずれかに配置できます。 –

+0

アクションクエリについては、VBAを通じて実行することもできるので、私はこの行動方針に同意します。選択クエリの場合、私がVBAに行くと、私は通常、すべてのチェックを行い、ブール値を返すユーザー定義関数を使用します。 OP、興味があれば、これを行う方法の例を投稿することができます。 –

0

このようなクエリは、すぐに非常に複雑になり、記述や管理が難しくなります。 検索フォームでは、通常、すべてのコントロールをループし、結果からwhere句を作成します。はるかにクリーンです。 SQL to include condition in Where if not null