我的数据库包含多个查询和表单,我们称之为Query1a
,Query1b
,Query2
和Form1
。
Form1
包含控件Text1
,ComboBox1
和按钮Command1
。
查询1a和1b明确引用Form1
上的控件,例如通过SELECT Forms!Form1!Text1 as Expr1
。 Query2
取决于查询1a和1b。
Command1
点击后运行DoCmd.OpenQuery "Query2"
,一切正常。
我有各种形式的结构与Form1
类似,我想将它们全部放在导航标签中。我转到create -> navigation -> horizontal tabs
并将Form1
拖到标签页。
现在,当我尝试在导航表单中使用Form1
时,会弹出Access并询问Text1
的值,因为Query1a
正在尝试查找它Forms!Form1
但我的Text1
真的住在Forms!NavigationForm!Form1.Form
。
我可以进入每个查询并更改代码以明确引用子表单,但这很乏味,不是很优雅,并且会破坏在导航表单之外使用表单的能力。< / p>
受到评论的启发,我也尝试了以下内容:
Query1a
和Query1b
Form1
的按钮中,我通过QueryDef
以编程方式设置参数。这样,我可以做类似的事情
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("Query1a")
qdf.Parameters("Forms!Form1!myparam").Value = Me!Text1
但是,我不知道从那里去哪里,因为我的QueryDef
对象对Query2
是不可见的。
让生活更轻松的一件事是让查询能够从调用它们的地方引用表单对象,但我不知道这是否可能。
答案 0 :(得分:1)
通过参数查询完成此操作,并通过QueryDef
将控件值传递给Query2
的参数。这是因为@VBlades在Pass parameter to a query from another query in Access
Access中的QueryDef对象可以查看查询的参数 建立在。 Say Query2是位于其上的查询 GET_CUSTOMER;你可以编写类似这样的代码: QueryDefs(“Query2”)。参数(“customer_id”)= 123,即使是 param不属于顶级。所以 因此,基础查询可以由更高级别的查询访问 (在我的头顶,我不知道如果有的话会发生什么 查询堆栈中具有相同名称的参数;我认为他们是 一旦设置参数,所有都给出相同的值)。是的,它可以 完成。
换句话说,我传递给查询的任何参数也会被依赖于它的所有查询看到。我不知道如果有名字冲突会发生什么。
所以我猜我的OP是一个骗局,但我花了一段时间才意识到......