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