SQLを勉強中です。フォームに抽出用コンボボックスがあり、そのRowSourceをフォーカス取得後イベントにSQLで設定しています。下記の様に条件により変えています。これの動作は問題ないのですが、記述の大半は同じでWHERE部だけが異なってます。同じ記述部を共通化する事は可能でしょうか? そういった簡略化は出来るのかなと思い投稿しました。
宜しくお願いします。
Dim cbRS As String, seID As Integer, sYear As Variant, sMonth As Variant
seID = Me.[製品ID]
sYear = Me.[cb出荷の年]
sMonth = Me.[cb出荷の月]
If Not IsNull(Me.[cb出荷の月]) Then '出荷年・月の条件あり
cbRS =
"SELECT DISTINCT " &
"[注番] " &
"FROM [Q製品出荷履歴1Form用RS] " &
"WHERE [製品ID]=" & seID & " " &
"AND Year([出荷日付])=" & sYear & " " &
"AND Month([出荷日付])=" & sMonth & " " & _
"ORDER BY [注番];"
ElseIf Not IsNull(Me.[cb出荷の年]) And IsNull(Me.[cb出荷の月]) Then '出荷年のみ条件あり
cbRS =
"SELECT DISTINCT " &
"[注番] " &
"FROM [Q製品出荷履歴1Form用RS] " &
"WHERE [製品ID]=" & seID & " " &
"AND Year([出荷日付])=" & sYear & " " &
"ORDER BY [注番];"
Else '出荷年月の条件なし
cbRS =
"SELECT DISTINCT " &
"[注番] " &
"WHERE [製品ID]=" & seID & " " &
"FROM [Q製品出荷履歴1Form用RS] " & _
"ORDER BY [注番];"
End If
Me.[cb注番選択].RowSource = cbRS
私がよくやるのは、定数でSQLを宣言しておいて、変更がある部分(今回はWHERE句)はマークを付けたワードにしておく。
WHERE句のみ生成して、Repalceでマークワードを生成した条件式で置換する。
条件式の生成は、今回のように3条件ぐらいなら、ElseIf で分岐していっても何とかなるが、条件が多くなると収拾がつかなくなるので、条件変数に条件を随時追加していくようにする。
あと、提示のコードをみると 製品ID は入力必須、出荷月のみの入力はNGのようなので、そのチェックを追加しておいたほうがいいでしょう。
コード例
hatenaさん ありがとうございます。
Constは使った事がなかったので勉強になりました。条件変数に条件を随時追加はFilterの様にSQLでも出来るとは知りませんでした。確かにこれは便利です! 一つだけ参考にまで教えて頂きたいのですが【Where】の様にコード内に【 の様な記号を使うことは特に問題ないでしょうか? この場合ならOKでしょうか?
""で囲まれた文字列内なので問題ありません。
また、最終的にはReplace関数で条件式に置換してますので、RpwSourceに設定するときには消えています。
hatenaさん ありがとうございます。
なるほどそういう事ですね。色々素晴らしい回答を頂き感謝します。大変勉強になります。
お世話になりました。