相关查询和引用子表单控件

Posted

技术标签:

【中文标题】相关查询和引用子表单控件【英文标题】:Dependent queries and referencing subform controls 【发布时间】:2014-10-08 15:17:28 【问题描述】:

情况

我的数据库包含几个查询和一个表单,我们称它们为Query1aQuery1bQuery2Form1

Form1 包含控件Text1ComboBox1 和一个按钮Command1

Form1 上明确查询 1a 和 1b 引用控件,例如通过SELECT Forms!Form1!Text1 as Expr1Query2 取决于查询 1a 和 1b。

Command1 在点击时运行DoCmd.OpenQuery "Query2",一切正常。

问题

我有各种结构类似于Form1 的表单,我想将它们全部放在导航选项卡中。我转到create -> navigation -> horizontal tabs 并将Form1 拖到一个选项卡。

现在,当我尝试在导航表单中使用Form1 时,Access 会弹出并询问我Text1 的值,因为Query1a 试图在Forms!Form1 中查找它,但我的@ 987654343@真的住在Forms!NavigationForm!Form1.Form

尝试

我可以进入每个查询并更改代码以显式引用子表单,但这很乏味,不是很优雅,而且会破坏在导航表单之外使用表单的能力。

受 cmets 启发,我也尝试了以下方法:

    Query1aQuery1b 添加参数声明 在Form1 的按钮中,我通过QueryDef 以编程方式设置参数。这样,我可以做类似的事情 Dim qdf As DAO.QueryDef Set qdf = CurrentDb.QueryDefs("Query1a") qdf.Parameters("Forms!Form1!myparam").Value = Me!Text1

但是,我不知道从那里去哪里,因为我的 QueryDef 对象对 Query2 是不可见的。

让生活更轻松的一件事是让查询能够从它们被调用的地方引用表单对象,但我不知道这是否可能。

【问题讨论】:

有一个语法用于引用父/子;它有点复杂。主参考是access.mvps.org/access/forms/frm0031.htm @Smandoli 您发布的链接似乎是 VBA 语法。对于我的问题中的简单示例,我可以使用 VBA 构建 SQL 字符串并执行它。但是,实际上,我在 Access 数据库中有想要利用的复杂查询,并且在 VBA 方面重做所有事情是不可行的。如果我误解了,请告诉我。 更正了 VBA 上下文。但是SELECT Forms!Form1!text1 AS Expr1 是 SQL 和 Object/VBA 语法的混合体。很难说你在做什么! 我不知道在 Access SQL 中引用表单的惯用方式是什么,但该查询运行良好(不涉及 VBA。)它只是从 Form1!text1 中提取值。我想我想要的是查询中的Me.text1 之类的东西,Access 可以理解Me 是调用查询的子表单对象。 MS Access: How to Supply Parameters to a Query-Based Subform Control的可能重复 【参考方案1】:

最终通过参数查询完成此操作,并通过QueryDef 将控件值传递给Query2 的参数。这是因为@VBlades 在Pass parameter to a query from another query in Access 中的评论而起作用的@

Access中的QueryDef对象可以看到他们查询的参数 建立在。说 Query2 是位于顶部的查询 GET_CUSTOMER;你可以编写类似这样的代码: QueryDefs("Query2").Parameters("customer_id") = 123,即使 param 不属于顶层。所以参数 因此,更高级别的查询可以访问底层查询 (在我的头顶,我不知道如果有会发生什么 查询堆栈中的同名参数;我认为他们是 一旦设置了参数,所有这些都被赋予相同的值)。所以是的,它可以是 完成。

换句话说,我传递给查询的任何参数也会被依赖它的所有查询看到。我不知道如果有名字冲突会发生什么。

所以我猜我的 OP 是个骗子,但我花了一段时间才意识到......

【讨论】:

非常有趣。感谢您提供该文章的摘录和链接。

以上是关于相关查询和引用子表单控件的主要内容,如果未能解决你的问题,请参考以下文章

MS Access = 引用子表单中的控件

在展开父表单的第一行之前,无法引用 Access 子表单表单对象

循环引用导致内存泄漏?

如何根据在表单上的组合框控件中输入的内容从查询中选择所有记录

尝试使用基于子表单控件的 DoCmd.OpenForm 打开表单

选项卡式控件上的 MS Access 2007 引用子窗体控件返回 null