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 

Links: