it-swarm.com.de

Ist es möglich, Parameter programmatisch in einer Microsoft Access-Aktualisierungsabfrage zu übergeben?

Ich habe eine ziemlich große Abfrage, die über ein Dutzend Tabellen verbindet, und ich möchte Datensätze zurückholen, die auf einem ID-Feld basieren (beispiels [: between nStartID and nEndID).

Ich habe zwei Parameter erstellt und als Kriterien getestet und sie funktionieren einwandfrei.

Das Problem ist, ich muss eine Einfügeabfrage von dieser Hauptabfrage ausführen und benötige die Parameter, in denen sie sich befinden, in der Hauptabfrage. Ich muss also programmgesteuert Parameter übergeben. 

Hat jemand eine Ahnung, wie das geht?

Vielen Dank.

32
Jav

Ich habe das gerade getestet und es funktioniert in Access 2010.

Angenommen, Sie haben eine SELECT-Abfrage mit Parametern:

PARAMETERS startID Long, endID Long;
SELECT Members.*
FROM Members
WHERE (((Members.memberID) Between [startID] And [endID]));

Sie führen diese Abfrage interaktiv aus, und Sie werden nach [startID] und [endID] gefragt. Das funktioniert, also speichern Sie diese Abfrage als [MemberSubset].

Jetzt erstellen Sie eine UPDATE-Abfrage, die auf dieser Abfrage basiert:

UPDATE Members SET Members.age = [age]+1
WHERE (((Members.memberID) In (SELECT memberID FROM [MemberSubset])));

Sie führen diese Abfrage interaktiv aus, und Sie werden erneut nach [startID] und [endID] gefragt. Sie funktioniert einwandfrei und speichert sie als [MemberSubsetUpdate].

Sie können [MemberSubsetUpdate] aus dem VBA-Code ausführen, indem Sie [startID] und [endID] als Parameter für [MemberSubsetUpdate] angeben, auch wenn sie tatsächlich Parameter von [MemberSubset] sind. Diese Parameterwerte "rinnen" dahin, wo sie benötigt werden, und die Abfrage funktioniert ohne menschliches Eingreifen:

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
58
Gord Thompson

Versuchen Sie es mit den QueryDefs. Erstellen Sie die Abfrage mit Parametern. Dann verwenden Sie so etwas:

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

Vielen Dank für die Informationen zur Verwendung der QueryDefs-Sammlung! Ich habe mich schon eine Weile darüber gewundert.

Ich habe es anders gemacht, ohne VBA zu verwenden, indem ich eine Tabelle mit den Abfrageparametern verwendete.

Beispiel: SELECT a_table.a_field FROM QueryParameters, a_table WO A_table.a_field ZWISCHEN QueryParameters.a_field_min AND QueryParameters.a_field_max

Wobei QueryParameters eine Tabelle mit zwei Feldern ist, a_field_min und a_field_max

Es kann sogar mit GROUP BY verwendet werden, wenn Sie die Abfrageparameterfelder in die GROUP BY-Klausel und den FIRST-Operator in die Parameterfelder der HAVING-Klausel aufnehmen.

4
Nigel

Sie können auch TempVars verwenden - beachten Sie '!' Syntax ist unerlässlich You can also use TempVars - note '!' syntax is essential

1
Dougie

Viele Antworten bereits, aber Sie können dies verwenden:

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