Navigation

SQL und VBA

SQL und VBA


Wofür braucht man SQL-Anweisungen in VBA?

Ganz einfach, man kann damit die Datenherkunft von Objekten zur Laufzeit zuweisen,
bestehende Abfragen verändern oder auch Aktionsabfragen ausführen.
Eine in VBA zusammengestellte Abfrage ist wesentlich flexibler, als eine statische Abfrage.
Wie macht man das? Als 1. erstellt man sich eine oder mehrere Variablen, die den SQL-Code enthalten und baut diese dynamisch auf.
Danach übergibt man sie dem Objekt an der 'passenden' Stelle. Ein paar Beispiele:

Dim strSQL As String

strSQL = "SELECT * "
strSQL = strSQL & "FROM Tabelle
strSQL = strSQL & "WHERE Feld = Wert"



Für die Zuweisung als Datenherkunft eines Formulars verwendet man nun die RecordSource:

'Hauptformular:
Me.RecordSource = strSQL
'Unterformular:
Me!UnterformularSteuerelement.RecordSource = strSQL



Für ein Kombinations- oder Listenfeld verwendet man die RowSource. Eventuell muss man auch noch den Typen auf eine Tabelle/Abfrage ändern:

Me!Kombifeld.RowSource = strSQL

Me!Listenfeld.RowSourceType = "Table/Query"
Me!Listenfeld.RowSource = strSQL



Für Abfragen kann man das QueryDef-Objekt aus der DAO-Bibliothek verwenden:

Dim strSQL As String
Dim qdf As DAO.QueryDef

strSQL = "SELECT * "
strSQL = strSQL & "FROM Tabelle
strSQL = strSQL & "WHERE Feld = Wert"

Set qdf = DBEngine(0)(0).QueryDefs("DeineAbfrage")
qdf.SQL = strSQL
Set qdf = Nothing



Und um Aktionsabfragen auszuführen kann man die Execute-Methode der CurrentDb oder auch der DBEngine verwenden:

Dim strSQL As String

strSQL = "DELETE * FROM Tabelle"

DBEngine(0)(0).Execute strSQL



Der Vorteil gegenüber des DoCmd.RunSQL ist, dass man die Warnmeldungen nicht erst ausschalten und dann wieder einschalten muss.
Ein weiterer Vorteil ist, dass man sich mit der Option dbFailOnError auch eine Fehlermeldung ausgeben lassen kann und ein Rollback stattfindet.





Was muss man dabei beachten oder macht es nicht immer so?

Eine gespeicherte Abfrage liegt in kompilierter Form vor, dass muss bei einer VBA-Anweisung erst noch gemacht werden. Deswegen kann es zu einem Performanceverlust
kommen, wenn man die gleiche Abfrage in VBA oder als gespeicherte Abfrage verwendet.

Desweiteren muss man den SQL-Code teilweise überarbeiten, da sich die beiden Sprachen ins Gehege kommen, wenn man in einer SQL-Anweisung zB " oder & verwendet.
Dieses kann man mit der Chr()-Funktion umgehen, mit der man Zeichen erzeugen kann, ohne sie tatsächlich zu schreiben:

SELECT Feld1 & " - " & Feld2 FROM Tabelle
strSQL = "SELECT Feld1 " & Chr(38) & Chr(34) & " - " & Chr(34) & Chr(38) & " Feld2 FROM Tabelle