DoCmd.OutputTo On报告无法卸载

时间:2010-10-01 17:11:14

标签: ms-access ms-access-2007 access-vba

在Access 2007中,我设置了一个表单,允许预览和导出项目报告的选项。

在处理Modal属性设置为true的报表时,DoCmd.OutputTo似乎表现得很奇怪。对于我正在使用的所有报告,Modal当前在Open事件中设置为True。

如果我这样做

DoCmd.OpenReport szReportName, acViewPreview
DoCmd.Close acReport, szReportName

然后,焦点和控制通常会返回到执行表格。

如果我直接导​​出并使用

DoCmd.OutputTo acOutputReport, szReportName

然后,报告正确导出,但控件永远不会返回到执行表单。它完全禁用了。如果我在打开报告时使用Modal = False,则相同的代码可以正常工作。我尝试了一下报告的事件挂钩,尝试找出差异是什么,OnUnload在调用OutputTo之后永远不会被击中。


我知道我可以解决这个问题,只需要在我需要模态时​​生成报表模式,但是从报表的代码内部而不是打开它的模块来看它绝对是最简单的,我真的不认为我应该这样做有这个问题。我也没有问题从预览模式导出报告而不是直接从VBA导出,但显然客户确实...

所以,实际问题:

  1. OutputTo有没有充分的理由不触发Unload事件?如果这是正常行为,那么很好,但我至少想了解它的原因。
  2. 有没有办法导出模态报告并仍然重新获得对其他窗口的控制?或者至少是一种重新启用并重点关注调用表单的非hacky方式?

1 个答案:

答案 0 :(得分:0)

您的第一个代码:

  DoCmd.OpenReport szReportName, acViewPreview
  DoCmd.Close acReport, szReportName
如果报告是模态的,那么

...会出错。之所以在第一行打开的报表关闭之前无法执行第二行。因此,一旦到达第二行,就会出现错误,因为此时报告不再打开。

您需要做的不是在报告的属性表中设置模态,而是在DoCmd.OpenReport命令中设置:

  DoCmd.OpenReport szReportName, acViewPreview, , , acDialog 

acDialog开关以模态方式打开它,代码将暂停直到报告关闭,然后继续。

但是当你使用DoCmd.OutputTo时,它会表现正常,因为报告不是模态的。

通常在Access表单和报表中,您根本不需要设置Modal属性,因为您始终可以在运行时以模态方式打开它。

我不知道为什么你认为你需要在报告的OnOpen事件中设置模态属性。那里不需要代码,我认为这不是改变它的好地方(并且预计它不会起作用,因为在窗口创建之后你无法真正改变窗口模式;也许OnOpen在创建可见窗口之前执行?)。

但是,从标准Access实践的角度来看,您正在做一些事情。我不知道你为何拒绝在调用代码中设置窗口模式,因为这意味着你可以在任何上下文中使用报告,而不必担心报告本身内部的问题。我一直认为报告和表格应尽可能愚蠢,只知道自己,并让调用语境中包含所有智能(尽管在必要时对被调用表格/报告的内部内容进行了少量探讨)。