首页 > 解决方案 > 访问查询/VBA 以从两个字段和连接值进行分组

问题描述

我正在尝试解决一个具有挑战性的问题,并且可以在这件事上使用您的专业知识。

我正在尝试使用从前端应用程序获取到 FootPrints Service Core 11.6 数据库的查询来复制 Access 2013 中的一些报告。我已经完成了查询和计算,以复制前端报告中的大多数字段,但受让人信息除外。

注: Assignee 是工单被分配到工作的个人或[一般]团队,可以是多个[团队和个人])

这些受让人在足迹数据库的受让人表中单独列出(见附图)。当前端应用程序生成报告时,它以某种我无法模仿的特定方式将个人和团队受让人信息组合在一起(见图)。这就是我需要你帮助的地方!

我需要将所有受让人(个人和团队受让人)组合在一个字段中,按他们关联的票号 ( mrID ) 分组。

那么,数据库中有以下内容的地方

身份证 | 受让人 | 团队

12345 | 鲍勃·史密斯| 帮助台第 1 层

12345 | 简·史密斯| 帮助台第 1 层

12345 | (空)| 电信

23456 | (空)| 帮助台第 2 层

34567 | 查克·诺里斯| (无效的)

45678 | (空)| 帮助台第 1 层

45678 | (空)| 帮助台第 2 层

45678 | (空)| 联网

45678 | (空)| 访问控制

它应该显示为 1 个字段,如下所示:

身份证 | 受让人

12345 | 帮助台第 1 层:鲍勃·史密斯、简·史密斯。电信:

23456 | 帮助台第 2 层:

34567 | 查克·诺里斯

45678 | 帮助台第 1 层:. 帮助台第 2 层:. 联网: 。访问控制:

在上面的例子中可以看到,每个团队的受理人后面都有一个:,多个团队成员(个人)用,分隔,多个团队用.'s分隔

遵循这个约定 有没有办法通过在 Access中使用查询(或必要时使用 VBA )来模拟这个过程?

真挚地,

克里斯

标准报告,显示受理人字段如何分组和连接

数据库的受让人表,受让人信息的本地存储方式。 注意:出于隐私原因,姓名被涂黑

数据库的受让人表,受让人信息的本地存储方式。 注意:出于隐私原因,姓名被涂黑

标签: sqlvbams-accessgroup-byconcatenation

解决方案


您没有提供足够的数据来进行更多测试。是的,您包含了屏幕截图,但是要复制和粘贴的数据只有 3 条记录,所以我使用了它

我这样回答你的桌子(我的桌子的名字是Table1): 在此处输入图像描述

然后,我有一个这样的查询:

在此处输入图像描述

此查询的 SQL 代码是:

SELECT DISTINCT Table1.MrID, FINAL_ASSIGNEES([mrid]) AS ASSIGNEES FROM Table1;

如您所见,此 SQL 代码调用以 VBA 编码的 UDF,名为FINAL_ASSIGNEES. 这个UDF的代码是:

Public Function FINAL_ASSIGNEES(ByVal vThisMrID As Long) As String
Dim RST As Recordset
Dim SqlStr As String

SqlStr = "SELECT DISTINCT Table1.MrID, CONCATENATE_ASSIGNEE([MrID],[Team]) AS ASSIGNEES FROM Table1 " & _
    "WHERE Table1.MrID=" & vThisMrID & ";"

Set RST = Application.CurrentDb.OpenRecordset(SqlStr, 2, 4)

With RST
    If .EOF <> True And .BOF <> True Then
        .MoveLast
        .MoveFirst
        Do Until .EOF = True
            FINAL_ASSIGNEES = FINAL_ASSIGNEES & .Fields(1).Value & ". "
            .MoveNext
        Loop
            FINAL_ASSIGNEES = Left(FINAL_ASSIGNEES, Len(FINAL_ASSIGNEES) - 2) 'minus 2 to get rid of extra ". "
    End If

    Set RST = Nothing
End With


End Function

是的,这个 VBA 代码调用了第二个 UDF,名为CONCATENATE_ASSIGNEE. 第二个 UDF 的代码是:

Public Function CONCATENATE_ASSIGNEE(ByVal vMrID As Long, ByVal vTeam As String) As String
Dim MyRST As Recordset
Dim MySQL As String

MySQL = "SELECT Table1.Assignee FROM Table1 " & _
    "WHERE (((Table1.MrID)=" & vMrID & ") AND ((Table1.Team)='" & vTeam & "'));"

Set MyRST = Application.CurrentDb.OpenRecordset(MySQL, 2, 4)
DoEvents

With MyRST
    If .EOF <> True And .BOF <> True Then
        .MoveLast
        .MoveFirst

        Do Until .EOF = True

            If IsNull(.Fields(0)) = True Then
                CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & "Unassigned" & ", "
            Else
                CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & .Fields(0).Value & ", "
            End If

            .MoveNext
            DoEvents
        Loop

        CONCATENATE_ASSIGNEE = vTeam & ": " & Left(CONCATENATE_ASSIGNEE, Len(CONCATENATE_ASSIGNEE) - 2) 'minus 2 to get rid of the extra ", "
    End If
    Set MyRST = Nothing
End With



End Function

但这就是你所追求的。如果您正在使用大型记录集,则可能需要一些时间来进行计算。但至少您可以根据自己的需要进行调整。


推荐阅读