这个问题听起来很熟悉,但请读到最后,因为它与我在这个论坛或其他地方发现的类似问题有所不同。 我正在使用 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;
(注意:查询是这样构建的,以避免在"备注"字段上执行"分组依据",已知这会截断"备注"字段)
尽管如此,完成此操作后,我在表中的MBR_LIST字段仅显示 320 个字符 (?
我什至尝试添加一个空行,如这篇文章所示: MS Access 创建表正在截断备忘录字段,但没有成功 - 该字段仍然被截断为 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 个字符!
任何想法为什么以及如何插入/显示函数创建的完整字符串?
谢谢 部落
几年前,我在帮助程序函数中使用DLookup创建了一个解决方法。
当然,不是最快的,但如果其他任何事情都失败了......
访问查询截断备注字段
若要插入长文本,请在检索 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