如果使用acDialog(使用DoCmd.OpenForm)打开窗体,则调用例程的执行将暂停执行,直到窗体关闭或不可见为止。使用invisible方法可以使调用例程从表单中收集数据。
我曾希望报告能够以同样的方式工作。也就是说,使用acDialog和DoCmd.OpenReport打开报表。不幸的是,当报表不可见时,它消失了,但没有将控制权返回给调用例程。
这是Access中的错误吗?有人知道做这项工作的方法吗?我将数据传递回调用例程的替代方法都很丑陋。例如,使用全局变量或让报表在关闭之前将数据插入回其调用方(这需要让报表了解其调用方)。
答案 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
因此,此方法提供了一种很好的干净方法来对调用表单进行任何操作,并且调用表单的名称不是硬编码的。
除了上述内容之外,这还意味着您不必以“对话”形式启动表单,这当然不仅会停止调用代码,而且会阻止使用功能区或自定义菜单等。
因此,这意味着您必须将要在调用表单中运行的“其他”代码放在单独的子目录中,然后从按下按钮的报告中调用该代码以关闭或执行任何操作。你想要的。