|
|
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.
|
|