2010-10-01 94 views
0

在Access 2007中,我设置了一个表单,允许预览和导出项目报告的选项。DoCmd.OutputTo On报告不会卸载

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

如果我做

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

然后,聚焦和控制返回到正在执行的形式正常进行。

如果我出口,而不是直接和使用

DoCmd.OutputTo acOutputReport, szReportName

然后,该报告是正确的出口,但从来没有控制返回到执行方式。它完全禁用。相同的代码工作得很好,如果我打开报告时使用Modal = False。我对报告的事件钩子进行了一些试验,试图找出差异是什么,OutputTo被调用后,OnUnload从未被击中。


我知道我可以解决此仅做报告模式,当我需要它是模式的,但它绝对是最容易做的从报表的代码中,而不是模块的打开它,我真的不要以为我应该有这个问题。我也没有问题,从VBA出口从预览模式的报告,而不是直接的,但显然是客户没有...

所以,实际的问题:

  1. 有没有什么好的理由OutputTo不触发Unload事件?如果这是正常的行为,那很好,但我至少想知道它的原因。
  2. 有没有办法导出模态报告并仍然重新获得对其他窗口的控制权?或者至少,这是一种不可靠的方式来重新启用并将焦点放在呼叫形式上?

回答

0

你的第一个代码:

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

...是要出错了,如果报告模式。在第一行打开的报告关闭之前,第二行的原因是无法执行的。所以,只要你到了第二行,你会得到一个错误,因为该报告没有打开任何再受这一点。

你需要做的是没有设置在报表的属性表的方式是什么,但在DoCmd.OpenReport命令:

DoCmd.OpenReport szReportName, acViewPreview, , , acDialog 

的acDialog开关打开它模态,而且代码将暂停,直到报告关闭,然后继续。

但是,当您使用DoCmd.OutputTo时,它将正常运行,因为报告不是模态的。

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

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

但是您从标准访问实践的角度来看事情是逆向的。我不知道你为什么拒绝在调用代码中设置窗口模式,因为这意味着你可以在任何上下文中使用报表,而不必担心代码担心报表本身的问题。我总是认为报告和表格应该尽可能地愚蠢,只知道自己,并让调用的上下文具有所有的智能(尽管根据需要尽可能少地调用被调用的表单/报告的内部内容)。

+0

我同意在报告代码中设置模态(或任何)属性并不理想。说实话,我没有把它放在那里,我只是想维持以前的行为。我相信Modal被用来代替acDialog,因为我们不希望报告处于PopUp模式。无论如何,我抵制acDialog,因为它的行为与Modal属性不同 - 它仍然允许我将焦点转换为呼叫形式。我忘了它确实应该是相同的,所以看起来我应该在报告中寻找其他问题,导致acDialog不能以模态方式运行。 – Jelly 2010-10-04 15:26:41

+0

Popup和Modal是两种完全不同的属性,使用acDialog打开表单或报表不会导致表单/报表处于Popup模式。基本上,据我所知,acDialog导致Modal和Popup属性被忽略。 – 2010-10-04 18:49:21

+0

我刚刚使用acDialog测试了一个从命令按钮打开的报告,并且无论Modal/Popup属性设置为什么,我都无法将焦点设置回调用窗体,直到报告预览关闭。 – 2010-10-04 18:50:13