2013-05-15 4 views
25

Ich habe eine Abfrage, die ziemlich groß ist, zusammen über ein Dutzend Tabellen, und ich möchte Datensätze basierend auf einem ID-Feld zurückziehen (z. B.: between nStartID and nEndID).Ist es möglich, programmgesteuert Parameter in einer Microsoft Access-Update-Abfrage zu übergeben?

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

Das Problem ist, muss ich eine Einfügeabfrage von dieser Hauptabfrage ausführen, und benötigen die Parameter, wo sie sind, in der Hauptabfrage. Also, ich muss Parameter programmgesteuert übergeben.

Jeder hat eine Ahnung, wie das gemacht werden kann?

Danke.

+0

Ich habe eine Lösung für meine Bedürfnisse, aber nicht sicher, ob es das Beste ist.Ich habe globale Variablen für die nStartID und nEndID erstellt, dann erstellen Sie einfach eine Funktion für jede, wie in getStartID() und getEndID(), die diese Werte lesen. Dann verwende ich diese Funktionen nur in der Where-Klausel der ursprünglichen Abfrage. Nicht die eleganteste Lösung, aber es funktioniert. Ich lasse das offen für den Fall, dass jemand anderes Erfahrung hat, die sie teilen möchten, zum Wohle anderer. Danke für Ihre hilfreiche Eingabe. – Jav

Antwort

47

ich dies nur getestet und es funktioniert in Access 2010

Sagen Sie bitte eine SELECT-Abfrage mit Parametern haben:

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

Sie diese Abfrage interaktiv ausführen und es fordert Sie auf [startID] und [ End-ID]. Das funktioniert, also speichern Sie diese Abfrage als [MemberSubset].

Sie nun eine UPDATE-Abfrage auf der Grundlage dieser Abfrage erstellen:

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

Sie führen die Abfrage interaktiv und wieder werden Sie aufgefordert, für [startID] und [endID] und es funktioniert gut, so dass Sie es als sparen [MemberSubsetUpdate].

Sie können [MemberSubsetUpdate] aus VBA-Code ausführen, indem Sie [startID] und [endID] -Werte als Parameter für [MemberSubsetUpdate] angeben, obwohl sie tatsächlich Parameter von [MemberSubset] sind. Diese Parameterwerte „trickle down“, wo sie gebraucht werden, und die Abfrage ohne menschliches Zutun funktioniert:

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 
+0

Danke für das Teilen, ich habe ähnlichen Code gefunden, aber nichts so gut erklärt. – Jav

4

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

Ich habe es anders gemacht, ohne VBA zu verwenden, indem ich eine Tabelle verwende, die die Abfrageparameter enthält.

ZB: SELECT a_table.a_field VON Query, a_table WHERE a_table.a_field ZWISCHEN QueryParameters.a_field_min UND QueryParameters.a_field_max

Wo Query eine Tabelle mit zwei Feldern ist, a_field_min und a_field_max

Es kann sogar Wird mit GROUP BY verwendet, wenn Sie die Abfrageparameterfelder in die GROUP BY-Klausel und den FIRST-Operator in die Parameterfelder der HAVING-Klausel einfügen.

16

Verwenden Sie die QueryDefs. Erstellen Sie die Abfrage mit Parametern. Dann verwenden Sie etwas wie folgt:

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

Ich denke, Sie können auch auf '.Parameters' durch Nummer verweisen, wie' qdf.Parameters (1) .Value = "Parameter Value" '. Nicht sicher, ob es auf Null basiert. –

+1

Das stimmt, und ich bestätige, dass es null basiert. –

1

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

Verwandte Themen