【问题标题】:Microsoft Access 2010 lag in continuous form header subformsMicrosoft Access 2010 在连续表单标题子表单中滞后
【发布时间】:2017-05-24 17:51:59
【问题描述】:

我是一名正在研究访问数据库的研究生,我在该数据库中创建了一个连续表格,该表格将用于一种滚动电子健康记录格式。标题包括有关患者的信息,连续形式方面是一系列患者就诊。在标题中,我有几个子表单,它们基于在标题中发布的患者 ID 号的链接(由 vba 宏生成,这样以前审查的患者不会被重新访问)填充。这些子表格似乎明显滞后,因此前一个患者的结果会一直保留到下一个患者。子表单包含用户选择的相关数据。每个表格都有自己的表格。它们主要基于患者 ID 进行链接。

我试过了:

  1. 标题详细信息上的宏:单击时,刷新。 - 似乎有效,但不是很优雅/直观
  2. 主窗体上的宏 - 与上面相同,但在加载、单击、获得焦点、失去焦点、打开、激活时 - 它们似乎都没有做任何事情。
  3. 在打开/等表单时通过 vba(见下文)强制重新查询。两种方法都没有奏效。试图在打开标题表单时运行这些。

    Public Function RequeryMain() Dim frmMain As Form Set frm = Forms("FRM_continuous_reports_patient") frm.Requery End Function

    Public Function RequeryHeader() Dim frmHeader As SubForm Set frmHeader = Forms("FRM_continuous_reports_patient").FRM_continuous_header_working frmHeader.Requery End Function

最后,用户不得不单击以清除表单以获取新条目是令人沮丧的。否则它会起作用。

最终目标是打开表单并根据最新的患者 ID 加载所有子表单。这可能必须涉及交错加载:(1)VBA 脚本根据某些特征选择下一个患者,并将患者 ID 传递给主窗体; (2)根据提交给它的patient_ID加载主连续表单; (3)加载标题子表单和其中的任何相关数据(尽管第一次看到这些应该是空白的); (4) 完成后,返回 (1)。

据我了解,这已经是它的工作方式,但是子表单加载太快了?我怎样才能解决这个问题?

希望有人可以帮助解释如何解决这个问题/纠正我对表单机制的任何误解。

【问题讨论】:

  • 由于子表单通常在主表单之前打开,您需要延迟子表单。看看:accessexperts.com/blog/2013/12/18/…
  • 感谢您向我指出这一点。因此,我将子表单更改为从原始患者 ID 调用。 (在打开表格之前,我将患者标记为“正在使用”)。我希望通过消除对主要形式的依赖,它可以解决这个问题,但它似乎没有改变任何东西?
  • 您是否看到该链接中的评论说“Ben 将在我们的下一篇文章中讨论在启动时禁用加载子表单。” “下一篇文章”在哪里是另一个链接?
  • 不,我错过了!迅速跳到下一位。我对其中的代码有点困惑。 (1)我放置这是主要形式还是标题?具体来说,此代码用于表单的何处? (2) 这涉及删除每个子窗体的源对象,然后在主窗体加载后重新分配它? (3) 案例如何运作?我以前没有使用过它们。我主要使用 Python。 VBA 只适用于这个项目。感谢您的耐心等待!
  • 1) 可能以 Open 或 Load 或 Current 事件的形式出现。 2) 是的。 3)谷歌。构建代码并测试。如果您有问题,请发布一个新问题。

标签: forms vba ms-access


【解决方案1】:

我知道这听起来很奇怪,但子表单实际上是在父表单之前加载的。子窗体显示滞后不是我遇到过的。不应该需要代码并且可能不会更正。必须与表单/子表单设计有关,也许是他们的 RecordSource。必须检查 db 才能确定。

不必为了重新查询而在 VBA 中创建表单对象。主窗体后面是代码吗? Me.Requery 足以满足主要形式。我总是给子表单容器一个与其所持有的对象不同的名称,例如 ctrPatient。然后只需Me.ctrPatient.Requery

为什么不将子表单放在详细信息部分?

【讨论】:

  • 你是对的。实际上,我已将它们放在详细信息部分而不是正确的标题中。刚刚尝试将 Me.Requery 放在标题表单的 Private Sub Form_Load() 中,但它似乎也不起作用。我想我可能误会了什么?谢谢
  • 那么为什么子窗体在主窗体 Header 而不是 Detail 中?我从来没有遇到过这个问题,因此从未尝试过任何这样的代码。不,子表单 Load 中的 Requery 代码不起作用,主要是因为尚未加载主表单。必须是引用子表单的主表单事件中的代码。这就是我的回答所描述的。
【解决方案2】:

回答您的问题,并提供在以下位置引用的逻辑的精简版本:https://accessexperts.com/blog/2014/01/07/delay-loading-subforms-in-access/

是:

  1. 在设计视图中,将您的子表单 SourceObject 设置为“”(并保存您的表单)
  2. 当您准备好显示子表单时,只需执行:Me..SourceObject = ""
  3. 当您准备好导航到 NEXT 患者时,清除子表单链接:Me..SourceObject = ""

现在应该可以解决主副数据不同步的问题了。

您不需要使用 CASE 语句,但它们的运行就像您将一堆“If”/“ElseIf”都依偎在一起一样——除了 CASE 更容易理解。它基本上从变量中获取值(即 Select Case MyVariable);然后检查它是否等于您想要的(案例 1、案例 2 等),如果是,则执行您编写的任何代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2012-11-04
    • 2016-11-17
    • 2012-11-01
    相关资源
    最近更新 更多