访问:使用从另一个查询中选择的 DAO.recordset 运行查询

Posted

技术标签:

【中文标题】访问:使用从另一个查询中选择的 DAO.recordset 运行查询【英文标题】:Access: Running query with DAO.recordset that selects from another query 【发布时间】:2016-08-05 18:19:00 【问题描述】:

我有一个带有文本字段的访问表单和一个子表单。文本字段是名为 myQuery 的查询的参数,子表单显示 myQuery 的结果。

在 VBA 中,我想访问 myQuery 的第一行,所以我尝试使用 DAO.recordsets,如下所示:

dim query as string
dim rs as DAO.recordset
query = "select top 1 * from myQuery"
set rs=CurrentDb.OpenRecordset(query)

我收到一条错误消息,提示“参数太少”。

如果我转到创建查询选项卡,并运行 SQL 代码“从 myQuery 中选择前 1 个*”,它就可以工作。我猜当通过CurrentDb.OpenRecordset 运行查询时,您不能像使用常规 SQL 那样将另一个查询视为表。

有谁知道如何使用OpenRecordset从另一个查询中进行选择?

问候

【问题讨论】:

您保存的查询引用了表单上的控件,因此当您调用保存的查询时,它会尝试评估 Forms!SomeForm!TextField 作为参数,而不是查看实际的控件本身。删除保存的查询并将完整的查询文本放入您的 query 字符串变量中。 谢谢,通过一些调整,我能够让你的方法发挥作用。 或者如果查询复杂到不想将整个 SQL 放到 VBA 中,可以使用这个:***.com/a/32118340/3820271 【参考方案1】:

考虑使用 querydef 并在打开记录集之前评估参数。但是,在此实例中不能使用特定的SELECT 表达式,只能使用整个查询对象。 TOP 1 可以通过选择记录集值进行镜像,而无需循环(因为它首先选择)。

Dim db As DAO.Database
Dim qdf As DAO.querydef
Dim rst As DAO.Recordset

Set db = CurrentDb
Set qdf = db.QueryDefs("myQuery")
For Each prm In qdf.Parameters
    prm.Value = Eval(prm.Name)
Next prm

Set rst = qdf.OpenRecordset(dbOpenDynaset)
rst.MoveFirst

Debug.Print rst.Fields(0), rst.Fields(1), rst.Fields(2), rst.Fields(3), rst.Fields(4)

【讨论】:

以上是关于访问:使用从另一个查询中选择的 DAO.recordset 运行查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在访问中使用 VB 从选择查询中填充组合框?

Oracle SQL:从一个表中选择一个计数,从另一个表中使用子查询缩小选择范围

Laravel 查询构建器 - 从另一个表中选择前 1 行

仅当从另一个查询中选择时,SQL Select 语句才突然检索错误值

从另一个表中选择查询

从一个视图中选择数据并使用该数据从另一个视图中进行选择