Home > Artikel > Ausgabe 6/2014 > Datenmakros III: Ereignisse

Datenmakros III: Ereignisse

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

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")

Dieser ist wahr, wenn der Inhalt eines der Felder Vorname oder Nachname geändert wurde – was durch die Funktion Aktualisiert geprüft wird. In diesem Fall soll das Makro in das Feld Bezeichnung der Tabelle einen Ausdruck einfügen, der aus dem Inhalt des Feldes Nachname, einem Komma und dem Inhalt des Feldes Vorname des Datensatzes zusammengesetzt ist (siehe Bild 7).

Aktualisieren eines Feldes bei Änderung anderer Felder

Bild 7: Aktualisieren eines Feldes bei Änderung anderer Felder

Das Ergebnis sieht dann beispielsweise wie in Bild 8 aus.

Zusammenstellung einer Bezeichnung aus Vor- und Nachname

Bild 8: Zusammenstellung einer Bezeichnung aus Vor- und Nachname

Achtung: Sie müssen den als Parameter verwendeten Feldnamen unbedingt in Anführungszeichen einfassen.

DLookup und Co. in Datenmakros

Wer sich die zur Verfügung stehenden Funktionen in Datenmakros ansieht, stellt schnell fest, dass dort einige Funktionen fehlen – zum Beispiel DLookup. Das ist in diesem Fall aber kein Problem, denn die DLookup-Funktion können Sie durch die Makroaktion DatensatzNachschlagen ersetzen.

Aber wie sieht es mit den übrigen Domänenfunktionen wie DMin, DMax, DSum et cetera aus? Hier ist ein kleiner Trick nötig. Sie müssen den gesuchten Wert mithilfe einer Abfrage ermitteln, die sie in der Datenbank speichern. Dann können Sie mit DatensatzNachschlagen auf die entsprechenden Daten zugreifen.

Wir schauen uns dies am Beispiel der beiden Tabellen tblBestellungen und tblBestelldetails an. Der Tabelle tblBestellungen haben wir ein Feld namens Bestellsumme hinzugefügt. Dieses soll die Summe der Bestellpositionen aufnehmen, damit diese nicht immer neu dynamisch ermittelt werden muss. Damit erhalten wir redundante Daten, da diese Summe ja bereits in der Tabelle tblBestelldetails abgelegt ist. Damit daraus keine Inkonstistenzen entstehen, müssen wir uns absichern – mithilfe geeigneter Tabellenereignisse:

  • Das erste Ereignis Nach Aktualisierung der Tabelle tblBestelldetails soll Summe der Preise der einzelnen Bestellpositionen dieser Bestellung in das Feld Bestellsumme der Tabelle tblBestellungen eintragen.
  • Das Gleiche müssen wir natürlich auch beim Löschen einer Bestellposition erledigen.
  • Schließlich müssen wir sicherstellen, dass der Benutzer den Inhalt des Feldes Bestellsumme der Tabelle tblBestellungen nicht von Hand ändern kann.

Schauen wir uns zunächst das Makro an, dass durch das Ereignis Nach Aktualisierung der Tabelle tblBestelldetails ausgelöst wird. Dieses sieht wie in Bild 9 aus und ermittelt zunächst einen Wert aus einer Abfrage namens qryBestellsummen.

Dieses Makro speichert die aktuelle Bestellsumme in der Tabelle tblBestellungen.

Bild 9: Dieses Makro speichert die aktuelle Bestellsumme in der Tabelle tblBestellungen.

Den Entwurf dieser Abfrage finden Sie in Bild 10. Sie liefert zu allen Bestellungen in einem Feld namens Preis die Summe des folgenden berechneten Ausdrucks:

Die Abfrage qryBestellsummen in der Entwurfsansicht

Bild 10: Die Abfrage qryBestellsummen in der Entwurfsansicht

Summe([Einzelpreis]*[Anzahl]*(1-[Rabatt]))

Außerdem liefert sie das Feld BestellungID, damit das Makro nur die Summe für die Bestellpositionen der jeweiligen Bestellung ermitteln muss.

Auf Basis dieser Abfrage führt das Makro die Makroaktion DatensatzNachschlagenIn aus und verwendet als Kriterium den Wert des Feldes BestellungID des geänderten Datensatzes. Die Makroaktion FestlegenLokaleVar schreibt den Wert des Feldes Preis in die lokale Variable varBestellsumme. Nun folgt ein erneuter Aufruf der Makroaktion DatensatzNachschlagenIn. Diesmal ermittelt es den Datensatz der Tabelle tblBestellungen, mit dem der aktuelle Datensatz der Tabelle tblBestelldetails über das Feld BestellungID verknüpft ist. Die Makroaktion DatensatzBearbeiten bereitet den Datensatz für eine Bearbeitung vor und FestlegenFeld trägt den Wert der lokalen Variablen varBestellsumme in das Feld Bestellsumme der Tabelle tblBestellungen ein.

Es funktioniert: Die Tabelle tblBestellungen zeigt nach dem Ändern einer Bestellposition die aktuelle Bestellsumme im Feld Bestellsumme an (siehe Bild 11).

Bestellsummen in der Tabelle tblBestellungen

Bild 11: Bestellsummen in der Tabelle tblBestellungen

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!