Zum Inhalt

Events

Eventpublisher

Info

Muss noch besprochen werden

Eventsubscriber

Das Erstellen eines Subscribers in einer Codeunit führt dazu, dass beim Werfen des dazugehörigen Events eine Instanz der Codeunit erstellt wird und der Code in dem Subscriber ausgeführt wird. Dieses Verhalten wird durch das Codeunit Property EventSubscriberInstance = StaticAutomatic (default) gesteuert.

Folgende Punkte können das Arbeiten mit diesen Events optimieren:

Struktur von Eventsubscriber-Codeunits

  • Bei „kleinen“ oder beginnenden Projekten mit 1 Eventsubscriber-Codeunit starten
    • Sortierung innerhalb der Codeunit nach Bereichen mit „Regions“:
      • #region <regionName> - <Code> - #endregion <regionName>
    • Wenn die Subscriber-Codeunit zu groß wird, dann diese Codeunit in weitere Eventsubscriber-Codeunits aufteilen, z.B.
      • nach Bereich (Einkauf, Verkauf, Logistik, …)
      • Publisher Objekt
      • Objekttyp (Table-Subscriber, …)
      • etc.
  • "SingleInstance = True": nicht vergessen
    • Dieses sorgt dafür, dass die Codeunit nur 1 x geladen wird

Eventsubscriber erstellen

  • Vorher prüfen, ob der Eventsubscriber schon existiert, den man gerade erstellen möchte
  • Trigger vs. "OnAfterInsert"-Event
    • Alles, was an die Tableextension kann, soll auch an die Tableextension –Feld-/Objekt-Trigger nutzen
    • Außer die Aufrufreihenfolge hat eine große Bedeutung (siehe Kauffmann Artikel)
  • Benamung
    • [Name des Publisher Objekts] + [Name des Publishers]
    • Detaillierter, falls notwendig: [Typ des Objekts] + [Name des Publisher Objekts] + [Name des Publishers]
      • Beispiel:
        • TableCustLedgerEntryOnAfterInsertEvent
        • CodeunitSalesPostPrintOnBeforeConfirmPost
    • oder (analog VScode, F1 → Find Event): [Typ des Objekts] + [Name des Publisher Objekts] + _ + [Name des Publishers]
      • Beispiel:
        • TableCustLedgerEntry_OnAfterInsertEvent
        • CodeunitSalesPost_PrintOnBeforeConfirmPost
  • Keine Logik in Subscriber, nur Aufrufe von Funktionen aus anderen Objekten
    • D.h. in Subscriber soll keine Logik programmiert werden, welche mehrere Zeilen umfasst. Stattdessen sollte die Logik in einer separaten Funktion umgesetzt werden, welche dann im Subscriber aufgerufen wird. Die Funktion solle dann in einem anderen Objekt (nicht in der Eventsubscriber-Codeunit) ausprogrammiert werden.

Manual Binding

Durch das Verwenden von “manuellem Binding” kann der Entwickler steuern, dass Eventsubscriber nicht pauschal bei jedem Aufruf des Events, sondern nur in einer bestimmten Konstellation durchlaufen werden. Dafür muss das Codeunit Property EventSubscriberInstance, in dem sich das Event befindet auf Manual gesetzt werden.

Damit die Subscriber in einer Codeunit mit EventSubscriberInstance = manual durchlaufen werden, sind zwei Bedingungen notwendig.

  1. Eine Instanz der Codeunit wird mit der Funktion BindSubscription manuell gebunden
  2. Die gebundene Codeunit Instanz existiert beim Aufruf des Events

Quelle

Diese Dokumentation ist in 3 Terminen zu jeweils 90 Minuten durch Peter Höfert, Sarah Franzkowiak, Rainer Kuhnlein, Eva-Maria Melenk, Patrick Kortlüke, Britta Höpfner, Lukas Gutknecht, Matti Levi entstanden.

Stand: Dezember 2023