Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Während wir den Beitrag „1:n-Beziehung mit Standardzuordnung verwalten“ (www.access-im-unternehmen.de/1469) schrieben, haben wir uns gefragt, ob man die Einhaltung der Konsistenz bei 1:n-Beziehungen mit Standardzuordnung nicht auch auf andere Weise sicherstellen kann als per VBA-Code. Zumal wir diesen auch noch in allen Formularen erneut programmieren müssten, welche die Daten aus dieser 1:n-Beziehung darstellen. Uns fielen zwei Lösungsansätze ein: Der erste ist die Verwendung der mit Access 2010 eingeführten Datenmakros, also eine Art Trigger für Access-Datenbanken. Der zweite Ansatz wären die echten Trigger, und zwar die vom SQL Server. In diesem Beitrag schauen wir uns nun die Variante mit den Datenmakros an. Kann man unser Vorhaben damit abbilden? Und wenn ja, wie?
Die Datenmakros liefern gleich fünf verschiedene Ereignisse, zu denen wir Makrobefehle ausführen können:
- Vor Änderung
- Vor Löschung
- Nach Einfügung
- Nach Aktualisierung
- Nach Löschung
Warum es kein Ereignis namens Vor Einfügung gibt? Weil wir dazu das Ereignis Vor Änderung nutzen können. Aber welche dieser Ereignisse benötigen wir, um die im oben genannten Beitrag abgebildeten Regeln zur Einhaltung der Konsistenz sicherzustellen?
Noch mal zur Wiederholung: Wir wollen in einer 1:n-Beziehung, beispielsweise zwischen den beiden Tabellen tblPersonen und tblMailAdressen aus Bild 1, Folgendes sicherstellen: Genau einer der Datensätze aus tblEMailAdressen, der mit einem der Datensätze aus tblPersonen verbunden ist, muss für das Feld StandardEMail den Wert True aufweisen. Dazu ist zu berücksichtigen:
Bild 1: 1:n-Beziehung mit Standardzuordnung
- Wenn der erste Datensatz zu einer Person angelegt wird, muss dieser als Standard-E-Mail gekennzeichnet werden.
- Wenn ein Datensatz als StandardEMail gekennzeichnet wird, muss die Markierung beim bisher als Standard gekennzeichneten Datensatz entfernt werden.
- Wenn der aktuelle Standarddatensatz entfernt wird, muss ein anderer markiert werden, sofern noch einer vorhanden ist.
- Wenn der Benutzer versucht, den aktuellen Datensatz als Standard abzuwählen, muss dies verhindert werden. Dies kann nur durch die Auswahl eines anderen Datensatzes geschehen.
Datenmakro beim Löschen
Damit begeben wir uns an die Programmierung der Datenmakros. Der einfachste Fall ist das Löschen eines Datensatzes, der als Standarddatensatz markiert ist. Dazu nutzen wir das Datenmakro Nach Löschung. Dieses legen wir an, indem wir die Tabelle in der Datenblattansicht öffnen und im Ribbon unter Tabelle den Befehl Nach Löschung anklicken (siehe Bild 2). Wichtig ist, das wir die Option Systemobjekte anzeigen aktivieren, denn so können wir auf die Tabelle USysApplicationLog zugreifen, in die wir vom Makro aus Protokollmeldungen eintragen können.
Bild 2: Aufrufen des Entwurfs der verschiedenen Makros
Das Datenmakro legen wir wie in Bild 3 an. Wir starten hier mit einer Wenn-Bedingung. Die Bedingung lautet [Alt].[StandardEMail] = -1. Mit [Alt] greifen wir auf die Daten des zu löschenden Recordsets zu. Hat dessen Feld StandardEMail den Wert -1, ist er als Standardzuordnung für seine PersonID registriert. In diesem Fall müssen wir nach dem Löschen einen neuen Datensatz bestimmen, der den Wert -1 im Feld StandardEMail erhalten soll. Dazu verwenden wir die Aktion Datensatz nachschlagen in und übergeben als Quelle die Tabelle tblEMailAdressen. Außerdem legen wir als Bedingung fest, dass der gesuchte Datensatz im Feld PersonID den Wert des Feldes PersonID des zu löschenden Datensatzes aufweist. Damit wir überhaupt zwischen dem Feld PersonID des aktuellen Datensatzes und der Tabelle Alt unterscheiden können, vergeben wir für das Recordset den Alias t1. Falls wir einen geeigneten Datensatz finden, was immer der Fall ist, wenn mindestens noch ein weiterer Datensatz für diese PersonID vorhanden ist, stellen wir dessen Wert StandardEMail auf -1 ein. Damit haben wir eine neue Standardzuordnung erstellt. Wenn kein geeigneter Datensatz gefunden wird, haben wir die letzte E-Mail-Adresse für diese Person gelöscht und müssen keine neue Standardzuordnung vornehmen.
Bild 3: Datenmakro Nach Löschung
Anlegen neuer Datensätze
Wenn wir den ersten neuen Datensatz für eine PersonID in der Tabelle tblEMailAdressen eintragen, soll dieser direkt mit dem Wert -1 im Feld StandardEMail versehen werden. Dazu hinterlegen wir das Makro aus Bild 4 für Nach Einfügung. Hier prüfen wir zuerst, ob das Feld StandardEMail aktualisiert wurde und protokollieren den vorherigen und den aktuellen Wert (dies hat bei der Entwicklung geholfen, zu verstehen, was passiert – daher belassen wir diese Protokollzeilen im Makro).
[
Bild 4: Makro zum Einstellen der Standardzuordnung beim Anlegen neuer E-Mail-Adressen
Wenn der Benutzer für den neuen Datensatz direkt den Wert -1 für StandardEMail hinterlegt hat, müssen wir gegebenenfalls den Wert für die bereits vorhandene Datensätze auf 0 einstellen.
Dazu durchlaufen wir mit Für jeden Datensatz alle Datensätze, welche der gleichen PersonID zugeordnet sind und deren ID nicht der ID des angelegten Datensatzes entspricht.
In dieser Schleife stellen wir mit DatensatzBearbeiten und FestlegenFeld nach einem weiteren Kommentar den Wert des Feldes StandardEMail für die übrigen Datensätze auf 0 ein.
Anpassen nach dem Aktualisieren
Damit fehlt noch das Aktualisieren der übrigen Datensätze, wenn man einen anderen als den aktuellen Datensatz als neue Standardzuordnung festlegt. Das erledigen wir im Datenmakro Nach Aktualisierung (siehe Bild 5).
Bild 5: Datenmakro Nach Aktualisierung
Hier prüfen wir mit der Funktion Aktualisiert wieder, ob StandardEMail überhaupt aktualisiert wurde. Falls, prüfen wir, ob das Feld StandardEMail vor dem Ändern den Wert 0 enthielt (aus dem Recordset Alt) und jetzt den Wert -1. Falls ja, durchlaufen wir jeden Datensatz eines Recordsets, das wir mit Für jeden Datensatz ermitteln, wobei die Tabelle tblEMailAdressen als Datenquelle dient und wir alle Datensätze suchen, die zur gleichen PersonID wie der geänderte Datensatz gehören und deren Wert aus dem Feld ID nicht der des geänderten Datensatzes entspricht.
Für all diese Datensätze stellen wir den Wert von StandardEMail auf 0 ein und entfernen somit den Status als Standardzuordnung.
Zwischenfazit
All dies funktioniert wunderbar. Wir legen eine erste E-Mail-Adresse an, diese wird direkt als Standardzuordnung definiert. Wie stellen eine andere E-Mail-Adresse als Standard ein und das Datenmakro erkennt der vorherigen diesen Status ab. Wir löschen die aktuelle Standard-E-Mail und die erste noch verfügbare wird als neue Standardzuordnung festgelegt.
Allein zwei Aktionen fehlen noch:
- Der erste neue Datensatz soll automatisch zur Standardzuordnung werden.
- Und der Benutzer soll die aktuelle Standardzuordnung nicht durch einen Klick auf das gefüllte Kontrollkästchen entfernen können. Dazu wollen wir das Datenmakro Vor Änderung nutzen. Wir haben es zuvor mit dem Datenmakro Nach Aktualisierung probiert, aber hier können wir nicht auf den soeben geänderten Datensatz zugreifen. Also können wir nur Vor Änderung verwenden, denn hier ist der Datensatz noch nicht gespeichert.
Ersten Datensatz zum Standard machen
Der erste Teil ist der deutlich leichtere. Diesen sehen wir in Bild 6. Hier prüfen wir mit der Bedingung [IstEingefügt], ob wir es mit einem neu angelegten oder einem vorhandenen geänderten Datensatz zu tun haben. Zuerst interessieren uns die neu angelegten Datensätze. Dabei initialisieren wir zuerst eine Variable namens varStandardEMail mit dem Wert 0.
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