Home > Artikel > Ausgabe 12/2012 > DAO: Querydefs und Parameterabfragen unter VBA

DAO: Querydefs und Parameterabfragen unter VBA

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Mit der QueryDefs-Auflistung greifen Sie per VBA auf die in einer Datenbank gespeicherten Abfragen zu, legen neue Abfragen an oder öffnen Abfragen mit Parametern per VBA. Sie können damit sogar temporäre Abfragen erstellen, die Sie nur einmal benötigen, und diese anschließend wieder löschen. Dieser Artikel zeigt alle Tricks rund um die Arbeit mit dem QueryDef-Objekt.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1212_QueryDefs.mdb.

Das QueryDef-Objekt

Ein QueryDef-Objekt ist die Repräsentation einer Abfrage unter VBA beziehungsweise DAO. Sie können mit DAO beispielsweise die Namen aller in der Datenbank gespeicherten Abfragen ausgeben, deren SQL-Code ansehen, neue Abfragen anlegen oder bestehende Abfragen löschen.

Wenn Sie beispielsweise alle Abfragen der Datenbank im Direktfenster auflisten möchten, erstellen Sie eine kleine VBA-Prozedur. Dazu benötigen Sie zunächst ein Standardmodul. Öffnen Sie mit Strg + G oder Alt + F11 den VBA-Editor und wählen Sie den Menüeintrag Einfügen|Modul. Speichern Sie das Modul mit Strg + S unter dem Namen mdlQuerydefs.

Nun fügen Sie dem Modul die folgende Prozedur hinzu:

Public Sub AbfragenAuflisten()

     Dim db As DAO.Database

     Dim qdf As DAO.QueryDef

     Set db = CurrentDb

     For Each qdf In db.QueryDefs

         Debug.Print qdf.Name

     Next qdf

     Set db = Nothing

End Sub

Platzieren Sie die Einfügemarke innerhalb der Prozedur und betätigen Sie die Taste F5, um die Prozedur auszuführen. Was geschieht? Die Prozedur gibt alle in der Datenbank enthaltenen Abfragen im Direktfenster aus (siehe Bild 1).

Ausgabe aller Abfragen der Datenbank

Bild 1: Ausgabe aller Abfragen der Datenbank

Das Ergebnis ist interessant: Dort finden sich nämlich nicht nur die im Navigationsbereich beziehungsweise im Datenbankfenster sichtbaren Abfragen, die normalerweise mit dem Präfix qry versehen werden, sondern auch noch Einträge, die mit dem Tilde-Zeichen beginnen (~).

Dabei handelt es sich um solche Abfragen, die als Datenherkunft etwa für Formular, Berichte oder Kombinationsfelder angelegt wurden.

Wenn Sie beispielsweise ein Formular namens frmArtikel anlegen und diesem eine Abfrage als Datenherkunft zuweisen, wird diese unter dem Namen ~sq_ffrmArtikel ausgegeben. Wenn Sie ein Formular namens frmMitCboArtikel und einem Kombinationsfeld namens cboArtikel anlegen und dem Kombinationsfeld eine Abfrage als Datensatzherkunft zuweisen, finden Sie unter den Abfrage mit obiger Prozedur einen Eintrag namens ~sq_cfrmMitCboArtikel~sq_ccboArtikel vor. Die Namen dieser versteckt gespeicherten Abfragen werden also aus dem Formularnamen und, wenn ein Kombinationsfeld oder ein Listenfeld im Spiel ist, auch noch aus dem Namen des Steuerelements gebildet – dieser Exkurs nur als Erläuterung diese kryptisch anmutenden Abfragenamen.

Was genau erledigt nun die oben vorgestellte Prozedur? Sie deklariert zunächst eine Objektvariable namens db, welche einen Verweis auf das Database-Objekt zur aktuellen Datenbank aufnimmt. Eine weitere Objektvariable soll später mit Verweisen auf die QueryDef-Objekte der Datenbank gefüttert werden, was der gespeicherten Definition einer Abfrage entspricht. Und dies bezieht sich, wie oben angeführt, nicht nur auf die durch den Benutzer gespeicherten Abfragen, sondern auch auf die Datenherkünfte und datensatzherkünfte von Formularen, Berichten, Kombinationsfeldern und Listenfeldern.

Die Variable db wird nun mit einem Verweis auf das Database-Objekt gefüllt. Die Variable qdf wird in einer For Each-Schleife nacheinander mit Verweisen auf alle in der QueryDefs-Auflistung enthaltenen QueryDef-Objekte versehen.

Die einzige Anweisung innerhalb der For Each-Schleife gibt den Namen des jeweiligen QueryDef-Objekts im Direktfenster aus.

Mit der QueryDefs-Auflistung können Sie noch weitere Dinge tun – zum Beispiel die Anzahl der QueryDef-Objekte der aktuellen Datenbank ermitteln. Das geht ganz schnell über das Direktfenster, wie Bild 2 zeigt. Die QueryDefs-Auflistung können Sie dabei auch direkt als Elemente der CurrentDB-Funktion verwenden, ein vorheriges Referenzieren mit einer Database-Variablen wie etwa db ist gar nicht nötig.

Abfrage der Anzahl der QueryDef-Objekte

Bild 2: Abfrage der Anzahl der QueryDef-Objekte

SQL-Ansicht anzeigen

Wenn Sie eine Abfrage bearbeiten, verwenden Sie dazu in der Regel die Entwurfsansicht (siehe Bild 3). Sie können dies allerdings auch in der SQL-Ansicht erledigen, die Sie ebenfalls in der Abbildung vorfinden. Den dort dargestellten SQL-Code liefert auch das QueryDef-Objekt.

SQL-Ansicht einer Abfrage

Bild 3: SQL-Ansicht einer Abfrage

Wenn Sie schnell einmal den SQL-Ausdruck einer Abfrage ermitteln möchten, können Sie dies mit der folgenden Anweisung im Direktfenster erledigen:

Debug.Print CurrentDb.QueryDefs("qryArtikelMitA").SQL

Das Ergebnis sieht dann genauso aus wie in der SQL-Ansicht:

SELECT tblArtikel.ArtikelID, tblArtikel.Artikelname

FROM tblArtikel

WHERE (((tblArtikel.Artikelname) Like 'A*'));

In diesem Fall geben Sie in Klammern hinter der QueryDefs-Auflistung den Namen der gewünschten Abfrage an und fragen den Wert der Eigenschaft SQL ab. Natürlich können Sie diese Abfrage auch in die eingangs vorgestellte Prozedur einbauen und so nicht nur die Namen, sondern auch den SQL-Ausdruck aller Abfragen ausgeben – hier der geänderte Code-Ausschnitt:

For Each qdf In db.QueryDefs

     Debug.Print qdf.Name

     Debug.Print qdf.SQL

Next qdf

Eine Abfrage anlegen

Wenn Sie mit VBA eine Abfrage anlegen möchten, verwenden Sie dazu die CreateQueryDef-Methode des Database-Objekts. Die folgende Beispielprozedur erstellt zunächst mit db einen Verweis auf die aktuelle Datenbank und führt dann die CreateQueryDef-Methode aus. Dann legt sie die beiden Eigenschaften Name und SQL fest. Dies sind alle notwendigen Informationen. Allerdings erscheint die Abfrage auf diese Weise noch nicht im Datenbankfenster beziehungsweise im Navigationsbereich – und sie wird auch noch nicht in der Datenbank gespeichert. Dies erledigt erst der Aufruf der Append-Methode der QueryDefs-Auflistung mit der Objektvariablen qdf als Parameter:

Public Sub AbfrageAnlegen_Lang()

     Dim db As DAO.Database

     Dim qdf As DAO.QueryDef

     Set db = CurrentDb

     Set qdf = db.CreateQueryDef

     With qdf

         .Name = "qryTest_II"

         .SQL = "SELECT * FROM tblKategorien"

     End With

     db.QueryDefs.Append qdf

     Set db = Nothing

End Sub

Dies war die übersichtliche Variante. Sie können sich auch einige Zeilen sparen. Dazu geben Sie die beiden Eigenschaften Name und SQL direkt beim Aufruf der CreateQueryDef-Methode an. Die neue Abfrage erscheint dann direkt nach dem Aktualisieren des Datenbankfensters beziehungsweise Navigationsbereichs:

Public Sub AbfrageAnlegen_Kurz()

     Dim db As DAO.Database

     Dim qdf As DAO.QueryDef

     Set db = CurrentDb

     Set qdf = db.CreateQueryDef("qryTest", _

         "SELECT * FROM tblKategorien")

     Set db = Nothing

End Sub

Wenn Sie eine solche Prozedur mehrfach hintereinander ausführen, löst dies einen Fehler aus: Die Abfrage qryTest ist dann nämlich bereits vorhanden und kann nicht neu erzeugt werden (Laufzeitfehler 3012, Objekt 'qryTest' ist bereits vorhanden).

Also fügen Sie vorn eine Anweisung ein, welche diese Abfrage vorher löscht:

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!