Datenmakros III: Ereignisse

Mit der Einführung von Datenmakros mit in Access 2010 bietet sich nun auch für Access-Benutzer die Möglichkeit, über eine Art Trigger Aktionen auszuführen, die in Zusammenhang mit dem Anlegen, ändern oder Löschen von Datensätzen stehen. Dieser Artikel stellt die verschiedenen Ereignisse vor und zeigt, wie Sie diese programmieren.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1406_Makros.accdb.

Datenereignisse

Access bietet seit Access 2010 die folgenden Tabellenereignisse an:

  • Vor änderung
  • Vor Löschung
  • Nach Einfügung
  • Nach Aktualisierung
  • Nach Löschung

Wir schauen uns in den folgenden Abschnitten einfache Beispiele für diese Ereignisse an und zeigen Ihnen, welche Besonderheiten diese jeweils aufweisen. Die Ereignisse können Sie auf zwei verschiedenen Wegen festlegen:

  • über die Ribbon-Einträge unter Tabelle|Vorabereignisse und Tabelle|Nachfolgeereignisse der Datenblattansicht der Tabelle (siehe Bild 2) und
  • Schaltflächen zum Hinzufügen von Tabellenereignissen in der Datenblattansicht

    Bild 1: Schaltflächen zum Hinzufügen von Tabellenereignissen in der Datenblattansicht

  • über die Ribbon-Einträge unter Entwurf|Feld-, Datensatz- und Ta-bel-len-er-eig-nisse|Da-ten-makros er-stellen der Entwurfsansicht einer Tabelle (siehe Bild 3).
  • Schaltflächen zum Hinzufügen von Tabellenereignissen in der Entwurfsansicht

    Bild 2: Schaltflächen zum Hinzufügen von Tabellenereignissen in der Entwurfsansicht

Die Beispieldatenbank enthält eine einfache Tabelle namens tblKunden, die wie in Bild 1 aussieht. An dieser Tabelle demonstrieren wir die nachfolgenden Beispiele.

Tabelle zum Darstellen der Möglichkeiten von Tabellenereignissen

Bild 3: Tabelle zum Darstellen der Möglichkeiten von Tabellenereignissen

Mögliche Makrobefehle

Je nachdem, welches Datenmakro Sie verwenden, stehen Ihnen unterschiedliche Makrobefehle zur Verfügung.

Einen sehr eingeschränkten Vorrat an Makrobefehlen finden Sie für die beiden Datenmakros Vor änderung und Vor Löschung vor:

  • Gruppieren: Fasst mehrere Befehle zu einer Gruppe zusammen.
  • Kommentar: Erlaubt die Eingabe eines Kommentars.
  • Wenn: Bedingungsblock
  • AuslösenFehler: Löst einen Fehler aus, der allerdings nur in der Protokolltabelle landet.
  • BeiFehler: Aktiviert die Fehlerbehandlung.
  • FestlegenFeld (nur in Vor änderung, nicht in Vor Löschung): Legt den Wert eines Feldes der aktuellen Tabelle fest, die das Datenmakro ausgelöst hat. In den übrigen Tabellenereignissen nur über DatensatzBearbeiten und DatensatzErstellen verfügbar.
  • FestlegenLokaleVar: Legt eine lokale Variable fest.
  • LöschenMakroFehler: Setzt das MakroError-Objekt zurück.
  • NachschlagenDatensatz: Wie DLookup.
  • StoppMakro: Beendet das Makro.

Für die drei Datenmakros Nach Einfügung, Nach Aktualisierung und Nach Löschung stehen noch einige weitere Makrobefehle zur Verfügung:

  • AusführenDatenmakro: Ruft ein weiteres Datenmakro auf.
  • BeendenFürJedenDatensatz: Beendet eine FürJedenDatensatz-Schleife.
  • DatensatzBearbeiten: Bearbeitet einen Datensatz. Darin Zuweisung der Werte mit FestlegenFeld.
  • DatensatzErstellen: Erstellt einen neuen Datensatz. Darin Zuweisung der Werte mit FestlegenFeld.
  • DatensatzLöschen: Löscht einen Datensatz.
  • FürJedenDatensatz: Wie Do While Not rst.EOF-Schleife.
  • ProtokollierenEreignis: Trägt ein Ereignis in die Tabelle USysApplicationLog ein.
  • SendenEMail: Sendet eine E-Mail.
  • StoppAlleMakros: Beendet alle Makros, auch diejenigen, die das aktuelle Makro aufgerufen haben.

In den drei Makros Nach Einfügung, Nach Aktualisierung und Nach Löschung gibt es keinen direkten Zugriff auf den Makrobefehl FestlegenFeld.

Kein Wunder: Dieser steht im Datenmakro Vor änderung auch nur bereit, weil er sich auf die Felder der aktuellen Tabelle bezieht.

Aus einem anderen Grund fehlt der Befehl im Datenmakro Vor Löschung komplett: Es würde ja keinen Sinn machen, einen Feldwert vor dem Löschen noch zu ändern.

Spezielle Tabellen, Felder und Funktionen

Wenn Sie Werte in die Eigenschaften der Makroaktionen eintragen wollen und den ersten Buchstaben eintippen, erhalten Sie gleich per IntelliSense alle möglichen Vorschläge.

Noch besser gelingt dies, wenn Sie innerhalb eines Eigenschaftsfeldes die Tastenkombination Strg + Leertaste betätigen. Der Makroeditor zeigt dann direkt alle zur Verfügung stehenden Elemente an (siehe Bild 4).

Auswahl der Elemente per IntelliSense

Bild 4: Auswahl der Elemente per IntelliSense

Nachfolgend finden Sie eine Auflistung spezieller Elemente inklusive der Tabellenereignisse, welche diese zur Verfügung stellen:

  • Aktualisiert (Vor änderung, Nach Einfügung, Nach Aktualisierung, Vor Löschung, Nach Löschung): Gibt an, ob der Wert des als Parameter angegebenen Feldes geändert wurde. Das dieser auch in den beiden Ereignissen Vor Löschung und Nach Löschung angeboten wird, ist nicht wirklich sinnvoll – was spielt es für eine Rolle, ob ein zu löschender Datensatz zuvor geändert wurde
  • Alt (Vor änderung, Vor Löschung, Nach Einfügung, Nach Aktualisierung, Nach Löschung): Ermöglicht den Zugriff auf den Datensatz vor der änderung. Dabei verwenden Sie statt des Tabellennamens einfach den Namen Alt, zum Beispiel Alt!KundeID.
  • IstEingefügt (Vor änderung): Prüft, ob der geänderte Datensatz soeben geändert oder eingefügt wurde.
  • LetztesErstellenDatensatzID (Nach Einfügung, Nach Aktualisierung, Nach Löschung): Damit können Sie, wenn Sie von einem Makro aus einen Datensatz anlegen, gleich den Primärschlüsselwert dieses Datensatzes ermitteln (sofern es sich um einen Autowert handelt).
  • MakroErneutGestartet (Nach Einfügung, Nach Aktualisierung, Nach Löschung): Liefert eine Information, ob das Makro durch das gleiche Makro neu gestartet wurde. Wenn Sie beispielsweise in einem Nach Aktualisierung-Makro wieder ein Feld des gleichen Datensatzes aktualisieren, löst dies wieder das gleiche Datenmakro aus. Wenn dies nicht geschehen soll, können Sie dies durch das Makro abfangen.
  • MakroError (Vor änderung, Vor Löschung, Nach Einfügung, Nach Aktualisierung, Nach Löschung): Liefert Informationen über den zuletzt aufgetretenen Fehler.
  • Rückgabevariablen (Nach Einfügung, Nach Aktualisierung, Nach Löschung): Wenn Sie ein weiteres Datenmakro aufrufen und dieses Rückgabevariablen liefert, können Sie diese über dieses Objekt auslesen.

Anwendung der fünf Tabellenereignisse

Beginnen wir mit dem Anlegen eines Datensatzes. In diesem Fall können Sie lediglich das Tabellenereignis Nach Einfügung nutzen. Dieses erlaubt es beispielsweise,

  • eine E-Mail zu verschicken und jemanden über das Anlegen des Datensatzes zu informieren,
  • das Anlegedatum und den Benutzer, der den Datensatz angelegt hat, zu speichern,
  • ein Feld mit einem Standardwert zu füllen, der nicht über die dafür vorgesehene Eigenschaft ermittelt werden kann.

Aber warum gibt es überhaupt kein Tabellenereignis, das vor dem Anlegen eines Datensatzes ausgelöst wird In der Tat gibt es dieses sehr wohl, allerdings etwas versteckt: Das Tabellenereignis Vor änderung wird nämlich auch beim Anlegen eines Datensatzes ausgelöst. Mit der Eigenschaft IstEingefügt können Sie dann ermitteln, ob ein neuer Datensatz eingefügt oder ein bestehender Datensatz geändert werden soll.

Beim ändern eines Datensatzes können Sie zwei Ereignisse programmieren: Vor änderung und Nach Aktualisierung (nur Microsoft weiß, warum dies nicht Vor änderung und Nach änderung oder Vor Aktualisierung und Nach Aktualisierung heißt …).

Im Ereignis Vor änderung prüfen Sie, ob eine änderung überhaupt zulässig ist oder nicht. Falls ein Feld eine von Ihnen definierte Bedingung nicht erfüllt, rufen Sie einfach die Makroaktion AuslösenFehler auf und geben damit – nebst Abbruch der änderung – eine entsprechende Meldung aus.

In diesem Ereignis können Sie ebenfalls bereits Feldwerte der aktuellen Tabelle anpassen.

Das Löschen eines Datensatzes löst die beiden Ereignisse Vor Löschung und Nach Löschung aus. Das Ereignis Vor Löschung können Sie nutzen, um den Löschvorgang zu unterbinden – beispielsweise, wenn in einer Tabelle gar keine Datensätze gelöscht werden dürfen.

Das Ereignis Nach Löschung verwenden Sie beispielsweise, um die Daten eines gelöschten Datensatzes zu archivieren oder um Felder mit aggregierten Werten, die sich auch auf den gelöschten Datensatz beziehen, zu aktualisieren.

Die Eigenschaft IstEingefügt

Mithilfe dieser Eigenschaft, die nur im Tabellenereignis Vor änderung zur Verfügung steht, können Sie prüfen, ob ein zu ändernder Datensatz soeben angelegt wurde oder bereits vorhanden war.

Das Beispielmakro aus Bild 5 prüft, ob der Wert dieser Eigenschaft nicht wahr ist und führt nur dann die in der Wenn-Bedingung enthaltene Anweisung aus – also nur dann, wenn der Datensatz bereits vorhanden war und nicht neu angelegt wurde.

Auslösen eines Fehlers beim Versuch, einen Datensatz zu ändern

Bild 5: Auslösen eines Fehlers beim Versuch, einen Datensatz zu ändern

In diesem Fall soll eine Meldung angezeigt werden, die den Benutzer darauf hinweist, dass vorhandene Datensätze nicht geändert werden können – siehe Bild 6.

Fehlermeldung beim ändern eines vorhandenen Datensatzes

Bild 6: Fehlermeldung beim ändern eines vorhandenen Datensatzes

Der Datensatz kann nach dem Ausblenden der Meldung erst gespeichert werden, wenn die änderungen etwa mit der Escape-Taste rückgängig gemacht wurden (siehe Tabelle tblKunden_Beispiel_IstEingefuegt der Beispieldatenbank).

Die Funktion Aktualisiert

Eine weitere sehr interessante Funktion heißt Aktualisiert und erwartet die Angabe eines Feldnamens als Parameter.

Wir schauen uns dies anhand der Tabelle tblKunden_Beispiel_Aktualisiert der Beispieldatenbank an. Diese Tabelle enthält wiederum ein Makro, das durch das Tabellenereignis Vor änderung ausgelöst wird. Es prüft in seiner Wenn-Bedingung den folgenden Ausdruck:

Aktualisiert("Vorname") Oder Aktualisiert("Nachname")

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar