执行 vba DoCmd.OutputTo 命令以创建报告的 PDF 时,为啥 Access 会关闭/重新打开

Posted

技术标签:

【中文标题】执行 vba DoCmd.OutputTo 命令以创建报告的 PDF 时,为啥 Access 会关闭/重新打开【英文标题】:Why does Access close/reopen when a vba DoCmd.OutputTo command is executed to create a PDF of a report执行 vba DoCmd.OutputTo 命令以创建报告的 PDF 时,为什么 Access 会关闭/重新打开 【发布时间】:2021-05-14 11:59:34 【问题描述】:

我正在使用以下两行代码来尝试创建过滤报告的 PDF。

DoCmd.OpenReport "rptContactDetails", acViewPreview, , "contactsid=" & TempVars!RecordUnderEdit

DoCmd.OutputTo acOutputReport, "rptContactDetails", acFormatPDF, "D:\Temp\CurrentContactDetails.pdf"

如果省略第一行,则 DoCmd.OutputTo 命令可以正常工作,并且会正确创建完整报告的 PDF。但是,由于我想创建报告的过滤版本的 PDF,我首先打开它并应用过滤器(效果很好)。如果我这样做,当执行 DoCmd.OutputTo 时,Access 会说它正在创建 PDF,但随后会关闭并尝试重新打开,提示我保存数据库的备份。在目标目录中只创建一个零长度的 .tmp 文件。

我尝试用简单的数字联系人ID 替换 TempVar,但同样的事情发生了。我还在同一台 PC 上的另一个数据库中使用了完全相同的技术(几乎相同的代码),它工作得非常好,正确地创建了报告的过滤版本的 PDF。我正在使用最新版本的 Access(Microsoft Access v16.0 对象库)。

任何关于可能发生的事情(Access 关闭的原因)的建议都将受到欢迎 - 我是一个业余爱好者而不是程序员/软件开发人员!

【问题讨论】:

您必须在输出命令中包含过滤器,而不是在预览命令中。当打开同一个报表进行预览和输出时,访问似乎会感到困惑。 @PaulOgilvie 感谢您的评论。我看不到将过滤器添加到 OutputTo 命令的方法,这就是首先打开过滤报告的原因。请告知如何做到这一点。 【参考方案1】:

根据 MS Access 文档,DoCmd.OutputTo,参数 ObjectName 实际上是可选的。如果留空,方法将输出活动对象。但是,要动态过滤报表以进行输出,请不要使用打印预览acViewPreview,而是使用报表视图acViewReport

' OPEN IN REPORT VIEW
DoCmd.OpenReport "rptContactDetails", acViewReport, , "contactsid=" & TempVars!RecordUnderEdit

' LEAVE OBJECTNAME BLANK
DoCmd.OutputTo acOutputReport, , acFormatPDF, "D:\Temp\CurrentContactDetails.pdf"

' CLOSE REPORT
DoCmd.Close acReport, "rptContactDetails"

【讨论】:

非常感谢您的建议 - 我已经尝试过您建议的代码,但遗憾的是仍然遇到同样的问题。此外,正如我在原始帖子中提到的,我仔细回顾了我创建的另一个数据库,它使用了这种技术,在打开报告时使用了 acViewPreview,并且还在 OutputTo 命令中明确提到了报告,它工作正常。报告中没有代码,尽管它确实包含三个子报告 - 这是唯一的区别。同样正如我所说,如果我不先打开过滤后的报告,则会正确生成完整的未过滤报告的 PDF。【参考方案2】:

一种解决方案是将过滤作为报表记录源的查询的查询定义的一部分进行管理。

报告来源于 qryABC。说它只是没有条件的表。

然后使用添加条件的 sql 语句更改 qryABC 的查询定义,即红色小部件...您可以找到有关更改查询的查询定义的在线教程。

然后触发报告的导出。这是一个两步的过程,但会起作用。

【讨论】:

谢谢你 - 我已经使用类似的方法实现了一个解决方法。然而,我提出这个问题的主要原因是试图了解 Access 关闭并重新启动的原因,因为我在同一台 PC 上的另一个数据库中使用了相同的代码,没有任何问题。

以上是关于执行 vba DoCmd.OutputTo 命令以创建报告的 PDF 时,为啥 Access 会关闭/重新打开的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式执行 Access 2007 报告并将该报告导出为 PDF?

在 .net 中保存访问文件

使用 excel VBA 在命令提示符下执行命令

VBA 等待刷新电源查询以执行下一行代码

在 VBA 中执行 ADO 记录集命令会引发错误“转换 nvarchar 值时转换失败”

访问 VBA 循环(无响应)