MS Access - 通过取消报告创建的“幻影”进程

Posted

技术标签:

【中文标题】MS Access - 通过取消报告创建的“幻影”进程【英文标题】:MS Access - "phantom" process created by canceling report 【发布时间】:2012-12-31 23:16:27 【问题描述】:

我在 Access 2010 for Windows 中遇到了问题:

    使用 doCmd.OpenReport 启动报告 在与报告关联的事件中设置“Cancel = True” 关闭访问 Access 继续作为“幻像”进程运行,并且必须在任务管理器中终止。在此进程被终止之前,Access 无法打开另一个数据库。该任务最初会显示一些 CPU 使用率,但会安静到 0%。

我在使用 doCmd.OpenReport 启动报告时发现了这一点。报表在 Report_Open 事件中打开一个表单。该表格提示用户输入报告参数并允许他们按“确定”以显示报告或按“取消”。 "Cancel" 的 On Click 事件设置为 "Cancel = True"。

OpenReport() 似乎没有优雅地响应取消。这似乎是一种经常使用的技术,所以我不愿称其为错误,并想知道我是否做错了什么。实际上......我解释得越多,它听起来确实像一个错误。在这一点上,我希望有人有解决方法,或者我遗漏了一些明显的东西。

这只是我为说明问题而创建的一个简化示例:

表格

Private Sub Form_Open(Cancel As Integer)
On Error GoTo errHandler

DoCmd.OpenReport "Test Report", acViewPreview, , , acDialog

Exit Sub

errHandler:
Select Case Err.Number
Case 2501   ' Cancelled by user, or by NoData event.
    MsgBox "Report cancelled, or no matching data.", vbInformation, "Information"
Case Else
    MsgBox "Error " & Err & ": " & Error$, vbInformation, "Form_Open()"
End Select
Resume Next

End Sub

报告

Private Sub Report_Open(Cancel As Integer)
    Cancel = True
End Sub

【问题讨论】:

我无法重现您的错误。您是否在仅包含表单和报告的新数据库中尝试过上述代码?你最近有压缩修复反编译过吗? 感谢您的关注。我在另一台运行 Office 2010 和 Win7(与 Win8)的计算机上创建了一个新数据库。我复制并粘贴了我在此页面上发布的代码。完全相同的问题。 MSACCESS.EXE 仍以 0% CPU 利用率在任务管理器中运行。在我终止任务之前,无法打开其他 Access DB。我还验证了两台计算机上都安装了 SP1。 请见谅!我刚刚意识到重现错误还有一个步骤,那就是在运行代码后关闭数据库。是的,我收到了这个错误。 【参考方案1】:

本例出现问题的原因是acDialog:

 DoCmd.OpenReport "Test Report", acViewPreview, , , acDialog

我想你会发现:

 DoCmd.OpenReport "Test Report", acViewPreview

工作没有问题。

编辑重新评论

您不需要取消报告。在大多数情况下,避免错误比捕获错误更好,因此在打开表单之前检查数据并获取参数。将表单从报告打开事件移动到它自己的步骤,并在启动表单之前使用 DLookUp 或查询来检查数据。

【讨论】:

你是对的。删除 acDialog 参数确实避免了我的示例中的问题,但我需要将报告作为对话框打开。我尝试让 OpenReport() 默认为 acViewNormal 并在报表的属性中设置 Modal 和 PopUp,但结果与使用 acDialog 相同。有什么理由我不应该使用 acDialog?是否有其他方法可以让报表以对话框形式打开并仍支持取消? 为什么不使用报表的 NoData 属性来允许报表正确关闭? 如何处理“On No Data”事件?我相信在这种情况下设置“取消=真”以防止显示空报告是公认的做法,对吗?我用它来显示一个 msgbox,表明报告中没有要显示的数据。这会导致与 OpenReport() 完全相同的问题。 @iDevlop 问题是 acDialog,它不适用于 Cancel、AFAICT,因此我建议的解决方法。此外,您仍然会遇到用户取消问题。 顺便说一句,我不使用 No Data 事件作为规则。麻烦多于值得。【参考方案2】:

我无法测试这个问题,所以我只提供一个通用的解决方案:从报告定义中删除数据/记录集/记录源。

确定参数后,您可以将记录源应用于报表。如果报告被取消,它会在没有数据连接的情况下被取消。

【讨论】:

以上是关于MS Access - 通过取消报告创建的“幻影”进程的主要内容,如果未能解决你的问题,请参考以下文章

通过电子邮件发送 PDF 报告时触发 MS Access 宏

MS Access 对象(表格、报告)显示创建或修改日期

通过 C# 检查 MS Access 报告中现有标签的宽度

通过 VBA 自动使用查询从 Ms Access 2007 生成报告

ms-access 2007 年报告

编辑默认报告 - MS-Access