2017-06-28 2 views
0

Ich versuche, eine Aktualisierungsabfrage in VBA auszuführen, und bin nicht sicher, was ich für den Code schreiben soll. Ich führe eine Abfrage aus, um das neueste Datum aus einer Tabelle zu finden. Diese Abfrage funktioniert einwandfrei. Jetzt möchte ich eine Aktualisierungsabfrage ausführen, um das Datumsfeld einer anderen Tabelle so zu aktualisieren, dass es dem abgefragten Datum entspricht. Hier ist, was ich habe:Ausführen von Update Qry in VBA basierend auf einem Abfragewert

Dim Date1 As Date 
Dim newdate1 

'selects datadate 1 
Date1 = CurrentDb.OpenRecordset("Select Max(Date1_Event) from TBL_Event WHERE ID = '" & [Forms]![FRM_Main]![ID] & "'")(0) 

'update datadate 1 
newdate1 = CurrentDb.OpenRecordset("Update Tbl_Name set CollectionDate = DataDate1 WHERE PID = '" & [Forms]![FRM_Main]![ID] & "'")(0) 

Gibt es eine Möglichkeit, eine Update-Abfrage wie folgt auszuführen? Vielen Dank.

Antwort

2

Aktionsabfragen sind (DELETE, UPDATE, INSERT INTO) ausgeführt werden (CurrentDb.Execute) während SELECT Abfragen als Cord-Sets (CurrentDb.OpenRecordset) zu öffnen sind.

Verwenden Sie darüber hinaus die Verwendung der Parametrisierung, um zu vermeiden, dass in der Abfrage ein Anführungszeichen oder eine Verkettung verwendet werden muss. Und hier wird das maximale Datum mit dem Domain-Aggregat DMax() berechnet, anstatt eine andere Abfrage zu öffnen.

Dim strSQL As String 
Dim qdef As Querydef 

' PREPARE SQL STATEMENT 
strSQL = "PARAMETERS [MaxDateParam] Date, [FormIDParam] Long;" _ 
      & "UPDATE Tbl_Name SET CollectionDate = [MaxDateParam]" _ 
      & " WHERE PID = [FormIDParam];" 

' BUILD TEMP QUERY 
Set qdef = CurrentDb.CreateQueryDef("", strSQL) 

' BIND PARAMETERS 
qdef!MaxDateParam = DMax("Date1_Event", "TBL_Event", "ID=" & [Forms]![FRM_Main]![ID]) 
qdef!FormIDParam = [Forms]![FRM_Main]![ID] 

' EXECUTE ACTION 
qdef.Execute dbFailOnError 

Set qdef = Nothing 

Obwohl oben kann ungewöhnlich und etwas mehr Linien aussehen. Lass dich nicht einschüchtern und laufe für die leichten 1-2 Zeilen. Die Parametrisierung ist eine Best Practice in der Programmierbranche, nicht nur in VBA, sondern in allen allgemeinen Sprachen, die dynamische SQL-Abfragen mit Werten aus Benutzereingaben ausführen.

+0

Vielen Dank! Ich habe mir selbst eine Menge Access/VBA selbst beigebracht, so dass ich normalerweise nicht einmal weiß, wo ich anfangen soll (ich habe sehr wenig/keine Programmiererfahrung ... lerne es, während ich mitfahre). Kennen Sie Ressourcen zum Erlernen von SQL/Abfragen in VBA? – xpandamonium

+0

Gibt es auch für das [MaxDateParam] eine Möglichkeit, das Datum, an dem es zieht, zu optimieren? Ich habe herausgefunden, dass ich die Abfrage ein wenig optimieren muss (ich möchte nicht unbedingt das maximale Datum. Meine Tabelle enthält eine Menge Einträge, die Daten aufzeichnen, also möchte ich das aktuellste Datum, das aufgezeichnet wurde. Zum Beispiel Ich könnte ein Datum vom 01.07.2017 haben, das am 6/1/2017 erfasst wurde, aber wenn ich ein Datum vom 6/15/2017 aufgenommen am 6/5/2017 aufzeichne, möchte ich, dass es auf das Datum aktualisiert wird, das war aufgezeichnet am 6/5/2017.) – xpandamonium

+0

Versuchen Sie es mit dem Domain-Aggregat [DLast()] (https://www.techonthenet.com/access/functions/domain/dlast.php), das den zuletzt gespeicherten Wert nach Kriterien zurückgibt. Es klingt aber auch so, als ob Sie ein * DateCreated * mit dem default '= Now()' oder * DateModified * -Feld haben möchten, wo eine Speicherfunktion im Formular dieses Feld aktualisiert. Dies wäre eine weitere SO Frage. – Parfait

Verwandte Themen