web-dev-qa-db-ja.com

Microsoft Access更新クエリでプログラムでパラメーターを渡すことは可能ですか?

かなり大きなクエリがあり、1ダース以上のテーブルに参加しているので、idフィールドに基づいてレコードをプルバックしたい(e.g。between nStartID and nEndID)。

2つのパラメーターを作成し、基準としてテストしましたが、正常に機能します。

問題は、このメインクエリから挿入クエリを実行する必要があり、メインクエリ内のパラメータが必要なことです。そのため、プログラムでパラメーターを渡す必要があります。

誰がこれを行うことができるかについての手がかりがありますか?

ありがとう。

34
Jav

これをテストしたところ、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]として保存します。

[MemberSubsetUpdate]のパラメーターとして[startID]および[endID]の値を指定することにより、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
60
Gord Thompson

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
22
Jessica

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の2つのフィールドを持つテーブルです。

GROUP BY句にクエリパラメータフィールドを含め、HAVING句のパラメータフィールドにFIRST演算子を含めると、GROUP BYでも使用できます。

4
Nigel

TempVarsを使用することもできます-「!」に注意してください構文は不可欠です You can also use TempVars - note '!' syntax is essential

3
Dougie

既に多くの回答がありますが、これを使用できます:

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
0
Patrick Honorez