この問題はおなじみのように聞こえますが、このフォーラムや他の場所で見つけた同様の質問にひねりを加えているため、最後まで読んでください。Access 2010 を使用して簡単なアプリを作成し、別のシステムで実行するコードを作成しています。その一環として、ユーザーごとのレコード数を 1 つのレコードに変換し、すべてのユーザー エントリをカンマで区切ります。説明のために、ここに私の入力のサンプルを示します。
USER MBR
---- ----
USR1 DRG
USR1 ABC
USR1 XYZ
USR2 123A
USR2 ABS2
そして、私はこの形式でそれを必要としています:
USER MBR_LIST
----- ---------------
USR1 DRG, ABC, XYZ
USR2 123A, ABS2
これまでのところ、とてもおなじみです。2008 年に Allen Brown によって投稿されたコード ( http://allenbrowne.com/func-concat.html ) を使用しましたが、問題が発生しました。コードは問題なく動作します。デバッグすると、出力文字列 ("strOut") に、予想どおり、1 人のユーザーのすべての MBR が含まれていることがわかります。この文字列の長さが 7,000 文字を超える場合があります。そこで、ここでもいくつかの素晴らしいアドバイスに従って、MBR_LIST フィールドを MEMO に設定してテーブルを作成し、Allen の関数を次のように実行します。
INSERT INTO Table2 ( [USR], MBR_LIST )
SELECT B.USR, ConcatRelated("MBR","Table1","Table1.USR = '" & B.USR & "'","USR") AS Mbr_List
FROM (SELECT Table1.USR FROM Table1 GROUP BY Table1.USR) AS B;
(メモ: クエリは、メモ型フィールドでグループ化を行うことを避けるために作成されています。これは、メモ型フィールドを切り捨てることが知られています)
それでも、これを行った後、テーブルの MBR_LIST フィールドには 320 文字 (?) しか表示されません。
この投稿で提案されているように、空の行を追加しようとしました: MS Access Create Table is Truncating Memo Fieldですが、成功しませんでした - フィールドはまだ 320 文字に切り捨てられます:
INSERT INTO Table2 ( [USR], MBR_LIST )
SELECT B.USR, "" as Mbr_List
FROM [Table2] as B Where (False)
UNION ALL
SELECT B.USR, ConcatRelated("MBR","Table1","Table1.USR = '" & B.USR & "'","USR") AS Mbr_List
FROM (SELECT Table1.USR FROM Table1 GROUP BY Table1.USR) AS B;
最後の手段として、MID() を使用して、SELECT ステートメントでそれぞれ 300 文字 (Mbr_1 から Mbr_20) の「チャンク」を 20 個作成し、それらをすべて正常に戻しました。次に、これを別の SELECT にラップし、これらのチャンクを (Mbr_1 & Mbr_2 & ... & Mbr_20) AS Mbr_LIST として連結して、320 文字を取得しました。
関数によって作成された完全な文字列を挿入/表示する理由と方法はありますか?
ありがとう、部族