#681 複数レコードのデータを単一フィールドに出力するプロシージャ例 VBA

ある条件に一致する複数レコードの特定フィールドについて、それらのデータをカンマ区切りの文字列としてまとめ、ひとつのフィールド値のように出力するサンプルプロシージャです。

Public Function ListCSV(strField As String, strSource As String, strWhere As String) As String
'複数レコードの指定フィールドの値をカンマ区切りでリスト化して返す
'strField   :選択するフィールド名
'strSource  :テーブルまたはクエリ名
'strWhere   :抽出条件

  Dim dbs As Database
  Dim rst As Recordset
  Dim strSQL As String
  Dim strRet As String

  Set dbs = CurrentDb

  'SQL文を組み立て
  strSQL = "SELECT " & strField & " FROM " & strSource & " WHERE " & strWhere
  'SQL文からレコードセットを生成
  Set rst = dbs.OpenRecordset(strSQL)
  With rst
    strRet = ""
    '抽出された全レコードのループ
    Do Until .EOF
      '指定フィールドの値をカンマ区切りで組み立て
      strRet = strRet & IIf(Len(strRet) > 0, ",", "") & .Fields(strField)
      .MoveNext
    Loop
    .Close
  End With

  '組み立てられたカンマ区切りの文字列を返す
  ListCSV = strRet

End Function



このプロシージャをクエリの演算フィールドから呼び出して利用する例です。
  1. メインテーブルとして「受注」、それに対する多側のテーブルとして「受注明細」があるとします。メインテーブルの主キーであるそれぞれ1つの「受注ID」に対して、「受注明細」には複数のレコード関連付けられています。
    それをテーブルのデータシートビューで”サブデータシート”として表示すると次のようなデータ構成となっています。


  2. メインテーブル「受注」だけを使ったクエリを作成します。


  3. そこに、下記式の”演算フィールド”を追加します。

    明細ID: ListCSV("ID","受注明細","受注ID=" & [受注ID])



    このフィールドの意味合いとしては下記のようなものとなっています。

    • 「ID」フィールドの値を「受注明細」テーブルから取り出す

    • その際、抽出条件を「"受注ID=" & [受注ID]」とすることで、『「受注ID」フィールドの値が「受注」テーブルのカレントレコードの「受注ID」と同じものだけ』を取り出す

    • それらの条件をListCSVプロシージャへの引数として指定することで、”受注ID”ごとの複数の”明細データのID”をカンマ区切りで1つのフィールド値のようにクエリ上に出力する

実行例:
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved