我有一个推荐表,它为每个独特的推荐创建一个新记录。例如,如果患者在同一天被转介到GI和耳鼻喉科,表格中将有两条记录,每条记录一条记录。
我目前有一个查询设置,用于在制作日期后45天提取所有推荐,这会触发员工向患者发送提醒信。然后,邮件合并word文档将患者信息和推荐专业信息提取到文档中。我目前的问题是,如果给予患者一个以上的转诊,那将产生多个字母。理想情况下,我想为每个列出的专业生成一个字母。
有关如何对查询进行编程以将重复患者组合到一个记录中的任何想法,以便邮件合并信件将所有专业内容整合到一个字母中?
答案 0 :(得分:0)
一种很少看到的方法,它可以产生比数据库字段(表)更灵活的结果,涉及使用VBA函数将数据的一对多部分连接为聚合查询的一部分。
我称之为"活跃"查询 - 它不是技术术语,只是我使用的术语。
邮件合并可以直接链接到此类查询,但仅限于使用DDE连接时。它被OLE DB替换为2003年左右的默认连接方法,从那时起,DDE就不那么可靠了。 DDE是必需的,因为VBA功能只能在Access应用程序环境中运行。 OLE DB(和ODBC)直接连接到数据,因此VBA无法运行。
这就是为什么现在使用Make Table查询是一种更强大的方法。
在过去的半天里,我一直在洗劫我的记忆,试图挖掘细节 - 上次我这样做是在十多年前。我把主要部件放在一起,然后对它们进行了测试,结果如下:要求:
聚合查询 - 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];