是否可以在Microsoft Access更新查询中以编程方式传递参数?

时间:2013-05-15 14:57:20

标签: vba ms-access parameters ms-access-2010

我有一个相当大的查询,加入了十几个表,我想根据id字段(例如between nStartID and nEndID)撤回记录。

我创建了两个参数并将它们作为标准进行测试,它们工作正常。

问题是,我需要在主查询中运行来自此主查询的插入查询,并且需要它们所在的参数。所以,我需要以编程方式将参数传递给它。

任何人都知道如何做到这一点?

感谢。

5 个答案:

答案 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 - 注意'!'语法是必不可少的 You can also use TempVars - note '!' syntax is essential

答案 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