MS Access:使用acDialog打开的报表在不显示时不会返回控制权

时间:2018-07-02 01:28:36

标签: ms-access

如果使用acDialog(使用DoCmd.OpenForm)打开窗体,则调用例程的执行将暂停执行,直到窗体关闭或不可见为止。使用invisible方法可以使调用例程从表单中收集数据。

我曾希望报告能够以同样的方式工作。也就是说,使用acDialog和DoCmd.OpenReport打开报表。不幸的是,当报表不可见时,它消失了,但没有将控制权返回给调用例程。

这是Access中的错误吗?有人知道做这项工作的方法吗?我将数据传递回调用例程的替代方法都很丑陋。例如,使用全局变量或让报表在关闭之前将数据插入回其调用方(这需要让报表了解其调用方)。

1 个答案:

答案 0 :(得分:0)

如前所述,报表通常不需要太多的交互,并且通常不需要返回数据(报表中的哪些数据将会改变?)。

但是,您可以采用相对的“干净”方式将值返回到调用表单,这在表单中很好用,在报表中也很好用(但是如前所述,报告很少会返回数据,因为它们往往不会改变任何东西。

因此,您要做的就是在加载(或报告)表单中获取对调用表单的引用,如下所示:

Option Compare Database
Option Explicit

Public frmPrevious     As Form

Private Sub Command67_Click()
   ' this is our report close button code
   ' we can set, call, or do ANYTHING to the calling 
   ' form - including setting controls or running code

   frmPrevious!Text18 = Now()
   frmPrevious.Refresh
   Call frmPrevious.MyCodeToRun

   DoCmd.Close

End Sub

Private Sub Report_Open(Cancel As Integer)

   Set frmPrevious = Screen.ActiveForm

End Sub

因此,以上是报告中的代码。请注意,我们可以在调用表单中设置任何值,设置任何控件,运行任何代码,甚至“刷新”调用表单。

因此,您可以自由地从先前的表单中获取值,可以自由地返回值,设置控件或运行代码,或在该调用表单中使用ANY属性或方法。

实际上,作为一种编码标准,我经常为“大多数”表格创建一个frmPrevious值。因此,现在在我的表单(或报表)代码中,您始终可以引用或对上一个调用表单进行任何操作。

例如:

frmPrevous.Requery      ‘ requery data in calling form

‘强制以以前的格式写入数据

if frmPrevious.Dirty = true then
   frmPrevious.Dirty = false
End if

’获取调用前一个表单的表单的名称。

frmPrevious.frmPrevious.Name

因此,此方法提供了一种很好的干净方法来对调用表单进行任何操作,并且调用表单的名称不是硬编码的。

除了上述内容之外,这还意味着您不必以“对话”形式启动表单,这当然不仅会停止调用代码,而且会阻止使用功能区或自定义菜单等。

因此,这意味着您必须将要在调用表单中运行的“其他”代码放在单独的子目录中,然后从按下按钮的报告中调用该代码以关闭或执行任何操作。你想要的。