我有一个相当大的查询,加入了十几个表,我想根据id字段(例如:between nStartID and nEndID
)撤回记录。
我创建了两个参数并将它们作为标准进行测试,它们工作正常。
问题是,我需要在主查询中运行来自此主查询的插入查询,并且需要它们所在的参数。所以,我需要以编程方式将参数传递给它。
任何人都知道如何做到这一点?
感谢。
答案 0 :(得分:58)
我刚刚对此进行了测试,它可以在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
答案 1 :(得分:20)
尝试使用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
答案 2 :(得分:4)
非常感谢有关使用QueryDefs集合的信息!我一直想知道这件事。
我使用包含查询参数的表,以不同的方式,不使用VBA。
E.g: 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子句中包含查询参数字段,并且在HAVING子句中的参数字段中包含FIRST运算符,它甚至可以与GROUP BY一起使用。
答案 3 :(得分:1)
你也可以使用TempVars - 注意'!'语法是必不可少的
答案 4 :(得分:0)
已经有足够的回复,但是您可以使用此:
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