表单/查询对嵌入另一个表单后停止工作

Posted

技术标签:

【中文标题】表单/查询对嵌入另一个表单后停止工作【英文标题】:Form/Query couple stops working once embedded in another Form 【发布时间】:2020-05-04 18:06:05 【问题描述】:

[在 MS Access 2019 Professional Plus 2019 中工作。但这并不重要。] 我的设置可以缩小到这个层次结构,它本身就可以很好地工作:

'------> Hierarchy of objects :

"myMainForm" contains :
    "select_client" (ComboBox based on "client" table)
    "select_status" (ComboBox based on "status" table)
    ' and some multi-select checkboxes that forbid use of Master/Child feature
    "mySubForm" 
        "Source Object" : "myQuery" ' "mySubForm" not saved with an explicit name, local to "myMainForm"

"mQuery" filters the table "course" :
    "client_ID" criteria : [Forms]![myMainForm]![select_client]
    "status_ID" criteria : [Forms]![myMainForm]![select_status]

'------> "myMainForm" VBA to requery on change (could be performed with Macros) :

Private Sub select_client_Change()
    Me!mySubForm.Requery
End Sub

Private Sub select_status_Change()
    Me!mySubForm.Requery
End Sub

然后我尝试将“myMainForm”嵌入到更高级别的表单中(比如说“myNavForm”):

"myNavForm" contains :
    "myMainForm" contains :
        ' same as above from there
        "mySubForm"

当我尝试运行"myNavForm" 时,系统提示我输入[Forms]![myMainForm]![select_client][Forms]![myMainForm]![select_status],而"myMainForm" 完全停止工作。

我首先认为问题与触发 "myQuery" 时尚未加载 ComboBox 值有关,因此我将以下 VBA 添加到 "myMainForm"

Private Sub Form_Load()
    Me!mySubForm.SourceObject = "Query.myQuery"
    Me!mySubForm.Requery
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Me!mySubForm.SourceObject = ""
End Sub

但问题仍然存在。我想它来自我这边的范围/路径错误,但我无法弄清楚。如上所示,我在"myQuery" 中尝试了绝对路径。我还尝试使用带有.Parent 的相对路径,但无法使"myMainForm" 使用它(甚至没有嵌入"myNavForm")。

因此,我被困住了,被搞砸了,绝望了,我想要我的 Node/MongoDB 环境,但我必须在 Access 中执行此操作(不要问!)。

知道如何使它与嵌入一起工作吗?尽可能地,我宁愿坚持这种设置并避免输入更复杂的 VBA(语法让我头疼),但如果需要,我愿意接受 ;-)

感谢任何帮助我摆脱噩梦的帮助!


[编辑:我的用例中的解决方案基于接受的答案(供未来的读者使用!)]

感谢@Olivier,这是完美运行的解决方案:

'------> Hierarchy of objects :

"myMainForm" contains :
    "select_client" '(ComboBox based on "client" table)
    "select_status" '(ComboBox based on "status" table)
    "mySubForm" 
        "Source Object" : "myQuery" 'remove all criteria from the query !

' ------> Handle the rest in VBA :

'Lets write this only once...
Private Sub updateResult()
    mySubForm.Form.Filter = "client_ID=" & select_client & " AND status_ID=" & select_status
    mySubForm.Form.FilterOn = True
End Sub

'Apply filter with default values upon loading
Private Sub mySubForm_Current()
    updateResult
End Sub

'Update filter whenever a control is updated
Private Sub select_client_AfterUpdate()
    updateResult
End Sub
Private Sub select_status_AfterUpdate()
    updateResult
End Sub

总而言之,我终于有了一个很好的框架,可以在任何控件更新后即时更新任何多条件查询,并立即在表单上查看结果,就像任何现代 GUI 一样!再次感谢奥利维尔!

【问题讨论】:

【参考方案1】:

这是因为您的select_client 有另一条路径。现在是

[Forms]![myNavForm]![myMainForm].Form![select_status]

myMainForm 现在是一个子窗体控件。它的名称可能与包含的表单不同。

不要将此类路径包含在查询中,而是尝试像这样过滤子表单

mySubForm.Form.Filter = "client_ID=" & select_client & " AND status_ID=" & select_status
mySubForm.Form.FilterOn = True

您可以在这两个字段的更新后事件和表单 OnCurrent 事件中这样做。

【讨论】:

谢谢/谢谢!它完美地工作(经过一段时间重构)!我只是不明白每次过滤器更改后.FilterOn 的需要/含义,以及.Current 事件处理形式的需要/含义(尽管检查了文档)。你能准确地说出这些要求,我将永远感激不尽!? Current 事件在表单加载记录时触发(如果表单绑定到表或查询)。它只是进行初始过滤。如果主表单未绑定到记录,则可以省略它(除非两个过滤器字段具有必须从一开始就应用的默认值。)。 FilterOn 允许您启用或禁用过滤器。如果它没有工作,只需删除此行。 好的!在我的情况下似乎不需要FilterOn [还]。我需要Current 用我的默认值初始化过滤器。您的回答比最初计划的要好得多,并且允许我在只需要一张表时摆脱查询!谢谢你/谢谢! 我的错,FilterOn 是必需的!你的回答简直太离谱了:-)更新了我的问题,为未来的读者添加了完整的解决方案

以上是关于表单/查询对嵌入另一个表单后停止工作的主要内容,如果未能解决你的问题,请参考以下文章

在Django中提交表单后停止页面重定向

向我的表单集添加新的内联时,我的日期选择器停止工作

当表单出现验证错误时,rails bootstrap popover 停止工作

Yii2 ActiveForm 停止工作

空闲后查询停止工作

C# 从另一个线程调用 form.show()