5

我在 Windows 的 Access 2010 中遇到了一个问题:

  1. 使用 doCmd.OpenReport 启动报告
  2. 在与报告关联的事件中设置“Cancel = True”
  3. 关闭访问
  4. 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
4

2 回答 2

5

这种情况下出现问题的原因是acDialog:

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

我想你会发现:

 DoCmd.OpenReport "Test Report", acViewPreview

工作没有问题。

编辑重新评论

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

于 2013-01-01T01:02:48.560 回答
0

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

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

于 2013-01-03T12:18:46.580 回答