SSブログ

複数選択リストボックスを使った条件抽出 [リストボックス]

 リストボックスを使った軽めの応用です。

 複数選択できるリストボックスを表示して、クリックして選択すると、その条件でデータを抽出する処理です。

 この例はセンスがちょっとあれですが、左の分類リストボックスを選択すると、右にその分類に属する商品が表示される様になっています。


 使うデータはこんな感じです。
 左が、リストボックス用の分類マスタ。リストボックスの値集合ソースに、

SELECT TMBUNRUI.BUNCD, TMBUNRUI.BUNMEI FROM TMBUNRUI ORDER BY TMBUNRUI.BUNCD;

で、指定しています。

 右が商品の一覧用。レコードソースに、

SELECT TMSYOHIN.COMCD, TMSYOHIN.COMMEI, TMSYOHIN.BUNCD FROM TMSYOHIN;

で、設定しています。

 画面の作りの細かいところは今回ちょっと端折ります。
分類の選択肢がクリックされたら、右の一覧をその条件で抽出する部分を説明します。

 分類リストボックスの更新後処理イベントで、処理を行います。

Private Sub lstBUN_AfterUpdate()
'分類リストボックス 更新後
    Call subSQL
End Sub

 処理はプロシジャに分けて作っています。別のタイミングでもこの処理を使うので、こうしてます。
以下、その処理です。

Private Sub subSQL()
'絞込SQL作成
    Dim strSQL As String
    Dim strWHERE As String
    Dim strORDER As String
    Dim strLIST As String
    Dim lngI  As Long

    '1)サブフォームのSQL
    strSQL = _
        " SELECT COMCD , COMMEI , BUNCD " & _
        " FROM TMSYOHIN"
    strWHERE = ""
    strORDER = " ORDER BY COMCD "

    '2)リストの選択状態から条件作成
    strLIST = ""
    For lngI = 0 To Me.lstBUN.ListCount - 1
        If Me.lstBUN.Selected(lngI) = True Then
            strLIST = strLIST & Me.lstBUN.Column(0, lngI) & " ,"
        End If
    Next

    '3)WHERE条件
    If strLIST <> "" Then
        '一番後ろの","を取る
        strLIST = Left(strLIST, Len(strLIST) - 1)
        '条件作成
        strWHERE = " WHERE BUNCD IN ( " & strLIST & " ) "
     End If

    '4)レコードソース設定
    Me.subLIST.Form.RecordSource = strSQL & strWHERE & strORDER

End Sub

 右の一覧を更新するための処理です。サブフォームになっています。
データの抽出条件を変えるため、RecordSourceのSQLを作り変えます。

1)の部分は基本となるSQL文です。ここで、WHERE句以外の部分内容を作ります。

2)で、リストボックスの選択状況を読み取ります。

lstBUN.ListCount は、リストボックスの項目数を返します。
lstBUN.Selected(n) は、n番目(0から始まる)が選択されているかどうかを返します。
(選択されている場合はTrue)
lstBUN.Column(c,r)は、リストボックスのc列目、r行目の内容を返します(それぞれ0から始まる)。

 リストボックスの項目をループで読み、選択されていれば、その分類コードをカンマで区切りながら strLIST に詰めていきます。これはSQLのIn演算子に使います。
例えば、

WHERE BUNCD IN ( 10 , 30 )

の場合、BUNCDが10または30のデータが抽出されます。

3)でWhere句部分を作ります。2)で作ったstrLISTは、そのままだと最後に”,”が付いてるので、これを取り除いて、上記の例のようなWhere句を作ります。

4)で、できあがったSQL文を、サブフォームのレコードソースにセットします。
RecordSource を設定し変えた場合は、Requeryしなくても更新されます。)

 このやり方で問題になるのは、リストボックスの項目数が膨大になった場合、SQL文の文字数の上限を超えてしまう可能性があります(約64000文字らしいです)。そういうケースは希だと思いますが、いちおう。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。