Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Wenn Sie die Beziehung zwischen zwei Tabellen festlegen, haben Sie die Möglichkeit, referenzielle Integrität für die Daten zu definieren. Ist dies geschehen, legen Sie mit der Option Löschweitergabe auch noch fest, ob verknüpfte Daten beim Löschen von Datensätzen auf der einen Seite der Beziehung ebenfalls gelöscht werden sollen. Wenn Sie solche Daten in Formularen löschen, erhalten Sie unter Umständen Systemmeldungen, die für den Endnutzer der Anwendung nur wenig Aussagekraft haben. Dieser Beitrag zeigt, wie Sie mit dem Löschen von in Beziehung stehenden Daten umgehen können.
Unsere Südsturm-Beispieldatenbank liefert ausreichend Tabellen und Beziehungen, um die verschiedenen Konstellationen des Einsatzes der Löschweitergabe oder eben des Weglassens der Löschweitergabe zu beurteilen.
Löschweitergabe oder nicht
Wie und wo wirkt die Löschweitergabe eigentlich In der Beziehung zwischen Kunden und Anreden sind diese nicht definiert (siehe Bild 1).
Bild 1: Anlegen einer Beziehung mit referenzieller Integrität, aber ohne Löschweitergabe
Dies sorgt dafür, dass Sie in einer 1:n-Beziehung zwischen einer Kunden- und einer Anreden-Tabelle zwar Kunden löschen können, ohne dass die Datensätze der Anreden-Tabelle davon berührt werden. Sie können aber keine Anreden löschen, die bereits mindestens einem Kunden zugeordnet wurden. Wenn Sie dies dennoch versuchen, erhalten Sie etwa in der Datenblattansicht die Meldung aus Bild 2.
Bild 2: Ohne Löschweitergabe werden verknüpfte Datensätze auf der n-Seite der Beziehung geschützt.
Wenn hier nun die Option Löschweitergabe aktiviert wäre, würde das Löschen einer Anrede dazu führen, dass auch alle damit verknüpften Kunden-Datensätze gelöscht würden – und das wäre einigermaßen fatal. Deshalb sollten Sie die Löschweitergabe nicht einfach so festlegen.
Eine Stelle, an der die Löschweitergabe sinnvoll ist, ist etwa die Beziehung von Kunden und Bestellungen. Wenn ein Kunde Sie auffordert, alle Kundendaten zu löschen, sind davon natürlich auch die Bestellungsdaten betroffen – Sie können ja keinen Datensatz in der Tabelle tblBestellungen behalten, ohne dass dieser einem Kunden zugeordnet ist. Wir gehen an dieser Stelle davon aus, dass Sie die Kunden- und Bestelldaten tatsächlich nicht mehr benötigen und diese löschen können. In diesem Fall legen Sie für die Beziehung zwischen den Tabellen tblKunden und tblBestellungen die Eigenschaft Löschweitergabe an verwandte Datensätze fest (siehe Bild 3).
Bild 3: Löschweitergabe zwischen Kunden und Bestellungen
Ist dies der Fall und die Option Client-einstellungen|Be-ar-beiten|Bestätigen|Datensatzänderungen in den Access-Optionen ist aktiviert, erhalten Sie vor dem Löschen eines Kunden-Datensatzes, dem bereits Bestelldatensätze zugeordnet sind, die Meldung aus Bild 4.
Bild 4: Bei aktiver Löschweitergabe erscheint mit Standardoptionen diese Meldung beim Versuch, einen Datensatz mit verknüpften Daten zu löschen.
Wie Sie solche Meldungen durch eigene Meldungen ersetzen, können Sie im Beitrag Löschen in Formularen: Ereignisse nachlesen (www.access-im-unternehmen.de/1128). Wir schauen uns nun an, wie Sie die Meldungen, die beim Fehlschlagen des Löschvorgangs von Datensätzen ohne Löschweitergabe erscheinen, durch eine selbst definierte Meldung ersetzen können.
Eigene Meldung bei gescheitertem Löschen
Die obige Meldung Der Datensatz kann nicht gelöscht oder geändert werden, da die Tabelle „tblKunden“ in Beziehung stehende Datensätze enthält können Sie nicht so einfach deaktivieren – auch nicht, wenn Sie die Access-Option Clienteinstellungen|Bearbeiten|Bestäti-gen|Daten-satzänderungen deaktivieren.
Es gibt auch scheinbar keine Möglichkeit, per VBA in den Aufruf dieser Meldung einzugreifen – was auch logisch scheint, dann die Meldung kann ja auch komplett über die Benutzeroberfläche ausgelöst werden.
Die einzige Möglichkeit, hier einzugreifen, wird klar, wenn Sie diese Hinweismeldung anders interpretieren – nämlich als Fehlermeldung! Dennoch bleibt die Frage: Wo können wir eine Fehlermeldung unterbinden, die gar nicht per VBA ausgelöst wird Die Lösung ist nicht leicht zu erraten, aber letztlich doch einfach.
Erstens gelingt dies ausschließlich in Formularen und nicht in der Datenblattansicht von Tabellen oder Abfragen. Zweitens erledigen wir das mit der Ereignisprozedur, die durch das Ereignis Bei Fehler des Formulars ausgelöst wird.
Für das Beispiel entfernen wir nun zunächst den Haken bei der Option Löschweitergabe an verwandte Datensätze der Beziehung zwischen den Tabellen tblKunden und tblBestellungen. Damit sorgen wir also dafür, dass die oben erwähnte Meldung wieder erscheint statt der Rückfrage, ob die verknüpften Datensätze mitgelöscht werden sollen (siehe Bild 5).
Bild 5: Entfernen der Löschweitergabe
In einem Beispielformular, das einfach die Tabelle tblKunden mit allen Feldern im Detailbereich und dem Wert Datenblatt für die Eigenschaft Standardansicht verwendet (siehe Bild 6), wollen wir den Einsatz der Ereignisprozedur Bei Fehler demonstrieren.
Bild 6: Entwurf des Beispielformulars
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