如何在 Word 邮件合并中使用两个 Access 数据源

如何在 Word 邮件合并中使用两个 Access 数据源

我想设计一个邮件合并,使得第一个数据源(访问查询)提供客户姓名和号码,而第二个数据源(另一个访问查询)提供客户交易。

第一个数据源应该作为第二个数据源的过滤标准,因为第二个数据源有不同客户的交易。

我不知道该怎么做

答案1

开箱即用的 Word MailMerge 实际上并不支持 MailMerge 中的多个数据源。

这给你留下了两种可能性:

  1. 使用 VBA 或其他语言编写解决方案
  2. 使用数据库字段插入交易。

我不会尝试介绍(1),但您也许可以使用(2)。

(2)有许多困难,但它的工作原理如下:

您使用第一个数据源(提供客户姓名和编号的数据源)作为邮件合并数据源 - 以通常的方式进行设置。作为测试,从数据源插入一些 MERGEFIELD 字段,包括 { MERGEFIELD Id }

然后,您插入一个 { DATABASE } 字段,其中包含检索该客户交易的 SQL 查询。该查询的结果是一个 Word 表,您可以使用字段代码开关以相当有限的方式对其进行格式化。这种布局要么足以满足您的目的,要么不够。如果不够,您需要对输出进行后处理(例如使用 VBA)以应用所需的格式。

例如,假设您的数据库位于c:\mydbs\mydb.accdb,您的第一个查询有一个名为 的数字字段Id,您的第二个查询名为transactions_per_customer,您有一个客户,Id = 12345并且您可以使用以下方式检索该客户的交易

SELECT * FROM transactions_per_customer WHERE Id = 12345

然后,首先在 Word 文档中,使用 ctrl-F9 插入一对特殊字段代码括号

{  }

在它们之间,输入

DATABASE \d "c:\\mydbs\\mydb.accdb" \s "SELECT * FROM [transactions_per_customer] t WHERE t.Id = 12345" \h

所以你有了

{ DATABASE \d "c:\\mydbs\\mydb.accdb" \s "SELECT * FROM [transactions_per_customer] t WHERE t.Id = 12345" \h }

选择字段,使用 F9 更新它,然后按 Alt-F9 切换到字段结果。运气好的话,您将看到一个带有标题行(这就是 的作用\h)和一些数据行的表格。

此时,我将保存您的邮件合并主文档并进行合并测试,合并到新文档,只是为了验证一些数据库结果会针对每个客户显示(显然它们不是正确的结果)。如果您有足够多的交易,以至于它们会溢出到多个页面上,我建议您选择一个可以让您测试会发生什么情况的 ID,因为您可能会发现在第一页之后表格格式的表现并不像您希望的那样。(注意,还有其他开关可以应用标准 Word 表格格式,您可能会发现尝试使用开关“修复”格式很有用\*Mergeformat。您可以找到 Microsoft 的字段代码开关文档这里

一旦完成这项工作,您需要更改查询以过滤邮件合并数据源中每个客户的记录。在这种情况下,您需要:

{ DATABASE \d "c:\\mydbs\\mydb.accdb" \s "SELECT * FROM [transactions_per_customer] t WHERE t.Id = { MERGEFIELD Id }" \h }

在哪里全部{ } 是使用 ctrl-F9 插入的特殊字段代码括号。

再次保存文档(我建议这样做,因为如果您在查询中犯了错误并尝试测试它,您很可能最终会逐步检查每条记录以确认错误,然后才决定必须关闭 Word,而这是谁也不想做的)

预览几条记录的结果以确保查询正常运行(预览时您可能需要使用 F9 选择并更新字段),然后对多条记录运行有限的测试。如果一切顺利,那就去做吧!

笔记:

  1. Word 似乎坚持在 SQL 查询中使用“比您真正需要的更多的语法”。我留给您去探索,但我引入表别名 t 并使用 t.Id 的原因是,否则 Word 往往会将数据源中的字段与 DATABASE 字段查询中的字段混淆。

  2. 最好在输出中使用要在表中使用的查询中的列名(如果有)。但您也可以在查询中列出列并为其添加别名。只需尝试将查询字符总长度保持在 255 个(或可能是 512 个)字符以下即可。

  3. 很多示例都显示了\cDATABASE 字段中的(连接字符串)参数。只要您使用默认连接方法(即 OLE DB)连接到 ACCDB 或 MDB,就不需要它。

  4. 您可能需要确保使用的任何字段名称的大小写在 SQL 中与 Access 中使用的大小写相匹配。

  5. 如果 Id 实际上是一个字符串值,则需要引用相关字段,例如

    其中 t.Id = '{合并字段 Id}'

而不是

WHERE t.Id = { MERGEFIELD Id }

(这只是正常的 (Jet) SQL 语法)

  1. Jet SQL 接受一些包含空格等的表名周围的非标准引号。通常 Word 本身会使用反引号。如果您更喜欢双引号,则可能需要将它们加倍""Query1""或使用\"Query1\"

  2. 如果没有返回任何记录,则不会插入任何表。如果您想要其他东西。您可以执行以下操作:

    { IF "{ DATABASE \d "c:\\mydbs\\mydb.accdb" \s "SELECT * FROM [transactions_per_customer] t WHERE t.Id = { MERGEFIELD Id }" }" <> "
    
    " "{ DATABASE \d "c:\\mydbs\\mydb.accdb" \s "SELECT * FROM [transactions_per_customer] t WHERE t.Id = { MERGEFIELD Id }" \h }" "No transactions for this customer." }
    

(<> 后的 “” 之间应该有一个段落标记,因为从 Word 2000 左右开始,Word 在插入数据库时​​总会插入一个额外的段落标记)

或者在我看来下面这种方法更简单一些 - 保留原始字段,如果没有记录,其结果将为空白,并添加记录数测试:

{ DATABASE \d "c:\\mydbs\\mydb.accdb" \s "SELECT * FROM [transactions_per_customer] t WHERE t.Id = { MERGEFIELD Id }" \h }
{ IF { DATABASE \d "c:\\mydbs\\mydb.accdb" \s "SELECT count(*) FROM [transactions_per_customer] t WHERE t.Id = { MERGEFIELD Id }" } = 0 "No transactions." }

如果要避免插入额外的段落标记,请将两个字段放在一行上。

答案2

您需要在这里做一些学习。

转到 Word。打开邮件合并。现在转到向导并开始执行步骤。您应该有一个 Access 报告或 Excel 工作表,其中布局为您需要的列标题格式(名称地址、城市、邮政编码等)和您需要的行(数据)。

制作一个包含引用合并数据的字段的 Word 文档,并逐步完成其中的几个。

您可能希望创建一个小型 Excel 电子表格作为概念证明。然后构建您的 Access 查询以匹配报告。(我很确定 Word 邮件合并不会对两个选项执行实时查询 - 它会查看报告以获取其数据)。因此,查询报告以获取标题,然后查看您是否可以通过查询提取交易 - 这可能会起作用。

您需要一些例子来学习以上所有内容。

我已经从 Excel(根据原始交易数据创建)完成了 Word 邮件合并,并且它运行正常且良好。

相关内容