Access: Abfragen mittels VBA ausführen
Gepostet am: Oct 02, 2013 8:8:45 PM
In Access gibt es zwei Möglichkeiten Abfragen programmatisch auszuführen:
1. gespeicherte Abfragen
2. SQL-Statements
gespeicherte Abfragen
Existiert bereits eine Access Abfrage, die man ausführen möchte, dann reicht ein DoCmd.OpenQuery um dies zu tun. Das ist beispielsweise dann interessant, wenn es sich um Update, Delete ... Abfragen handelt, da man so die Datenbasis sehr einfach bearbeiten kann.
Ausführen von Änderungsabfragen oder Löschabfragen (sog. Aktionsabfragen)
DoCmd.OpenQuery "qry_XXX"
Da derarige Abfragen meist störende Fenster öffnen, die darauf hinweisen, dass XY Datensätze gelöscht/geändert werden, kann man die OpenQuery-Befehle mit folgenden Code umschließen, und man bekommt keine lästigen Hinweise mehr:
DoCmd.SetWarnings False
DoCmd.Hourglass True
DoCmd.OpenQuery ....
DoCmd.SetWarnings True
DoCmd.Hourglass False
Das SetWarnings deaktiviert/aktiviert die Hinweise und das Hourglass ändert den Mauszeiger, damit man auch weiß, dass was geschieht.
Man kann den Abfragen auch Parameter übergeben:
Dim db As DAO.Database
Dim qdfTmp As DAO.QueryDef
Set db = CurrentDb
Set qdfTmp = db.QueryDefs("Name der Query")
qdfTmp.Parameters("NameParameter1") = "Parameterwert1"
qdfTmp.Parameters("NameParameter2") = "Parameterwert2"
DoCmd.SetWarnings False
DoCmd.OpenQuery "Name der Query"
DoCmd.SetWarnings True
Die Query dazu:
PARAMETERS [NameParameter1] Text(50), [NameParameter2] Text(50);
SELECT *
FROM MeineTabelle
WHERE Feld1 = [NameParameter1]
AND Feld2 = [NameParameter2];
vgl. dazu: http://donkarl.com/FAQ/FAQ3TAbfragen.htm#3.15
Meine bevorzugte Variante ist, die SQL-Abfrage mit Platzhalter zu versehen und diese mittels VBA zu ersetzen und wieder zurückzuschreiben.
Dim db As DAO.Database
Dim qdfTmp As DAO.QueryDef
Set db = CurrentDb
Set qdfTmp = db.QueryDefs("Name der Query")
Dim mySQL as String
mySQL = qdfTmp.SQL
mySQL = Replace(mySQL,"%Var%","richtiger Text")
qdfTmp.SQL = mySQL
DoCmd.SetWarnings False
DoCmd.OpenQuery "Name der Query"
DoCmd.SetWarnings True
Set qdfTmp = Nothing
Set db = Nothing
Alternative:
Dim db As DAO.Database
Dim qdfTmp As DAO.QueryDef
Set db = CurrentDb
Set qdfTmp = db.QueryDefs("Name der Query")
qdfTmp.Execute
Set qdfTmp = Nothing
Set db = Nothing
Anzeigen von Select-Abfragen:
DoCmd.OpenQuery "qry_Select1", , acReadOnly
SQL-Statement
SQL Statements kann man auch direkt ausführen.
Dim mySQL as String
mySQL = "UPDATE titles SET price = price * 1.10
DoCmd.RunSQL mySQL
oder mittels:
Dim mySQL as String
Dim db as Database
Set db = CurrentDB()
mySQL = "UPDATE titles SET price = price * 1.10
db.Execute mySQL
Set db = Nothing
Der Vorteil der zweiten Methode ist, dass man die Anzahl der geänderten Teilen mittels ... ermitteln kann. (vgl. MS Access: Determine number of records affected by an Execute command in Access 2003/XP/2000/97)
db.RecordsAffected