1

この問題はおなじみのように聞こえますが、このフォーラムや他の場所で見つけた同様の質問にひねりを加えているため、最後まで読んでください。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 文字を取得しました。

関数によって作成された完全な文字列を挿入/表示する理由と方法はありますか?

ありがとう、部族

4

1 に答える 1