MS Access VBA:将查询结果转换为单个字符串

时间:2015-08-20 13:41:52

标签: ms-access access-vba concatenation

我在MS Access中有一个由项目组成的表格,还有另一个表格,其中销售人员与这些项目相关联。例如,项目"铅笔"可能有4个人把它卖掉了。一旦所有内容都出现在查询中,我就会这样:

item    seller
pencil  joe
pencil  bob
pencil  charles
pen     john
eraser  ruth
paper   charles

我有一份报告表,我希望在一行中列出每件商品的卖家。有点像:

pencil: bob, joe, charles
pen:    john
eraser: ruth
paper: charles

我想我可以找出一个解决方案,我从一个按项目名称过滤的查询语句中创建一个ADO Recordset对象,然后使用a为每个循环遍历记录并将名称输入到每个项目的连接字符串中。听起来很长的路要走。任何人都有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用Allen Browne的ConcatRelated函数创建查询,以将每个卖方名称连接到一个单独的字段中。然后在报告的记录源中使用查询。

以下是查询的输出,您的示例数据存储在名为 YourTable 的表中:

item    sellers
------  ------------------
eraser  ruth
paper   charles
pen     john
pencil  joe, bob, charles
SELECT
    y.item,
    ConcatRelated
        (
            "seller",
            "YourTable",
            "[item]='" & [y].[item] & "'"
        ) AS sellers
FROM YourTable AS y
GROUP BY y.item;

答案 1 :(得分:1)

Jet SQL本身不支持任何用于连接组的机制。

但是,您可以针对所有数据发出单个查询,并使用Scripting.Dictionary工具 - > 参考 - > 保留结果的Microsoft Scripting Runtime

Dim dict As New Scripting.Dictionary
Do Until rs.EOF
    If Not dict.Exists(rs!item) Then dict(rs!item) = New Collection
    dict(rs!item).Add rs!seller
    rs.MoveNext
Loop

仍然存在从集合生成字符串的问题。我建议使用描述here中描述的两种方法之一来编写一个收集集合并返回字符串(在下面的示例中称为Join)的函数。

完成后,您可以遍历字典中的键,并加入每个项目中的集合:

Dim key As Variant
For Each key In dict.Keys
    Debug.Print key, ":", Join(dict(key), ",")
Next