Tipps "n" Tricks
Anwender-Software - Access

Last Update: 24. Dezember 2001/Webmaster

SQL-Abfragen im VBA-Code einfacher erzeugen

Thema:

Access 97/2000/2002

SQL-Abfragen im VBA-Code sind praktisch, um schnell auf einzelne Datensätze zurückzugreifen, um ganze Recordsets zu erzeugen, um per Makro neue Tabellen anzulegen und und und... Nicht ganz einfach ist allerdings die fehlerfreie Eingabe der SQL-Syntax, vor allem wenn Sie mit Tabellen arbeiten, die über Beziehungen verknüpft sind. Sie ersparen sich eine Menge Arbeit, indem Sie komplexe Abfragen zuerst im normalen Entwurfsbereich von Access zusammenstellen und anschliessend den zugrundeliegenden SQL-Text in Ihr Code-Modul kopieren.

Nehmen Sie als Beispiel die mit Access ausgelieferte Demo-Datenbank NORDWIND.MDB. Sie umfasst unter anderem ein komplexes Bestellsystem mit Artikel-, Kunden- und Bestelltabellen. Angenommen, Sie wollten nun im Rahmen einer VBA-Routine die Jahresumsätze einzelner Kunden ermitteln. Die erforderliche SQL-Abfrage muss die Beziehungen zwischen den Tabellen berücksichtigen und auch noch Gebrauch von Gruppierungs- und Summenfunktionen machen. Wenn Sie auf einer normalen Abfrage aufbauen, ist die Eingabe dennoch in kürzester Zeit erledigt.

Öffnen Sie also die Nordwind-Datenbank in Access und wechseln Sie auf das Register "Abfragen". Legen Sie eine neue Abfrage in der Entwurfsansicht an. Fügen Sie nacheinander die Tabellen "Kunden", "Bestellungen" sowie "Bestelldetails" hinzu und bearbeiten Sie dann den Abfrageentwurf.

Übernehmen Sie nur das Feld "Firma" aus der Tabelle "Kunden" direkt in die Feldliste der Abfrage. In die angrenzenden Feldspalten tragen Sie berechnete Felder ein; zuerst das Bestelljahr in der Form:

Bestelljahr: Jahr([Bestellungen].[Bestelldatum])

In der nächsten Feldspalte berechnen Sie die Bestellsumme mit folgender Formel:

Bestellsumme: [Bestelldetails].[Anzahl]*
[Bestelldetails].[Einzelpreis]


Damit nur die Jahressummen ausgewiesen werden, lassen Sie sich per Ansicht-Funktionen die Zeile mit den Abfragefunktionen anzeigen. Darin wählen Sie in der dritten Spalte anstelle von "Gruppierung" den Eintrag "Summe" aus.

Legen Sie darüber hinaus ein Kriterium für die Jahreszahl fest, indem Sie in die Zeile Kriterien der zweiten Spalte zum Beispiel "1996" eingeben. Da die Bestelldaten je nach eingesetzter Access-Version variieren, wechseln Sie kurz in die Datenblattansicht der Abfrage, um zu überprüfen, ob überhaupt Datensätze zurückgegeben werden. Bei Bedarf ändern Sie in der Entwurfsansicht das Jahreskriterium.

Den SQL-Text, der hinter der Abfrage steckt, können Sie bereits in ein VBA-Modul einbinden, um ein Recordset-Objekt anzulegen. Um ein Beispiel zu liefern, das tatsächlich eine Aktion ausführt, gehen wir an dieser Stelle aber noch einen Schritt weiter und wandeln die Auswahlabfrage in eine Tabellenerstellungsabfrage um. Dazu rufen Sie Abfrage-Tabellenerstellungsabfrage auf, geben im Feld Tabellenname "Jahreswerte" ein und klicken auf Ok.

Für die VBA-Programmierung benötigen Sie jetzt den SQL-Text, auf dem die Abfrage aufbaut. Den lassen Sie sich mit dem Befehl Ansicht-SQL bzw. Ansicht-SQL-Ansicht anzeigen. Markieren Sie, sofern das noch nicht der Fall ist, die gesamte SQL-Anweisung und kopieren Sie sie mit Strg+C in die Zwischenablage.

Anschliessend aktivieren Sie das VBA-Codefenster, in dem Sie die SQL-Abfrage benötigen, und drücken Strg+V, um den Text aus der Zwischenablage einzufügen. Im Beispiel legen Sie dafür auf dem Datenbankregister "Module" ein neues Modul an. Im zugehörigen Codefenster geben Sie als erstes ein Prozedurgerüst wie dieses ein:

Sub Jahresumsatz()
Dim Jahreszahl As Integer
Dim SQLText As String

  Jahreszahl = InputBox("Umsatz für welches Jahr?")
  SQLText =
End Sub


Hinter dem letzten Gleichheitszeichen drücken Sie dann Strg+V, womit Sie die zuvor kopierte SQL-Anweisung einfügen.

Das Ganze hat noch einen Haken, denn Access verteilt die Anweisung automatisch auf mehrere Zeilen, ohne Zeilenfortsetzungszeichen einzufügen. Ausserdem muss die gesamte Anweisung in Anführungszeichen gesetzt werden, damit sie im Rahmen der VBA-Prozedur als Text erkannt wird. Setzen Sie also zunächst am Anfang und am Ende des SQL-Textes Anführungszeichen und entfernen Sie sämtliche Zeilenvorschübe oder bauen Sie Zeilenfortsetzungen (& _) ein, wie es hier zu sehen ist:

SQLText = "SELECT Kunden.Firma, Year([Bestellungen]." & _
 "[Bestelldatum]) AS Bestelljahr, " & _
 "Sum([Bestelldetails].[Anzahl]*[Bestelldetails]." & _
 "[Einzelpreis]) AS Bestellsumme " & _
 "INTO Jahreswerte " & _
 "FROM (Kunden INNER JOIN Bestellungen ON Kunden." &_
 "[Kunden-Code] = Bestellungen.[Kunden-Code]) " & _
 "INNER JOIN Bestelldetails ON Bestellungen." & _
 "[Bestell-Nr] = Bestelldetails.[Bestell-Nr] " & _
 "GROUP BY Kunden.Firma, Year([Bestellungen]." &_
 "[Bestelldatum]) " & _
 "HAVING (((Year([Bestellungen].[Bestelldatum]))=1996));"


Falls innerhalb der ursprünglichen SQL-Anweisungen Anführungszeichen auftreten - beispielsweise für Textkriterien -, so müssen Sie sie in einfache Hochkommas (') umwandeln.

Um die Jahresausgabe variabel zu gestalten, ersetzen Sie den festen Text "1996" durch die Variable "Jahreszahl". Dazu ändern Sie das Ende des SQL-Textes in

... HAVING (((Year([Bestellungen].[Bestelldatum]))=
" & Jahreszahl & "));"


Nun müssen Sie ans Ende der Prozedur nur noch eine Anweisung setzen, die die SQL-Abfrage ausführt, und zwar:

DoCmd.RunSQL SQLText

Schneller und sicherer lassen sich SQL-Abfragen kaum in VBA-Programme einbinden. Wenn Sie die eben erstellte Prozedur ausführen, fragt Sie Access zuerst nach einer Jahreszahl. Geben Sie einen passenden Wert ein. Anschliessend erhalten Sie den üblichen Hinweis, dass so und so viele Zeilen in eine Tabelle eingefügt werden. Bestätigen Sie dies mit Ja, um die neue Tabelle mit den Jahresumsätzen anzulegen.

 

Tipps "n" Tricks
Anwender-Software - Access