Events

Der Connector NAV/BC stellt für die XRechnung-Erzeugung einen Integration-Event bereit, mit dem das generierte XML vor dem Schreiben in die Ausgabedatei programmatisch angepasst werden kann.


OnAfterGenerateXML

Codeunit: 5402584 CON Exp. Sales Inv. XRechnung

Wird nach der XML-Generierung über die XMLPorts 5402510–5402513 ausgelöst und stellt das vollständige XML als Blob zur Verfügung. Änderungen am Parameter XmlBlob werden direkt in die Ausgabedatei übernommen.

Parameter Typ Beschreibung
CONJoblist Record 5402511 Der zugehörige Joblisten-Datensatz (nur lesend)
XmlBlob Record 99008535 Das erzeugte XML als Blob (VAR – änderbar)
Beispiel: BuyerReference und Note per Subscriber setzen

Das folgende Beispiel zeigt einen vollständigen Subscriber in einer eigenen Codeunit. Der Subscriber liest das XML aus dem Blob, modifiziert zwei Elemente per XPath und schreibt das Ergebnis zurück.

Hinweis: Für CII-Dokumente (XPort 5402513) gelten andere XML-Namespaces.
CONJoblist."PEPPOL CIUS" kann verwendet werden, um UBL und CII im Subscriber zu unterscheiden.

    [EventSubscriber(Codeunit,5402584,OnAfterGenerateXML)]
    LOCAL PROCEDURE OnAfterGenerateXML@1(CONJoblist@1000 : Record 5402511;VAR XmlBlob@1001 : Record 99008535);
    VAR
      XmlDoc@1002   : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlDocument";
      XmlNsMgr@1003 : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNamespaceManager";
      XmlNode@1004  : DotNet "'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Xml.XmlNode";
      InStream@1005  : InStream;
      OutStream@1006 : OutStream;
      XmlText@1007   : Text;
    BEGIN
      // XML aus Blob lesen
      XmlBlob.Blob.CREATEINSTREAM(InStream, TEXTENCODING::UTF8);
      InStream.READ(XmlText);

      // In XmlDocument laden
      XmlDoc := XmlDoc.XmlDocument;
      XmlDoc.LoadXml(XmlText);

      // UBL-Namespaces fuer XPath registrieren
      XmlNsMgr := XmlNsMgr.XmlNamespaceManager(XmlDoc.NameTable);
      XmlNsMgr.AddNamespace('cbc', 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2');
      XmlNsMgr.AddNamespace('cac', 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2');

      // Beispiel 1: Vorhandenes Element ueberschreiben (BT-22 Note)
      XmlNode := XmlDoc.SelectSingleNode('//cbc:Note', XmlNsMgr);
      IF NOT ISNULL(XmlNode) THEN
        XmlNode.InnerText := 'Interner Hinweis aus Subscriber';

      // Beispiel 2: Wert aus CONJoblist uebernehmen (BT-10 BuyerReference)
      XmlNode := XmlDoc.SelectSingleNode('//cbc:BuyerReference', XmlNsMgr);
      IF NOT ISNULL(XmlNode) THEN
        XmlNode.InnerText := CONJoblist."Ident-ID";

      // Geaendertes XML zurueck in den Blob schreiben
      CLEAR(XmlBlob.Blob);
      XmlBlob.Blob.CREATEOUTSTREAM(OutStream, TEXTENCODING::UTF8);
      OutStream.WRITE(XmlDoc.OuterXml);
    END;