Später löschen

Siehe auch: Änderungen später speichern

Ereignisaktion - Kurzfassung

Zweck: Merkt eine Entität zum Löschen beim Abschluss der aktuellen Transaktion vor.

images/download/attachments/83165445/image2021-4-14_12-36-26-version-1-modificationdate-1633440316215-api-v2.png

Die Ereignisaktion Später löschen legt für das aktuelle Bezugsobjekt innerhalb der Ereignisbehandlung eine Vormerkung zum Löschen an.

Beim Abschluss der Transaktion wird die betreffende Entität daraufhin gelöscht, sofern sie überhaupt bzw. noch existiert.

HINWEIS◄ Für ein Bezugsobjekt, das noch nie gespeichert wurde, hat das Ausführen von Später löschen in der Regel keinen Effekt. Im Kontext einer Erfassungsmaske, die direkt nach dem Ausführen von "Neu" oder "Kopieren" ein volatiles Eingabeobjekt bereitstellt, kann dieses durch den Aufruf einer Ereignisbehandlung mit der Ereignisaktion Später löschen also nicht etwa "verworfen" werden.

Definition des Bezugsobjekts

Das aktuelle Bezugsobjekt ist im einfachsten Fall die durch den Datenkontext der Ereignisbehandlung bestimmte Entität.

Allerdings gibt es auch Ereignisaktionen (z. B. Ausführen mit oder Für jeden Eintrag wiederholen (Schleife)), die das aktuelle Bezugsobjekt zur Laufzeit vorübergehend übersteuern können. Die Konfiguration der Ereignisaktion sieht dabei jeweils einen definierten Block von Ereignisaktionen vor, die im Kontext des abweichenden Bezugsobjekts ausgeführt werden sollen. Zur Laufzeit gilt für diese Ereignisaktionen das abweichende Bezugsobjekt als aktuelles Bezugsobjekt, wie ggf. über den Wert der Variablen entity nachvollzogen werden kann. Auch die Ereignisaktion Später löschen bezieht sich innerhalb eines solchen Aktionsblocks ausschließlich auf die vorübergehend als Bezugsobjekt definierte Entität.

Innerhalb einer Ereignisaktion, die ein abweichendes Bezugsobjekt vorsieht, können in der Regel Wertauflöser eingesetzt werden, um ein konkretes Bezugsobjekt zu definieren:

WICHTIG◄ Die Ereignisaktion Später löschen sollte nur mit eigenständigen Entitäten als Bezugsobjekt ausgeführt werden und z. B. nicht mit Attributen oder Positionen von Geschäftsobjekten. Zur Laufzeit findet keine entsprechende Prüfung statt und das Ausführen der Ereignisaktion für ein Bezugsobjekt, das eigentlich (interaktiv) nicht eigenständig gespeichert werden kann, führt möglicherweise zu unerwarteten Ergebnissen beim Abschluss der Transaktion.

Vormerkung zum Löschen

Die Vormerkung zum Löschen berücksichtigt den zum Zeitpunkt der Ausführung der Ereignisaktion Später löschen anwendbaren Anmeldekontext (Firma, Rolle, Benutzer), der zur Laufzeit durch die Ereignisaktion Ausführen als temporär abweichend von der aktuellen Sitzung definiert sein kann.

  • Wird die Ereignisaktion Später löschen innerhalb derselben Transaktion mehrfach für dasselbe Bezugsobjekt ausgeführt, berücksichtigt die Vormerkung ausschließlich den Anmeldekontext der letzten Ausführung.

  • Dieser Anmeldekontext gibt den Ausschlag für die Prüfung auf Berechtigungen zum Löschen des Bezugsobjekts.

Dass das Löschen nicht unmittelbar durch das Ausführen der Ereignisaktion Später löschen ausgelöst wird, bedingt außerdem folgende Effekte:

  • Wenn nach dem Ausführen von Später löschen für dieselbe Transaktion ein Rollback (durch eine Abbrechen oder eine "echte" Process Exception) ausgelöst wird, entfällt das "später Löschen" und die betreffende Entität bleibt erhalten.

  • Der Zeitpunkt der Ausführung der Ereignisaktion für ein bestimmtes Bezugsobjekt innerhalb derselben Transaktion ist unerheblich. Bis zum Abschluss der Transaktion besteht (innerhalb und außerhalb der Transaktion) Zugriff auf das zu löschende Bezugsobjekt.

  • Das wiederholte Ausführen der Ereignisaktion für dasselbe Bezugsobjekt innerhalb derselben Transaktion ist wirkungslos, außer wenn dabei unterschiedliche Anmeldekontexte verwendet werden (s. o.).

Ausführen des Löschens

Die Vormerkung zum Löschen wird erst mit dem Abschluss der laufenden Transaktion berücksichtigt. Sofern eines der vorgemerkten Bezugsobjekte durch die Transaktion nicht ohnehin gelöscht wurde, wird dann versucht dieses explizit zu löschen. Falls dieser Versuch fehlschlägt, weil eine Fehlermeldung auftritt, gilt die Transaktion insgesamt als Fehlschlag und ein Rollback wird ausgeführt. Diesbezüglich sind die folgenden Aspekte zu bedenken:

  • Der im Zuge der Vormerkung anwendbare Anmeldekontext (s. o.) muss über die Berechtigung zum "Löschen" des Bezugsobjekts verfügen.

  • Das Ausführen der Ereignisaktion Später löschen im Try-Block einer Try-Catch-Aktion führt nicht dazu, dass Fehler abgefangen werden, die erst "später" (beim Löschen) auftreten.

HINWEISE

  • Da im Rahmen von Tests das Löschen von Objekten generell nicht unterstützt wird, zeigt die Ereignisaktion Später löschen im Testmodus keinerlei Wirkung.

  • Falls innerhalb derselben Transaktion für dasselbe Bezugsobjekt nicht nur die Ereignisaktion Später löschen sondern auch Änderungen später speichern ausgeführt wurde, bestehen beim Abschluss der Transaktion für das Bezugsobjekt Vormerkungen zum Speichern und zum Löschen. Dann entfällt das Speichern komplett und zwar auch in dem Sonderfall, dass ein "volatiles" Bezugsobjekt anliegt, also eines, das nicht gelöscht werden kann, weil es noch nie gespeichert wurde.

Beispiel

Wenn eine beliebige Entität gelöscht wird, sollen automatisch auch alle Dokumente gelöscht werden, die dieser Entität zugewiesen sind.

Konfiguration:

Eine Ereignisbehandlung für das Auslösende Ereignis "Löschen" wird wie rechts abgebildet konfiguriert:

  • Als Prüfende Regel wird eine Typprüfung für den Typ "Entität" eingerichtet, der alle Arten von Entitäten (Geschäftsobjekte, Konfigurationen, Stammdaten, usw.) zusammenfasst.

  • Unter den Aktionen bei bestandener Regel wird zunächst eine Suche (Ereignisaktion) ausgeführt, die über die Variable assignedDocuments eine Liste aller Dokumente zurückgibt, die sich auf die zu löschenden Entität beziehen. Details zur Suche werden unten gezeigt.

  • Eine Für jeden Eintrag wiederholen (Schleife) durchläuft die Liste der Dokumente in der Variablen assignedDocuments und führt für jedes Dokument die Ereignisaktion Später löschen aus, um eine Vormerkung zum Löschen zu setzen.

Wenn alle relevanten Dokumente eine Vormerkung zum Löschen erhalten haben, wird die Transaktion abgeschlossen. Erst dann verschwinden die als Eingabewert der Ereignisbehandlung übergebene Entität und alle zugewiesenen Dokumente wirklich aus der Datenbank.

HINWEIS◄ Es wird vorausgesetzt, dass im Anmeldekontext für alle relevanten Dokumente mindestens die Berechtigung zum "Lesen" (für die Suche (Ereignisaktion)) und zum "Löschen" gegeben ist. Falls die Suche (Ereignisaktion) mindestens ein Dokument zurückgibt, für das "Lesen" zulässig aber "Löschen" nicht zulässig ist, tritt beim Abschluss der Aktion ein Fehler auf, der einen Rollback der Transaktion auslöst. Dann ist das Löschen für alle Dokumente und die Entität selbst unwirksam.

images/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg ACHTUNGimages/s/-95e2zf/9012/8yg2g7/_/images/icons/emoticons/warning.svg Da Dokumente ebenfalls dem Typ "Entität" angehören, löst das Löschen eines Dokuments die hier beschriebene Ereignisbehandlung für dieses Dokument als Entität aus. Da es auch möglich ist, einem Dokument andere Dokumente zuzuweisen, kann dies zu eine Kaskade von Löschoperationen für Dokumente führen, die über den direkten Kontext der ursprünglichen Entität hinausgeht. Das in der Anforderung formulierte Prinzip wird also rekursiv auf eine beliebig tief verschachtelte Hierarchie zwischen Dokumenten angewendet.

images/download/attachments/83165445/image2021-4-14_15-7-27-version-1-modificationdate-1633440316212-api-v2.png

Die oben nur zugeklappt dargestellte Suche (Ereignisaktion) sollte wie rechts abgebildet konfiguriert werden:

  • im Parameter Ergebnis speichern als sollte der Name der Variablen angegeben werden, in die das Suchergebnis geschrieben werden soll: assignedDocuments

  • Als Entität wird hier der Typ "Dokument" ausgewählt, da Dokumente gesucht werden sollen.

  • Der Modus "Suchwert" legt fest, dass in die Variable eine Liste mit allen "Treffern" der Suche geschrieben werden soll.

  • Die Suche soll als Suche (s. Sucharten) ausgeführt werden, so dass als Treffer Dokumente als komplettes Datenobjekt zurückgegeben werden.

  • Innerhalb der Bedingung verbindet eine UND-Verknüpfung zwei Kriterien, die jeweils als Feld Einschränkung konfiguriert sind. Nur wenn beide Kriterien zutreffen bezieht sich ein Dokument wirklich auf die zu löschende Entität:

    • Einerseits soll das Feld "Referenziertes Objekt ID" (referencedEntityId) des Dokuments mit der "ID" (id) der zu löschenden Entität übereinstimmen, die als Eingabeobjekt anliegt.

    • Anderseits muss auch der Wert für das Feld "Referenziertes Objekt" (referencedEntity) dem konkreten Typ der zu löschenden Entität entsprechen, der beim Aufruf der Ereignisbehandlung automatisch in der Variablen entityClass bereitgestellt wird. Soll z. B. ein Benutzer gelöscht werden, enthält die Variable entityClass zur Laufzeit folgenden Textwert:
      de.lobster.scm.base.security.user.User

images/download/attachments/83165445/image2021-4-14_16-42-28-version-1-modificationdate-1633440316204-api-v2.png