我有一个相当大的查询,加入了十几个表,我想根据 id 字段(例如: between nStartID and nEndID
)拉回记录。
我创建了两个参数并将它们作为标准进行了测试,它们工作正常。
问题是,我需要从这个主查询运行插入查询,并且需要主查询中的参数。所以,我需要以编程方式将参数传递给它。
任何人都知道如何做到这一点?
谢谢。
我有一个相当大的查询,加入了十几个表,我想根据 id 字段(例如: between nStartID and nEndID
)拉回记录。
我创建了两个参数并将它们作为标准进行了测试,它们工作正常。
问题是,我需要从这个主查询运行插入查询,并且需要主查询中的参数。所以,我需要以编程方式将参数传递给它。
任何人都知道如何做到这一点?
谢谢。
我刚刚对此进行了测试,它可以在 Access 2010 中使用。
假设您有一个带有参数的 SELECT 查询:
PARAMETERS startID Long, endID Long;
SELECT Members.*
FROM Members
WHERE (((Members.memberID) Between [startID] And [endID]));
您以交互方式运行该查询,它会提示您输入 [startID] 和 [endID]。这行得通,因此您将该查询保存为 [MemberSubset]。
现在您基于该查询创建一个 UPDATE 查询:
UPDATE Members SET Members.age = [age]+1
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset])));
您以交互方式运行该查询,并再次提示您输入 [startID] 和 [endID],它运行良好,因此您将其保存为 [MemberSubsetUpdate]。
您可以通过将 [startID] 和 [endID] 值指定为 [MemberSubsetUpdate] 的参数从 VBA 代码运行 [MemberSubsetUpdate],即使它们实际上是 [MemberSubset] 的参数。这些参数值“涓涓细流”到需要它们的地方,并且查询确实可以在没有人工干预的情况下工作:
Sub paramTest()
Dim qdf As DAO.QueryDef
Set qdf = CurrentDb.QueryDefs("MemberSubsetUpdate")
qdf!startID = 1 ' specify
qdf!endID = 2 ' parameters
qdf.Execute
Set qdf = Nothing
End Sub
尝试使用 QueryDefs。使用参数创建查询。然后使用这样的东西:
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb
Set qdf = dbs.QueryDefs("Your Query Name")
qdf.Parameters("Parameter 1").Value = "Parameter Value"
qdf.Parameters("Parameter 2").Value = "Parameter Value"
qdf.Execute
qdf.Close
Set qdf = Nothing
Set dbs = Nothing
非常感谢您提供有关使用 QueryDefs 集合的信息!我一直在想这个问题。
通过使用包含查询参数的表,我以不同的方式完成了它,而不使用 VBA。
例如:
SELECT a_table.a_field
FROM QueryParameters, a_table
WHERE a_table.a_field BETWEEN QueryParameters.a_field_min
AND QueryParameters.a_field_max
QueryParameters
有两个字段的表在哪里,a_field_min
以及a_field_max
如果您在子句GROUP BY
中包含查询参数字段,并且在子句中的参数字段上包含运算符,它甚至可以与 一起使用。GROUP BY
FIRST
HAVING
您也可以使用 TempVars - 注意 '!' 语法是必不可少的
已经有很多回复了,但你可以使用这个:
Sub runQry(qDefName)
Dim db As DAO.Database, qd As QueryDef, par As Parameter
Set db = CurrentDb
Set qd = db.QueryDefs(qDefName)
On Error Resume Next
For Each par In qd.Parameters
Err.Clear
par.Value = Eval(par.Name) 'try evaluating param
If Err.Number <> 0 Then 'failed ?
par.Value = InputBox(par.Name) 'ask for value
End If
Next par
On Error GoTo 0
qd.Execute dbFailOnError
End Sub
Sub runQry_test()
runQry "test" 'qryDef name
End Sub