Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

DoCmd.RunSQL und CurrentDB.Execute

Für die Ausführung von Aktionsabfragen per VBA gibt es zwei Möglichkeiten - mit DoCmd.RunSQL oder mit der Methode Execute des Database- oder Querydef-Objekts. Im folgenden finden Sie Know-how über die beiden Methoden und natürlich auch die Vor- und Nachteile.

Grundsätzliches

Der große Unterschied zwischen den beiden Methoden ist die Nähe zum System. Während die Execute-Methode eine Methode der DAO-Bibliothek ist, gehört die DoCmd.RunSQL-Methode zu der Access-Objektbibliothek.

Die DoCmd.RunSQL-Methode ist - wie alle anderen DoCmd-Befehle - eine VBA-Version von Access-Menü- und Symbolleisten-Befehlen. Sie können sie ausführen - oder Sie lassen es bleiben. Die Execute-Methode bietet wesentlich mehr Möglichkeiten: Sie können eine aussagekräftige Fehlerbehandlung einsetzen und eine oder mehrere Aktionsabfragen in eine Transaktion einbetten.

Einfache Beispiele

Um in Access schnell eine Aktionsabfrage auszuführen, gibt es zwei Möglichkeiten:

DoCmd.RunSQL "DELETE FROM tblTest"

oder

CurrentDB.Execute "DELETE FROM tblTest"

Beide haben Vor- und Nachteile, und die Wahl des einen oder anderen Mittels hängt vom Anwendungsfall ab.

Abfragen mit Parametern

Wenn eine Abfrage einen Parameter wie beispielsweise die ID des in einem Formular ausgewählten Datensatz, der durch einen Mausklick gelöscht werden soll, enthalten soll, können Sie beide Methoden verwenden.

Die beiden nachfolgenden Beispiele beschreiben die Vorgehensweise für die Verwendung einer einfachen gespeicherten Abfrage, deren SQL-Text folgendermaßen lautet:

DELETE *

FROM Artikel

WHERE [Artikel-Nr]=Forms!frmArtikel[Artikel-Nr];

Bei der DoCmd.RunSQL-Methode ist es ein wenig einfacher, denn hier fügen Sie einfach einen Verweis auf das entsprechende Steuerelement ein:

DoCmd.RunSQL "DELETE * FROM Artikel WHERE [Artikel-Nr] = Forms!frmArtikel![Artikel-Nr]"

Die Execute-Methode kann die in eine Abfrage eingebetteten Bezüge auf Steuerelemente in Formular nicht auflösen, da sie direkt auf die Datenbank-Engine zugreift. Die DoCmd.RunSQL-Methode als Methode der Access-Objektbibliothek ersetzt den Verweis auf das Formular direkt durch den im Steuerelement enthaltenen Wert. Um bei der Execute-Methode auch mit Bezügen auf Formulare arbeiten zu können, formulieren Sie die Anweisung folgendermaßen:

CurrentDB.Execute "DELETE * FROM Artikel WHERE [Artikel-Nr] = " & Forms!frmArtikel![Artikel-Nr]

Gespeicherte Abfragen ausführen

Gespeicherte Abfragen (das sind Abfragen, die unter einem bestimmten Namen im Register Abfragen des Datenbankfensters zu finden sind) können mit DoCmd.RunSQL nicht ausgeführt werden. Die Execute-Methode bietet diese Möglichkeit sehr wohl. Dies funktioniert beispielsweise folgendermaßen:

CurrentDB.Execute "qryAnfügeabfrage"

Wenn Sie in einer solchen Abfrage Parameter verwenden möchten, können Sie beispielsweise folgende Prozedur einsetzen:

Public Function Beispiel()

    Dim db As Database

    Dim qdf As QueryDef

    Set db = CurrentDb

    Set qdf = db.QueryDefs("qryAnfügeabfrageMitParameter")

    qdf.Parameters("Kategorie") = "Neue Kategorie"

    On Error Resume Next

    qdf.Execute dbFailOnError

    If Not Err = 0 Then

        MsgBox "Fehler: " & Err.Number & vbCrLf & "Fehlerbeschreibung: " & Err.Description

    End If

End Function

Hier wird der Wert des Parameters vor der Ausführung der Abfrage mit der entsprechenden Auflistung festgelegt.

Fehlerbehandlung

Die Fehlerbehandlung ist ein wichtiger Faktor bei der Durchführung von Aktionsabfragen.

Die DoCmd.RunSQL-Methode zeigt lediglich zusammenfassende Meldungen an, wenn bei der Durchführung der Abfrage eine Schlüsselverletzung auftritt oder die Operation aus irgendwelchen anderen Gründen nicht ausgeführt werden konnte.

Nachvollziehen können Sie dies mit folgender Anweisung, die in der Nordwinddatenbank im Testfenster ausgeführt wird und einen neuen Datensatz an die Tabelle Kategorien anfügen soll, der einen bereits vorhandenen Wert für das Primärschlüsselfeld Kategorie-Nr enthält:

DoCmd.RunSQL "INSERT INTO Kategorien([Kategorie-Nr], Kategoriename) VALUES(1,'Testkategorie')"

Die Durchführung dieser Abfrage führt zur Anzeige einer entsprechenden Meldung mit dem Hinweis, dass der Datensatz aufgrund einer Schlüsselverletzung nicht angefügt werden konnte.

Die Execute-Methode des Database-Objekts ist hier wesentlich flexibler: Mit der Standardeinstellung, also ohne weitere Argumente außer der reinen SQL-Anweisung, zeigt die Methode gar keine Fehler an.

Wenn Sie die Anweisung allerdings um den Parameter dbFailOnError erweitern, erscheint eine detaillierte Fehlermeldung mit Angabe der Fehlernummer und -beschreibung (Aufruf wiederum im Testfenster):

CurrentDB.Execute "INSERT INTO Kategorien([Kategorie-Nr], Kategoriename) VALUES(1,'Laber')", dbFailOnError

In Prozeduren und Funktionen angewandt, können Sie erst recht Nutzen aus dieser Fehlerbehandlung ziehen. Mit folgenden Anweisungen unterbinden Sie beispielsweise die Fehlermeldung und verarbeiten den Fehler selbst - und wenn Sie ihn nur im Testfenster ausgeben, wie in nachfolgendem Beispiel:

Public Function Beispiel()

    On Error Resume Next

    CurrentDb.Execute "INSERT INTO Kategorien([Kategorie-Nr], Kategoriename) VALUES(1,'Test')", dbFailOnError

    If Not Err.Number = 0 Then

        Debug.Print "Fehlernummer: " & Err.Number & vbCrLf & "Fehlerbeschreibung: " & Err.Description

    End If

End Function

Geschwindigkeit

Hier scheiden sich die Geister. Die meisten Stimmen lassen allerdings verlauten, die Execute-Anweisung sei schneller.

© 2003-2015 André Minhorst Alle Rechte vorbehalten.