Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Wenn Sie Datenbankaktionen per Code ausführen, also beispielsweise mit der Methode Execute des Database-Objekts oder mit den DAO-Methoden AddNew oder Edit, setzen Sie in der Regel immer nur eine einzige Anweisung ab und ändern so Daten oder auch Tabellen. Was aber, wenn Sie mehrere Aktionen ausführen wollen, die nur dann ausgeführt werden sollen, wenn die Ausführung jeder einzelnen Aktion erfolgreich ist Dann kommen Transaktionen ins Spiel. Hierbei handelt es sich um einen Kontext über eine oder mehrere Datenbankänderungen, der nach dem Ausführung aller änderungen entweder komplett abgeschlossen oder verworfen werden kann.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1703_Transaktionen.accdb.
Möglichkeiten der änderung von Daten
Unter DAO gibt es verschiedene Möglichkeiten, per Code Daten zu ändern. Die erste Variante nutzt etwa die AddNew-Methode, um einen neuen Datensatz zu einem Recordset hinzuzufügen und schließt den Vorgang nach dem Festlegen der Feldinhalte mit der Update-Methode ab:
Public Sub Datenaenderungen() Dim db As DAO.Database Dim rst As DAO.Recordset Set db = CurrentDb Set rst = db.OpenRecordset("tblKategorien", dbOpenDynaset) rst.AddNew rst!Kategoriename = "Neue Kategorie" rst.Update End Sub
Hier gibt es keine offenen Fragen: Wenn keine Fehlermeldung erscheint, speichert die Prozedur den Datensatz wie gewünscht in der Datenbank. Ein Fehler tritt beispielsweise auf, wenn Sie zwei Mal den gleichen Wert für das Feld Kategoriename in der Datenbank speichern und den eindeutigen Index für dieses Feld verletzen. In diese Fall wird der Datensatz dann einfach nicht gespeichert.
Etwas anders sieht es aus, wenn Sie die Aufgaben mit der Execute-Methode ausführen und dazu eine entsprechende SQL-Abfrage formulieren. Ein ganz einfaches Beispiel sieht wie folgt aus:
Public Sub NeuerDatensatzExecute() Dim db As DAO.Database Set db = CurrentDb db.Execute "INSERT INTO tblKategorien (Kategoriename) VALUES('Noch eine Kategorie')" End Sub
Auch hier gilt: Der Datensatz wird entweder eingetragen oder auch nicht. über letzteres werden wir allerdings nicht informiert, denn wir haben den Wert dbFailOnError für den zweiten Parameter der Execute-Methode vergessen. Erst damit setzt es eine Fehlermeldung, wenn Sie beispielsweise versuchen, den gleichen Kategorienamen zwei Mal hintereinander einzufügen (siehe Bild 1).
Bild 1: Fehlermeldung beim Anlegen eines bereits vorhandenen Kategorienamens
Probleme mit mehreren betroffenen Datensätzen
Nun schauen wir uns an, was passiert, wenn wir mit einer Aktionsabfrage gleich mehrere Datensätze ändern wollen – beispielsweise, indem wir versuchen, alle Einzelpreise in der Tabelle tblArtikel um 10 EUR zu senken:
Public Sub MehrereDatensaetze() Dim db As DAO.Database Set db = CurrentDb db.Execute "UPDATE tblArtikel SET Einzelpreis = Einzelpreis - 10" Debug.Print "Betroffene Datensätze: " _ & db.RecordsAffected End Sub
Wir verwenden bewusst noch einmal die Variante der Execute-Methode ohnen den Wert dbFailOnError. Was geschieht Es wird natürlich keine Fehlermeldung ausgelöst und wir erhalten im Direktfenster die folgende Ausgabe:
Betroffene Datensätze: 38
Das heißt, dass von den 77 Datensätzen dieser Tabelle nur 38 geändert wurden. Bei den übrigen hat die Gültigkeitsregel gegriffen, die besagt, dass nur Werte größer oder gleich 0 in das Feld eingegeben werden dürfen. Welche Erkenntnis ziehen wir daraus Aktionsabfragen, die sich auf mehrere Datensätze beziehen, werden unter Umständen nicht komplett ausgeführt.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo