在查询中组合记录

时间:2016-04-28 14:38:56

标签: ms-access ms-word mailmerge

我有一个推荐表,它为每个独特的推荐创建一个新记录。例如,如果患者在同一天被转介到GI和耳鼻喉科,表格中将有两条记录,每条记录一条记录。

我目前有一个查询设置,用于在制作日期后45天提取所有推荐,这会触发员工向患者发送提醒信。然后,邮件合并word文档将患者信息和推荐专业信息提取到文档中。我目前的问题是,如果给予患者一个以上的转诊,那将产生多个字母。理想情况下,我想为每个列出的专业生成一个字母。

有关如何对查询进行编程以将重复患者组合到一个记录中的任何想法,以便邮件合并信件将所有专业内容整合到一个字母中?

1 个答案:

答案 0 :(得分:0)

一种很少看到的方法,它可以产生比数据库字段(表)更灵活的结果,涉及使用VBA函数将数据的一对多部分连接为聚合查询的一部分。

我称之为"活跃"查询 - 它不是技术术语,只是我使用的术语。

邮件合并可以直接链接到此类查询,但仅限于使用DDE连接时。它被OLE DB替换为2003年左右的默认连接方法,从那时起,DDE就不那么可靠了。 DDE是必需的,因为VBA功能只能在Access应用程序环境中运行。 OLE DB(和ODBC)直接连接到数据,因此VBA无法运行。

这就是为什么现在使用Make Table查询是一种更强大的方法。

在过去的半天里,我一直在洗劫我的记忆,试图挖掘细节 - 上次我这样做是在十多年前。我把主要部件放在一起,然后对它们进行了测试,结果如下:

  1. 假设您有一个收集课程数据的数据库,以及课程参与者,这些数据库在课程ID和参与者ID的一对多表中进行链接。
  2. 作为邮件合并结果,您需要每个课程的参与者列表。
  3. 要求:

    • 在CourseID上分组并使用VBA函数作为表达式来连接名称列表的聚合查询,由vbCR(Word中的新段落)分隔。 (这将转换为非DDE连接的MakeTable查询。)
    • 访问Recordset以检索给定CourseID的参与者的VBA函数
    • (可选)查询VBA函数使用的Recordset
  4. 聚合查询 - SQL(生成表查询):

    SELECT Kurse.[Kurs ID], concatData([Kurse.Kurs ID]) AS ListOfNames
    FROM [Teilnehmer-Adressliste] INNER JOIN (Kurse INNER JOIN [Kurs/Partizipation] 
      ON Kurse.[Kurs ID] 
        = [Kurs/Partizipation].[Kurs ID]) 
      ON [Teilnehmer-Adressliste].[Participant ID] 
        = [Kurs/Partizipation].[Participant ID]
    GROUP BY Kurse.[Kurs ID];
    

    VBA代码

    Public Function concatData(s As String) As String
        Dim retVal As String
    
        Dim rs As Recordset
        Set rs = CurrentDb.OpenRecordset("testKursAndNames", dbOpenDynaset)
        Do While Not rs.EOF
            If rs.Fields("Kurs ID").Value = s Then
               retVal = retVal & rs.Fields("P_Name").Value & vbCr
            End If
            rs.MoveNext
        Loop
        concatData = retVal
    End Function
    

    记录集查询 - SQL:

    SELECT [Kurs/Partizipation].[Kurs ID], [Teilnehmer-Adressliste].P_Name
    FROM [Teilnehmer-Adressliste] INNER JOIN [Kurs/Partizipation] 
      ON [Teilnehmer-Adressliste].[Participant ID] 
        = [Kurs/Partizipation].[Participant ID];
    
    1. 邮件合并设置为连接到Make Table查询生成的表(假设是OLE DB或ODBC连接)。在描述的情况下,该表有两个字段:课程ID和名称列表。
    2. enter image description here

      显示数据:

      enter image description here