Events nach der Erstellung eines SQUEEZE-Belegs (CreateSource)
Zielgruppe
Diese Dokumentation richtet sich an Drittanbieter-Entwickler, die den Erstellungsprozess eines SQUEEZE-Belegs (Tabellen DXP SQZ Document Header/DXP SQZ Document Line) erweitern möchten.
Im Fokus stehen die Integration Events, die nach bzw. während ISourceDocument.CreateSource(...) ausgelöst werden.
Einordnung: Wo wird CreateSource aufgerufen?
Der Einstiegspunkt für die SQUEEZE-Integration ist in der Codeunit DXP SQZ API Mgt.:
- Es wird ein Core-Beleg (
DXP Document) angelegt (überDXP Document Mgt.). - Anschließend wird über die Dokumentenklasse das Interface
DXP ISource Documentaufgelöst undCreateSource(Document)ausgeführt.
Vereinfachter Ablauf (aus CreateCoreAndSQUEEZEDocument):
DocumentMgt.AddDocument(DocClass, ...)(Core-Beleg anlegen)ISourceDocument.CreateSource(Document)(SQUEEZE-Beleg erzeugen)- Import-Queue verarbeiten / SQUEEZE-Dokument „finishen“
Dokumentenklassen & Default-Verhalten
Welche CreateSource-Implementierung ausgeführt wird, ist in der Enum-Erweiterung DXP Document Class Ext. hinterlegt.
DXP Invoice / Credit Memo→ CodeunitDXP SQZ P. Inv/Crdt Memo Impl.DXP Order Confirmation→ CodeunitDXP SQZ P. Order Conf. Impl.
Default (wenn keine spezifische Implementierung gesetzt ist): Die Enum DXP Document Class definiert eine DefaultImplementation auf DXP Source Document Def. Impl.. Diese Default-Implementierung:
- erzeugt keinen SQUEEZE-Beleg,
CreateSource(...)gibtfalsezurück.
Gemeinsame Pipeline innerhalb CreateSource
Beide SQUEEZE-Implementierungen folgen (verkürzt) diesem Muster:
- Guard: Core-Dokument muss
Status = Importedhaben undJSON Rawmuss existieren. DXP SQZ Document Mgt.:CreateSQUEEZEDocHeader(Document, DocHeader, RawJson)CreateSQUEEZEDocLine(DocHeader, RawJson)
DXP Document Mgt.:UpdateDocumentAfterTransfer(...)(Core-Dokument auf „Transferred“ setzen und mit SQZ-Header verknüpfen)- Ordermatch / Autocomplete / Attachments / Validierung (abhängig von Dokumentenklasse und Setup)
Die wichtigsten Events hängen daher an:
- der Header-/Line-Erzeugung in
DXP SQZ Document Mgt. - dem Abschluss der
CreateSource-Prozedur in den jeweiligen Implementierungen - optionalen Schritten wie Ordermatch oder Validierung
Event-Matrix (Kurzüberblick)
| Bereich | Event | Zeitpunkt | Steuerung | Typische Use-Cases |
|---|---|---|---|---|
DXP SQZ API Mgt. |
OnAfterInitMapping(...) |
nach Initialisierung Mapping/Token-Kontext | – | Mapping erweitern/prüfen |
DXP SQZ API Mgt. |
OnAfterSaveAttachment(...) |
nach erfolgreichem Speichern eines Attachments | – | Nachverarbeitung/Indexierung |
DXP SQZ API Mgt. |
OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment(...) |
vor dem Modify des Attachment-Datensatzes | – | Dateiname/Origin beeinflussen |
DXP SQZ P. Inv/Crdt Memo Impl. |
OnAfterCreateDocLines |
direkt nach CreateSQUEEZEDocLine(...) |
– | Lines/RawJson nach Anlage auswerten |
DXP SQZ P. Inv/Crdt Memo Impl. |
OnAfterCreateSource |
am Ende von CreateSource(...) |
– | Post-Aktionen nach Autocomplete/Ordermatch/Validierung |
DXP SQZ P. Inv/Crdt Memo Impl. |
OnBeforeDoPlausibilityChecks |
vor Plausibilitätschecks | IsHandled |
Checks ersetzen/erweitern |
DXP SQZ P. Inv/Crdt Memo Impl. |
OnAfterDoPlausibilityChecks |
nach Plausibilitätschecks | – | Ergebnis weiterverwenden (Entries) |
DXP SQZ P. Order Conf. Impl. |
OnBeforeDoPlausibilityChecks |
vor Plausibilitätschecks | IsHandled |
Checks ersetzen/erweitern |
DXP SQZ Document Mgt. |
OnBeforeModifySQUEEZEDocumentHeader |
in CreateSQUEEZEDocHeader(...) vor finalem Modify |
– | Headerwerte aus RawJson ergänzen/normalisieren |
DXP SQZ Document Mgt. |
OnBeforeTransferRecognizedValuesOnAfterAssignRecognizedValues |
im Standard-Line-Post-Processing vor TransferRecognizedValues |
– | erkannte Werte pro Line korrigieren |
DXP SQZ Document Mgt. |
OnAfterTransferRecognizedValuesOnBeforeInsertDocLine |
im Standard-Line-Post-Processing nach TransferRecognizedValues |
– | line-basierte Ableitungen (Kontierung/Dimensionen) |
DXP SQZ Document Mgt. |
OnBeforePerformAutomaticOrdermatch |
vor automatischem Ordermatch | IsHandled |
Ordermatch komplett übernehmen/OrderNoList anpassen |
| JSON-Erzeugung | OnBeforeAddLineToDocumentJObj |
vor dem Aufbau der Line-Struktur | – | Header-JSON erweitern |
| JSON-Erzeugung | OnBeforeAddLineJObjToLineJArray |
vor LineJArray.Add(LineJObj) |
– | Line-JSON erweitern |
Events in DXP SQZ P. Inv/Crdt Memo Impl. (Dokumentenklasse: Invoice / Credit Memo)
Diese Codeunit bietet die stärksten Erweiterungspunkte direkt im CreateSource-Ablauf.
OnAfterCreateDocLines
Wird direkt nach CreateSQUEEZEDocLine(...) ausgelöst (also nachdem Header & Lines existieren).
Signatur:
[IntegrationEvent(false, false)]
local procedure OnAfterCreateDocLines(DocHeader: Record "DXP SQZ Document Header"; RawJson: JsonObject)
Typische Use-Cases:
- zusätzliche Initialisierung am Header (z. B. eigene Flags/Felder)
- zusätzliche line-basierte Auswertungen direkt nach Anlage
- eigene Metadaten aus
RawJsonextrahieren
OnAfterCreateSource
Wird am Ende von CreateSource(...) ausgelöst (nach Autocomplete/Ordermatch/optionalem Attachment-Download/optionalem Auto-Validate).
Signatur:
[IntegrationEvent(false, false)]
local procedure OnAfterCreateSource(DocHeader: Record "DXP SQZ Document Header"; RawJson: JsonObject)
Typische Use-Cases:
- nachgelagerte Automatisierungen starten (Workflows, Benachrichtigungen)
- zusätzliche Datenvalidierung oder eigene Statuslogik
Plausibilitätsprüfung-Events
Diese Events betreffen die Methode IsSourceDataPlausible(...) und sind relevant, wenn ihr Plausibilitätschecks erweitert/ersetzt.
Signaturen (Auszug):
[IntegrationEvent(false, false)]
local procedure OnBeforeDoPlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; var TempPlausibilityCheckEntry: Record "DXP Plausibility Check Entry" temporary; var IsHandled: Boolean)
[IntegrationEvent(false, false)]
local procedure OnBeforeDoHeaderPlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
[IntegrationEvent(false, false)]
local procedure OnBeforeDoLinePlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; DocLine: Record "DXP SQZ Document Line"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
[IntegrationEvent(false, false)]
local procedure OnAfterDoPlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; var TempPlausibilityCheckEntry: Record "DXP Plausibility Check Entry" temporary)
JSON-Erzeugung (Processed JSON aus dem SQZ-Beleg)
Die Implementierung enthält Events, bevor Line-JSON zur Header-Struktur hinzugefügt wird:
OnBeforeAddLineToDocumentJObj
[IntegrationEvent(false, false)]
local procedure OnBeforeAddLineToDocumentJObj(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
OnBeforeAddLineJObjToLineJArray
[IntegrationEvent(false, false)]
local procedure OnBeforeAddLineJObjToLineJArray(var LineJObj: JsonObject; DocLine: Record "DXP SQZ Document Line")
Use-Cases:
- zusätzliche Felder ins Header-JSON schreiben
- zusätzliche Felder pro Line ergänzen (Custom Tokens)
Events in DXP SQZ P. Order Conf. Impl. (Dokumentenklasse: Order Confirmation)
Diese Codeunit hat keine dedizierten OnAfterCreateSource-Events in CreateSource(...). Erweiterungen passieren hier typischerweise über:
DXP SQZ Document Mgt.(Header/Line-Erzeugung, Ordermatch)- die JSON-Erzeugung (
CreateProcessedJsonFromSource) - Plausibilitätsprüfung-Events
JSON-Erzeugung
[IntegrationEvent(false, false)]
local procedure OnBeforeAddLineToDocumentJObj(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
[IntegrationEvent(false, false)]
local procedure OnBeforeAddLineJObjToLineJArray(var LineJObj: JsonObject; DocLine: Record "DXP SQZ Document Line")
Plausibilitätsprüfung-Events
Analog zur Invoice/Credit-Memo-Implementierung:
OnBeforeDoPlausibilityChecksOnBeforeDoHeaderPlausibilityChecksOnBeforeDoLinePlausibilityChecksOnAfterDoPlausibilityChecks
Events in DXP SQZ Document Mgt. (gemeinsam für alle Dokumentenklassen)
Diese Events sind besonders relevant, weil sie innerhalb der Header/Line-Erzeugung und Ordermatch-Pipeline ausgelöst werden.
OnBeforeModifySQUEEZEDocumentHeader
Wird in CreateSQUEEZEDocHeader(...) ausgelöst, nachdem Werte über Field Mapping zugewiesen wurden und bevor der Header final modifiziert wird.
Signatur:
[IntegrationEvent(false, false)]
local procedure OnBeforeModifySQUEEZEDocumentHeader(var DocHeader: Record "DXP SQZ Document Header"; RawJson: JsonObject)
Use-Cases:
- Header-Felder anpassen, bevor Standard-Post-Processing läuft
- zusätzliche Werte aus
RawJsonin den Header übernehmen
OnBeforeTransferRecognizedValuesOnAfterAssignRecognizedValues
OnAfterTransferRecognizedValuesOnBeforeInsertDocLine
Werden im Standard-Line-Post-Processing (für Standard-Dokumentenklassen) um TransferRecognizedValues(DocLine) herum ausgelöst.
Signaturen:
[IntegrationEvent(false, false)]
local procedure OnBeforeTransferRecognizedValuesOnAfterAssignRecognizedValues(var DocLine: Record "DXP SQZ Document Line"; RowJTok: JsonToken)
[IntegrationEvent(false, false)]
local procedure OnAfterTransferRecognizedValuesOnBeforeInsertDocLine(var DocLine: Record "DXP SQZ Document Line")
Use-Cases:
- erkannte Werte pro Line korrigieren/normalisieren
- zusätzliche Ableitungen (z. B. Kontierung, Dimensionen) vorbereiten
OnBeforePerformAutomaticOrdermatch
Wird in PerformAutomaticOrdermatch(...) ausgelöst, nachdem die Order-Nummern-Liste (OrderNoList) gefüllt wurde und bevor der automatische Ordermatch läuft.
Signatur:
[IntegrationEvent(false, false)]
local procedure OnBeforePerformAutomaticOrdermatch(DocHeader: Record "DXP SQZ Document Header"; var OrderNoList: List of [Code[20]]; var IsHandled: Boolean)
Use-Cases:
- automatische Ordermatch-Logik komplett übernehmen (
IsHandled := true) - OrderNoList anpassen (z. B. filtern/ergänzen)
Events in DXP SQZ API Mgt. (kontextnah zur Anlage/Attachments)
Diese Events liegen „um“ die API-Kommunikation herum (z. B. Attachments).
OnAfterInitMapping
Wird in DownloadFieldMapping(...) ausgelöst, nachdem die Dokumentenklasse über das Interface DXP ISource Document das Default-Mapping initialisiert hat (ISourceDocument.InitFieldMapping(...)) und bevor die Feldliste aus SQUEEZE in die BC-Field-Mapping-Strukturen synchronisiert wird.
Signatur:
[IntegrationEvent(false, false)]
local procedure OnAfterInitMapping(var HeaderMapping: Dictionary of [Text, Integer]; var LineMapping: Dictionary of [Text, Integer]; DocClass: Enum "DXP Document Class")
Parameter:
HeaderMapping/LineMapping: Dictionaries mit Default-Zuordnung SQZ-Feldname → BC-Feldnr. (übervarveränderbar)DocClass: Dokumentenklasse, für die das Mapping geladen wird
Typische Use-Cases:
- zusätzliche (kundenspezifische) Feldnamen als Default-Mapping ergänzen
- Default-Mapping korrigieren (z. B. wenn sich SQZ-Feldnamen geändert haben)
- Mapping-Validierung/Logging je Dokumentenklasse
OnAfterSaveAttachment
Wird in SaveAttachments(...) pro Attachment ausgelöst, nachdem das Attachment über DXP Document Attachment Mgt. angelegt wurde und – falls das Attachment als Origin-Datei markiert ist – nach dem Modify(true) des Datensatzes.
Signatur:
[IntegrationEvent(false, false)]
local procedure OnAfterSaveAttachment(DocumentAttachment: Record "DXP Document Attachment")
Hinweis:
DocumentAttachmentwird nicht alsvarübergeben. Wenn ihr Felder am Datensatz persistent ändern möchtet, müsst ihr im Subscriber den Datensatz erneut laden und explizitModify(...)ausführen.
Typische Use-Cases:
- Attachment extern indexieren/archivieren
- Metadaten ableiten (z. B. Klassifizierung nach MIME-Type/Dateiendung)
- Folgeprozesse triggern (z. B. OCR/Preview-Generierung in Drittsystem)
OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment
Wird in SaveAttachments(...) ausgelöst, wenn das Attachment laut Payload als Origin-Datei markiert ist und nachdem Is Source File sowie File Name (Origin-Name) gesetzt wurden – aber bevor DocumentAttachment.Modify(true) aufgerufen wird.
Signatur:
[IntegrationEvent(false, false)]
local procedure OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment(var DocumentAttachment: Record "DXP Document Attachment")
Typische Use-Cases:
- Origin-Dateinamen normalisieren (z. B. verbotene Zeichen entfernen, Namensschema erzwingen)
- zusätzliche Felder am Attachment setzen, bevor gespeichert wird
Minimalbeispiele: EventSubscriber für DXP SQZ API Mgt.
Die folgenden Beispiele zeigen typische, kleine Erweiterungen. Passt Objekt-IDs/Namen an euren Namespace an.
codeunit 50101 "My SQZ API Mgt. Subs"
{
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ API Mgt.", 'OnAfterInitMapping', '', false, false)]
local procedure OnAfterInitMapping(var HeaderMapping: Dictionary of [Text, Integer]; var LineMapping: Dictionary of [Text, Integer]; DocClass: Enum "DXP Document Class")
var
SqzDocHeader: Record "DXP SQZ Document Header";
SqzDocLine: Record "DXP SQZ Document Line";
begin
// Beispiel: neues SQZ-Feld als Default-Mapping ergänzen.
// Wichtig: Der Integer-Wert ist die BC-Feldnr. des Ziel-Feldes (abhängig von eurem Mapping-Konzept).
if not HeaderMapping.ContainsKey('my_custom_header_token') then
HeaderMapping.Add('my_custom_header_token', SqzDocHeader.FieldNo("Vendor No."));
if not LineMapping.ContainsKey('my_custom_line_token') then
LineMapping.Add('my_custom_line_token', SqzDocLine.FieldNo(Description));
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ API Mgt.", 'OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment', '', false, false)]
local procedure OnAfterSetOriginFileNameOnBeforeModifyDocumentAttachment(var DocumentAttachment: Record "DXP Document Attachment")
begin
// Beispiel: Origin-Dateiname normalisieren (Whitespace entfernen).
DocumentAttachment."File Name" := DelChr(DocumentAttachment."File Name", '=', ' ');
end;
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ API Mgt.", 'OnAfterSaveAttachment', '', false, false)]
local procedure OnAfterSaveAttachment(DocumentAttachment: Record "DXP Document Attachment")
begin
// Beispiel: Nachverarbeitung anstoßen.
// Falls ihr persistent am Attachment ändern wollt, könnt ihr den Parameter-Datensatz auch direkt modifizieren.
// DocumentAttachment.Validate("Your Field", ...);
// DocumentAttachment.Modify(true);
end;
}
No Comments