1

这个问题听起来很熟悉,但请读到最后,因为它与我在这个论坛或其他地方发现的类似问题有所不同。我正在使用 Access 2010 构建一个简单的应用程序来创建一些代码以在另一个系统中执行。其中一部分是将每个用户的记录数转换为单个记录,所有用户条目用逗号分隔。为了说明,这是我输入的示例:

USER    MBR
----    ---- 
USR1    DRG 
USR1    ABC 
USR1    XYZ 
USR2    123A 
USR2    ABS2

我需要这种格式:

USER   MBR_LIST
-----  ---------------
USR1   DRG, ABC, XYZ
USR2   123A, ABS2

到目前为止,如此熟悉。我使用了 Allen Brown 在 2008 年发布的代码 ( http://allenbrowne.com/func-concat.html ),但我遇到了一个问题。该代码运行良好 - 当我调试它时,我可以看到我的输出字符串(“strOut”)具有单个用户的所有 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;

(注意:查询是这样构建的,以避免在 Memo 字段上执行 Group By,这会截断 Memo 字段)

尽管如此,执行此操作后,表中的 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 语句中创建了 20 个“块”,每个“块”包含 300 个字符(Mbr_1 到 Mbr_20),我把它们全部恢复了。然后我将它包装到另一个 SELECT 中,将这些块连接起来 (Mbr_1 & Mbr_2 & ... & Mbr_20) 作为 Mbr_LIST,并得到 - 320 个字符!

任何想法为什么以及如何插入/显示函数创建的完整字符串?

谢谢,部落

4

1 回答 1

0

几年前我在辅助函数中使用DLookup创建了一个解决方法。

当然不是最快的,但如果其他任何事情都失败了......

Access 查询截断备注字段

要插入长文本,请在检索到 USR 和 MBR_LIST 的值后使用 VBA:

Dim rs As DAO.Recordset

Set rs = CurrentDb.OpenRecordset("Select [USR], MBR_LIST From Table2")

rs.AddNew
    rs!USR.Value = USR
    rs!MBR_LIST.Value = MBR_LIST
rs.Update
rs.Close

Set rs = Nothing
于 2017-05-17T18:43:03.177 回答