Events nach der Erstellung eines Core-Belegs (DXP Document)

Zielgruppe

Diese Dokumentation richtet sich an Drittanbieter-Entwickler, die den Lebenszyklus des Core-Belegs DXP Document erweitern möchten – insbesondere an den Punkten, an denen:

Einordnung: Core-Beleg-Erstellung vs. Weiterverarbeitung

1) Core-Beleg wird angelegt (AddDocument)

Die Anlage eines DXP Document erfolgt in DXP Document Mgt. über AddDocument(...):

2) Danach: Transfer/Verknüpfung und Verarbeitung

Typische nächste Schritte (abhängig vom App-Flow):

Die meisten Erweiterungspunkte liegen daher nicht direkt beim Insert, sondern im Update-/Processing-Flow.

Event-Matrix (Kurzüberblick)

Bereich Event Zeitpunkt Steuerung Typische Use-Cases
DXP Document Mgt. OnAfterSetLinkedToRecIdOnBeforeModify in UpdateDocumentAfterTransfer(...) vor Modify(true) Zusatzinfos setzen, sobald Linked-to Record Id steht
DXP Document Mgt. OnBeforeGetDocumentOnBeforeCheckStatusAndNextProcessStep früh in UpdateDocument(...) vor Document.Get(DocNo) IsHandled Status/NextStep überschreiben, Processing übernehmen
DXP Document Mgt. OnAfterGetDocumentOnBeforeCheckStatusAndNextProcessStep in UpdateDocument(...) nach Get(...) vor Standardbeleg-Erzeugung Handled abhängig vom Dokument entscheiden, JSON/Status anpassen
DXP Document Mgt. OnAfterUpdateRawJson nach Schreiben von JSON Raw in UpdateRawJsonJson(...) Raw JSON normalisieren/zusätzliche Ableitungen
DXP Document Mgt. OnAfterWriteProcessedJsonToBlob nach Schreiben von JSON Processed in UpdateStatusAndProcessedJson(...) Processed JSON finalisieren, Tokens ergänzen
DXP Document Mgt. OnBeforeTransferCoreAttachmentsToStandardDocument vor Attachment-Transfer IsHandled Transfer ersetzen/selektiv steuern
DXP Document Transfer Mgt. OnBeforeExitProcessedJsonDocHeader beim Erzeugen von Header-JSON (vor exit(JObject)) Standard-Tokens ergänzen/normalisieren
DXP Document Transfer Mgt. OnBeforeExitProcessedJsonDocLine beim Erzeugen von Line-JSON (vor exit(JObject)) Line-Tokens ergänzen/normalisieren
DXP Document Transfer Mgt. OnAfterCreatePurchaseHeader nach Anlage/Validierung des Purchase Headers Header-Felder ergänzen, Post-Processing
DXP Document Transfer Mgt. OnBeforeInsertPurchaseLine vor Insert einer Purchase Line Purchase Line anpassen (z. B. Kontierung, Typ/No)
DXP Document Transfer Mgt. OnAfterInsertPurchaseLineOnBeforeAddDimensions nach Insert, vor Dimensionen Dimensions/Additional-Info vorbereiten
DXP Document Transfer Mgt. OnAfterOnBeforeAddLineDimensions bei Receipt-Lines: vor Dimensionen des zu aktualisierenden Lines Update-Fälle (Receipt) anpassen
DXP Document Transfer Mgt. OnAfterProcessAdditionalInformation nach Transfer zusätzlicher Informationen Add-on-Felder pro Ziel-RecordRef ergänzen
DXP Document Transfer Mgt. OnAfterCreatePurchaseDoc nach kompletter Erstellung des Purchase Dokuments finaler Hook (Logging, Folgeaktionen)

Events in DXP Document Mgt. (Core-Lebenszyklus)

 

OnAfterSetLinkedToRecIdOnBeforeModify

Wird in UpdateDocumentAfterTransfer(...) ausgelöst – nachdem Status/Linked-to Record Id gesetzt wurden, aber bevor das DXP Document gespeichert wird.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterSetLinkedToRecIdOnBeforeModify(var Document: Record "DXP Document")

Use-Cases:

 

OnBeforeGetDocumentOnBeforeCheckStatusAndNextProcessStep

Wird in UpdateDocument(...) als frühester Hook aufgerufen – noch bevor das DXP Document per Get(DocNo) geladen wird.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnBeforeGetDocumentOnBeforeCheckStatusAndNextProcessStep(
    DocNo: Code[20];
    var Status: Enum "DXP Document Status";
    var NextStep: Enum "DXP Next Process Step";
    JObject: JsonObject;
    var IsHandled: Boolean)

Use-Cases:

 

OnAfterGetDocumentOnBeforeCheckStatusAndNextProcessStep

Wird in UpdateDocument(...) nach Document.Get(DocNo) ausgelöst, bevor Standardbelege erzeugt werden.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterGetDocumentOnBeforeCheckStatusAndNextProcessStep(
    var Document: Record "DXP Document";
    NewStatus: Enum "DXP Document Status";
    NextStep: Enum "DXP Next process step";
    var ProcessedJSONObj: JsonObject;
    var Handled: Boolean)

Use-Cases:

 

OnAfterUpdateRawJson

Wird in UpdateRawJsonJson(...) nach dem Schreiben von JSON Raw ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterUpdateRawJson(var Document: Record "DXP Document"; var RawJSONObj: JsonObject)

Use-Cases:

 

OnAfterWriteProcessedJsonToBlob

Wird in UpdateStatusAndProcessedJson(...) ausgelöst, nachdem JSON Processed in das BLOB geschrieben wurde.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterWriteProcessedJsonToBlob(var Document: Record "DXP Document"; var ProcessedJSONObj: JsonObject)

Use-Cases:

 

OnBeforeTransferCoreAttachmentsToStandardDocument

Wird in TransferCoreAttachmentsToStandardDocument(...) vor dem Transfer ausgelöst. Über IsHandled kann die Standardlogik ersetzt werden.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnBeforeTransferCoreAttachmentsToStandardDocument(Document: Record "DXP Document"; var IsHandled: Boolean)

Use-Cases:


Events in DXP Document Transfer Mgt. (Standardbelege aus JSON Processed)

Diese Codeunit ist relevant, sobald aus JSON Processed Standardbelege (z. B. Einkaufsbelege) erzeugt werden.

 

OnBeforeExitProcessedJsonDocHeader

Wird in CreateDocHeaderJson(...) unmittelbar vor exit(JObject) ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnBeforeExitProcessedJsonDocHeader(var JObject: JsonObject)

Use-Cases:

 

OnBeforeExitProcessedJsonDocLine

Wird in CreateDocLineJson(...) unmittelbar vor exit(JObject) ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnBeforeExitProcessedJsonDocLine(var JObject: JsonObject)

Use-Cases:

 

OnAfterCreatePurchaseHeader

Wird nach Anlage/Validierung des Purchase Headers ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterCreatePurchaseHeader(var JObject: JsonObject; PurchaseHeader: Record "Purchase Header")

Use-Cases:

 

OnBeforeInsertPurchaseLine

Wird unmittelbar vor dem Insert einer Purchase Line ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnBeforeInsertPurchaseLine(var JObjectLine: JsonObject; var PurchaseLine: Record "Purchase Line")

Use-Cases:

 

OnAfterInsertPurchaseLineOnBeforeAddDimensions

Wird nach Insert der Purchase Line, aber vor Dimensions-Validierung ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterInsertPurchaseLineOnBeforeAddDimensions(var JObjectLine: JsonObject; PurchaseLine: Record "Purchase Line")

Use-Cases:

 

OnAfterOnBeforeAddLineDimensions

Wird im Receipt-Line-Update-Fall ausgelöst, bevor Dimensionen für die zu aktualisierende Purchase Line gesetzt werden.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterOnBeforeAddLineDimensions(var JObjectLine: JsonObject; PurchaseLineToUpdate: Record "Purchase Line")

Use-Cases:

 

OnAfterProcessAdditionalInformation

Wird nach dem Transfer zusätzlicher Informationen (ProcessAdditionalInformation) ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterProcessAdditionalInformation(var RecRef: RecordRef; SourceJsonObject: JsonObject)

Use-Cases:

 

OnAfterCreatePurchaseDoc

Wird nach kompletter Erstellung des Purchase Dokuments ausgelöst.

Signatur:

[IntegrationEvent(false, false)]
local procedure OnAfterCreatePurchaseDoc(var JObject: JsonObject; PurchaseHeader: Record "Purchase Header")

Use-Cases:


Minimalbeispiel: Status/NextStep in Richtung „Individuelle Verarbeitung“ beeinflussen

Beispiel: Vor dem Standard-Processing Status auf „Custom Processing“ setzen:

codeunit 50101 "My Core Document Hooks"
{
    [EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP Document Mgt.", 'OnBeforeGetDocumentOnBeforeCheckStatusAndNextProcessStep', '', false, false)]
    local procedure OnBeforeGetDoc(
        DocNo: Code[20];
        var Status: Enum "DXP Document Status";
        var NextStep: Enum "DXP Next Process Step";
        JObject: JsonObject;
        var IsHandled: Boolean)
    begin
        Status := Status::"Custom Processing";
        // NextStep optional anpassen
    end;
}

[Best Practice] Nutze IsHandled := true nur, wenn du die Standardlogik vollständig ersetzt – sonst kann es zu inkonsistenten Status-/JSON-Zuständen kommen.


Revision #2
Created 2026-02-03 12:19:51 UTC by Bernd Feddersen
Updated 2026-02-03 12:23:58 UTC by Bernd Feddersen