Microsoft Access 掲示板

SQLの記述を簡略化したい

4 コメント
views
4 フォロー

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

beginner
作成: 2024/08/30 (金) 12:30:44
通報 ...
1

私がよくやるのは、定数でSQLを宣言しておいて、変更がある部分(今回はWHERE句)はマークを付けたワードにしておく。
WHERE句のみ生成して、Repalceでマークワードを生成した条件式で置換する。

条件式の生成は、今回のように3条件ぐらいなら、ElseIf で分岐していっても何とかなるが、条件が多くなると収拾がつかなくなるので、条件変数に条件を随時追加していくようにする。

あと、提示のコードをみると 製品ID は入力必須、出荷月のみの入力はNGのようなので、そのチェックを追加しておいたほうがいいでしょう。

コード例

Private Sub cb注番選択_GotFocus()
    Const conSQL = _
        "SELECT DISTINCT [注番] " & _
        "FROM [Q製品出荷履歴1Form用RS] " & _
        "WHERE 【Where】 " & _
        "ORDER BY [注番];"

    Dim varID As Variant, varYear As Variant, varMonth As Variant
    varID = Me.[製品ID]
    varYear = Me.[cb出荷の年]
    varMonth = Me.[cb出荷の月]
    
    If IsNull(varID) Then
        MsgBox "製品IDを入力してください。"
        Me.[製品ID].SetFocus
        Exit Sub
    End If
    
    If IsNull(varYear) And Not IsNull(varMonth) Then
        MsgBox "出荷年を選択してください。"
        Me.[cb出荷の年].SetFocus
        Exit Sub
    End If
    
    Dim strWhere As String
    strWhere = "[製品ID]=" & varID

    If Not IsNull(varYear) Then
        strWhere = strWhere & " AND Year([出荷日付])=" & varYear
    End If

    If Not IsNull(varYear) Then
        strWhere = strWhere & " AND Month([出荷日付])=" & varMonth
    End If

    Me.[cb注番選択].RowSource = Replace(conSQL, "【Where】", strWhere)

End Sub
2
beginner 2024/08/30 (金) 16:01:57 ddfe5@72531

hatenaさん ありがとうございます。
Constは使った事がなかったので勉強になりました。条件変数に条件を随時追加はFilterの様にSQLでも出来るとは知りませんでした。確かにこれは便利です! 一つだけ参考にまで教えて頂きたいのですが【Where】の様にコード内に【 の様な記号を使うことは特に問題ないでしょうか? この場合ならOKでしょうか?

3

【Where】の様にコード内に【 の様な記号を使うことは特に問題ないでしょうか? この場合ならOKでしょうか?

""で囲まれた文字列内なので問題ありません。
また、最終的にはReplace関数で条件式に置換してますので、RpwSourceに設定するときには消えています。

4
beginner 2024/09/02 (月) 12:14:07 ddfe5@72531

hatenaさん ありがとうございます。
なるほどそういう事ですね。色々素晴らしい回答を頂き感謝します。大変勉強になります。
お世話になりました。