directmail/directspool/pdfenhancer und ZUGFeRD

Toolmaker Produkt-Dokumentation

directmail/directspool/pdfenhancer und ZUGFeRD

Inhaltsübersicht

Übersicht: was ist ZUGFerD?

Der PDF-Standard PDF/A-3 erlaubt neben dem Transport des Belegs die gleichzeitige Auslieferung der Rechnungsdaten im XML-Format. Dies erfolgt sozusagen als interner „Anhang" einer PDF-Datei. Der Empfänger wird so in die Lage versetzt, die wichtigen Daten einer Rechnung in eine Datenbank zu exportieren. Die manuelle Erfassung durch Ablesen vom Beleg entfällt.

Einige große Unternehmen haben diese Methode des Datentransfers bereits zur Bedingung bei der Rechnungsschreibung in Form einer PDF-Datei gemacht oder sie für die nahe Zukunft als notwendig angekündigt.

DirectSpool (früher Automail) wurde erweitert, um die Rechnungsdaten aus der Spooldatei (SPLF) abzugreifen und der PDF-Datei als XML-Daten mitzugeben. Für den Absender ist keine Programmierung erforderlich. Der Empfänger kann mit dem Adobe Reader den Beleg anzeigen und über das Symbol „Büroklammer" den Export der XML-Daten vornehmen (dazu mehr weiter unten).

FeRD oder ZUGFeRD?

Die Begriffe FeRD (Forum elektronische Rechnung Deutschland) und ZUGFeRD (Zentraler User Guide vom Forum elektronische Rechnung Deutschland) meinen in der Regel das gleiche.

Das Forum hat eine Verfahrensbeschreibung ZUGFeRD erstellt, die für Unternehmen aller Art als Norm oder Orientierung dienen soll, damit der Datenaustausch vom Absender zum Empfänger auf digitalem Weg rasch und fehlerfrei erfolgen kann. Dies ist Teil der Digitalisierungsbestrebungen der deutschen Wirtschaft.

Weitere Informationen zum System "ZUGFeRD" finden Sie unter https://www.ferd-net.de/standards/was-ist-zugferd/was-ist-zugferd.html.

Varianten: BASE / EXTENDED / COMFORT

Der ZUGFeRD-Standard kennt verschiedene "Profile". directmail unterstützt derzeit BASE, EXTENDED und COMFORT.

Jedes dieser Profile bietet "Raum" für die Daten von Rechnungen.

Darüber hinaus sind noch die Profile XRECHNUNG und BASIC WL definiert.

Auszug aus ZUGFeRD-2.1.1 - Spezifikation.pdf - siehe: https://www.ferd-net.de/standards/zugferd-faq

Für den erfolgreichen Einsatz von ZUGFeRD in directmail ist es zunächst erforderlich, sich mit den Geschäftspartnern über das zu verwendende Profil abzustimmen: welche Daten sollen übertragen werden?

Das Profil EXTENDED wird in den meisten Fällen allen Anforderungen gerecht.

"Business Terms" - die verschiedenen Feldarten

Für jedes Feld, das in den Rechnungen verwendet werden kann, ist ein "Business Term" (BT) festgelegt.

Dabei wird unterschieden zwischen "Header"- und "Positions"-Feldern.

Auszug aus der Excel-Datei /Toolmaker/directmail400/zugferd/ZUGFERD_##ZUG22BSP_INFO.xlsx

Toolmaker stelle seinen Kunden eine Excel-Datei zur Verfügung, in der alle Business Terms aufgelistet sind.

Voraussetzungen für den Einsatz von directmail für ZUGFeRD

  • DirectSpool/DirectMail ab Version 5.50

  • Toolmaker Lizenz für ZUGFeRD XML (ggf. auch für XMR)

  • Spooldateien mit SCS oder IPDS Datenstrom (Standard)

Vorlagen für die ZUGFeRD / X-Rechnung - Dateien

Um eine ZUGFeRD oder X-Rechnung - XML-Datei zu erzeugen, verwendet directspoo:

1. eine Kopiervorlage, in der die auszugebenden Felder stehen. Dieses ist eine XML-Datei im ZUGFeRD/X-Rechnungs - Format, in der die Werte als Variablen "*BTxxx* stehen.

2.Sätze in einer IBMi-Datenbankdatei in der Bibliothek DIRMAIL: für jeden Business Term ein Datensatz

XML-Layoutdateien im IFS-Verzeichnis /Toolmaker/DirectMail400/Zugferd

 

  • Dateien ZUG.XML und ZUG.XMP 

 

Aufbau einer directspool (AutoMail) - Definition zum Erzeugen von ZUGFeRD oder X-Rechnung Dokumenten

Den Rahmen einer directspool-Definition für ZUGFeRD definieren

Ausgabeformat (F9-AF) *EPDF

PDF-Formularangaben (F9-FP)

  •  

    • Wenn ein Formular eingebunden werden soll, dann muss das das Format PDF/A haben

    • Fontdatei im IFS unter /Toolmaker/DirectMail400/Fonts (z.B. cour.ttf)

    • Wert *ZUGFERD im Parameter PDF/A erstellen

 


Indizes für ZUGFeRD definieren

Wie in DirectSpool üblich, werden variable Daten per Definition aus der Spooldatei abgegriffen und als Indizes gespeichert (Beispiel &RGNR).

Außerdem können per SQL Werte aus einer Datei gelesen und auch als Indizes definiert werden.

SQL-Indizes müssen in der richtigen Reihenfollge geholt werden

Wenn Daten mit SQL-Indizes abegriffen werden, dann müssen die selects in dieser Reihenfolge ausgeführt werden:

  1. select(s) für die Positionsdaten

  2. select(s) für die Headerdaten

 

Seitens ZUGFeRD gibt es fest vordefinierte Felder sowohl für die Kopf- als auch die Positionsdten einer Rechnung, denen über eine komfortable Funktion die gesammelten Indizes aus der SPLF zugeordnet werden. Auch die Verwendung von konstanten Werten und die Nutzung von Datumsroutinen zur Formatumsetzung sind möglich.

Ausgehend von einer funktionierenden Automail-Definition wird nachfolgend beschrieben, wie die Funktion ZUGFeRD aktiviert und die Indizes zugeordnet werden.

Rufen Sie DirectSpool (Automail) mit WRKATMDEF auf. Drücken Sie dann Taste F7 ZUGFeRD Definition.

 

X-File Template  - Definiert Die Einbettungsstruktur für das PDF

X-ADD Template - zug.xmp definiert das Muster für die Zugferd Struktur

Anfang Position / Ende Position - bestimmt die Vervielfältigung der Positionen. Z.B Rechnungspositionen

API Programm - es kann ein Programm hinterlegt werden, in welchem das XML erzeugt wird

Das Programm muss in der Bibliothek DIRMAIL stehen und einen beliebigen neuen Namen Haben

Nachfolgend ein API Musterprogramm:

Muster für ein API-Programm
CTL-OPT DEBUG(*YES) OPTION(*NODEBUGIO) ; CTL-OPT DECEDIT('0,') DATEDIT(*DMY.) ; //******************************************************************** // Example ZugFeRD API Programm * // * // Autor: Roman Tutschka 07.2019 * //******************************************************************** // CREATE COMMANDS: // Replace PGMLIB , SRCLIB , PGMNAM with your own Names // PGMLIB is normaly DIRMAIL use an NEW !!! Programm Name // COMMANDS: // ADDLIBLE DIRMAIL // // CRTSQLRPGI OBJ(PGMLIB/PGMNAM) SRCFILE(SRCLIB/QRPGLESRC) // SRCMBR(PGMNAM) COMMIT(*NONE) OBJTYPE(*MODULE) USER(*CURRENT) // REPLACE(*YES) DBGVIEW(*SOURCE) // // CRTPGM PGM(PGMLIB/PGMNAM) BNDSRVPGM((DIRMAIL/DMLIB)) // // Entry ? DCL-PR DMWRKZUX ; ID PACKED(11:0); // Identifikation SEGMENT PACKED(9:0); // Identifikation PXML POINTER ; // Returns Pointer for embedded XML siz INT(10) ; // Returns Size of the XML END-PR; // Internal Definition ? DCL-PI DMWRKZUX ; ID PACKED(11:0); // Identifikation SEGMENT PACKED(9:0); // Identifikation PXML POINTER ; // Returns Pointer for embedded XML siz INT(10) ; // Size of the XML END-PI; DCL-PR dm_etoa INT(10) extproc('dm_etoa') ; buffer CHAR(32767) options(*varsize) ; bufferlen INT(10) value ; END-PR; DCL-S PRETCHAR char(999999) based(PXML) ; // DCL-DS DSHDR EXTNAME('DMEXCHDR') END-DS; // Datastucture for Header Information DCL-DS DSZUG EXTNAME('DMATMZUG') QUALIFIED END-DS; // Datastucture for ZUGFERD Information DCL-DS DSIDX EXTNAME('DMEXCIDX') QUALIFIED END-DS; // Datastucture for INDEX Information DCL-S INDEXNAM LIKE(DSIDX.EINAM) ; // Name of the Index //******************************************************************** // Main Programm //******************************************************************** PXML = %ALLOC(10000000); // Allocate MAX space for Return FREED in DIRMAIL // Read DIRMAIL Header Information OPTIONAL EXEC SQL SELECT * INTO :DSHDR FROM DMEXCHDR WHERE EASEQ = :ID ; // Read Indexes Values from DIRMAIL clear DSIDX; // init INDEXNAM = 'RGNR'; // Example in this case the result // is the Value from the DIRMAIL Index for Example the Invoice Number EXEC SQL SELECT I.* INTO :DSIDX from DMEXCSEG as S join DMEXCIDX as I on ESSEQ = EISEQ WHERE ESSEQ = :ID AND ESNUM = :SEGMENT AND EIPAG >= ESSTR AND EIPAG <= ESEND AND EINAM = :INDEXNAM FETCH FIRST 1 ROWS ONLY; // Result value for the example Index ''RGNR'' in in DSIDX.DSIDX // Create Embedded XML // EXAMLE Value IF SQLCOD = 0; // Example embed INVOICE Number INDEXNAM RGNR exist PRETCHAR = DSIDX.EIVAL ; // Example embed INVOICE Number INDEXNAM ELSE; // Example embed INVOICE Number INDEXNAM RGNR do not exist PRETCHAR = 'RETURN XML' ; // Example ENDIF; // Convert to ASCII needed if the valoue is in EBDIC dm_etoa(PRETCHAR: %LEN(%TRIM(PRETCHAR))) ; siz = %LEN(%TRIM(PRETCHAR)) ; // if the Value of the XML is in ASCII only return the address of PXML // and the Size of DATA return;

ZUGFeRD Definitionen und Default-Werte

Nach dem Druck auf Enter erscheint folgendes Dialogprogramm, mit dem Sie die Standardwerte je FeRD Feld erfassen und abspeichern können.

Hinweise zu den Spalten:

Typ: H=Header (Kopfinfos der Rechnung), P=Positionen (z.B. für Artikelzeile)

Variablen Name: Der von der ZUGFeRD Organisation festgelegte Name für ein Merkmal

Default Wert: Ein von Ihnen für Ihre Firma vorgegebener konstanter Wert für ein Merkmal

XML Format: Hier kann bei Bedarf mit F4 die Funktion für Dezimal- und Datumsformate ausgewählt werden. Die angezeigten Möglichkeiten sind in der Parameter Kontrolldatei von WOPiXX unter ZUGFORMAT definiert.

Herkunft Format: Angeben, wenn unbedingt erforderlich. Normalerweise wird das Datumsformat automatisch erkannt. Auch hier kann mit F4 das Format ausgewählt werden. Die angezeigten Möglichkeiten sind in der Parameter Kontrolldatei von WOPiXX unter ZUGOFORMAT definiert.

Reihenfolge: Sequenz für die Darstellung in dieser Anzeige.

Falls die Variablen Namen nicht verständlich sind, kann mit F11 die Sicht umgeschaltet und eine Bezeichnung eingeblendet werden.

Erforderliche Indizes prüfen

Alle variablen Werte aus der Spooldatei, die als XML-Daten mit in die PDF-Datei eingefügt werden sollen, müssen als Indizes definiert worden sein. Beispiel:

Das Thema Indizes definieren und bedingen wird als bekannt vorausgesetzt (siehe Kapitel "Index erstellen" auf der Seite directspool Dokumentation). Das Bild zeigt die grafische Darstellung der definierten Indizes in Umkehranzeige und deren Bedingungskonstanten mittels Unterstreichung. Die Farben können abweichen. Die Detailangaben werden im folgenden Bild dargestellt.

Die Auflistung und Verwaltung der Indexeinträge kann über Pulldown Menü Index und Punkt 4 Mit Indizes arbeiten erreicht werden. Jeder Indexname kann durch ein vorangestellte & an den gewünschten Stellen in der Automail Definition verwendet werden.

ZUGFeRD Zuordnungen

Für die Zuordnung der einzelnen Indizes aus der Spooldatei zu den festen Feldnamen der XML-Struktur wird folgendes Bild verwendet. Es kann über das Pulldown Menü Extras und Punkt 3 erreicht werden.

Es werden alle ZUGFeRD Default Werte angezeigt (Beschreibung siehe oben) und man kann jetzt mit F4 bei den noch leeren Zeilen die Indizes aus einer Liste mit 1 auswählen. Ein Index ist an dem führenden Zeichen & zu erkennen (Beispiele &RGDAT, &KDNR, &RGNR).

Falls die Variablen Namen nicht verständlich sind, kann mit F11 die Sicht umgeschaltet und eine Bezeichnung eingeblendet werden.

Format der PDF-Datei

Innerhalb der directspool-Definition ist zu prüfen, ob das Spoolausgabe Format richtig gesetzt ist, es muss *EPDF sein.

In directspool (Automail) finden Sie dieses Fenster unter dem Pulldown Menü Email bei 3. Ausgabeformat.

PDF Formularangaben – Parameter Schriftart und PDF/A *ZUGFERD

Unter dem Punkt 5. Formular/Papier im Menü Email müssen 2 Parameter gesetzt werden.

Schriftart - muss den Namen einer Fontdatei enthalten.

Dieses ist üblicherweise COUR.TTF.  (Diese Schriftart stammt aus dem Windows Umfeld und wird nicht von Toolmaker geliefert).

Die Schriftart-Datei muss im IFS-Verzeichnis unter

/Toolmaker/Directmail400/Fonts

existieren .

Grund: Fontdateien können Copyrights unterliegen! Wird keine Fontdatei bereitgestellt und hier angegeben, tritt ein Fehler auf. Der hier allgemein angegebene Sonderwert *COURIER ist nicht ausreichend, weil das PDF/A Format die Einbettung der Fontdatei erzwingt.

PDF/A erstellen - Hier muss *ZUGFERD angegeben werden, damit die XML-Daten auch in die PDF-Datei eingefügt werden.

Definition abspeichern

Nachdem alle erforderlichen Indizes den ZUGFeRD Variablen zugeordnet wurden, kann die Definition mit F3 und J=Ja abgespeichert werden

Nicht erlaubte Sonderzeichen (&, <, >, " und ')

Es gibt fünf Zeichen, die nicht in XML-Dateien erlaubt sind. An ihrer Stelle muss man eine sog. "escape"-Sequenz eintragen. Es sind dies:

Zeichen

Escape-Sequenz

Zeichen

Escape-Sequenz

"

&quot;

'

&apos;

<

&lt;

>

&gt;

&

&amp;

(siehe z.B. https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents)

Das kaufmännische Und (&) wird automatisch korrigiert

Ein Beispiel: in einer spoolmail-Definition wird ein Index aus einer Datenbankdatei geholt. Das Feld enthält den Namen einer Firma:

ACME GmbH & Co. KG

Wenn dieser String "as is" in die XML-Datei übernommen würde, käme es zu einem Syntaxfehler.

Directspool korrigiert jedoch den String bei der Übernahme automatisch und setzt ihn um in:

<ram:SellerTradeParty>
  <ram:Name>ACME GmbH &amp; Co. KG</ram:Name>

Für den Entwickler der directspool-Definition besteht also kein besonderer Handlungsbedarf.

Spezialfälle: den String mit <![CDATA[....]]> umgeben

Die Sequenz <![CDATA[<beliebiger_text>]]> sorgt dafür, dass in <beliebieger_text> auch Sonderzeichen angegeben werden können. Der XML-Parser ignoriert diese. Damit kann der Inhalt des Feldes ohne Änderung ausgegeben werden.

Lösung mit <![CDATA
<ram:SellerTradeParty> <ram:Name> <![CDATA[ Artikel "Kerzenständer 30cm" nicht lieferbar ]]> </ram:Name> ...

Weitere Hinweise zu <![CDATA: (https://stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean

Ergebnis prüfen

Davon ausgehend, dass es sich um eine funktionierende Automail Definition handelt, die jetzt um die ZUGFeRD Funktion erweitert wurde, kann eine passende Spooldatei in der überwachten OUTQ eingefügt und das Ergebnis der Konvertierung geprüft werden. Es kann sich bei dem von Ihnen definierten Ablauf um eine E-Mail mit PDF-Anhang, eine ins IFS exportierte PDF-Datei oder um eine archivierte PDF-Datei handeln.

Das PDF-Dokument validieren

Disclaimer

Disclaimer: Wir haben keinen Einfluss auf die Inhalte dieser Website und übernehmen keine Gewähr für sie.

Bei ZUGFeRD-PDF-Dokumenten gibt es einige Anforderungen an die PDF-Datei. Unter Anderem muss die Datei den PDF A-3b Standard haben und es müssen alle Schriftarten, die verwendet werden auch eingebettet sei.

Das Validieren einer PDF-Datei kann man mit verschiedenen Online-Portalen durchführen.

Eines davon ist das der Firma veraPDF. Hier die Demo-Seite: https://demo.verapdf.org/

XML-Datei aus dem PDF-Dokument exportieren

Klicken Sie die PDF-Datei doppelt. Es sollte sich der Adobe Reader öffnen und den Inhalt anzeigen. An dieser Anzeige hat sich nichts geändert, aber es wird in der linken, senkrechten Symbolleiste eine Büroklammer angezeigt.

Diese anklicken und die Liste der Dateianlagen prüfen. Die ZUGFeRD XML Datei doppelklicken – es öffnet sich die Anwendung, die mit der Endung XML verbunden ist und zeigt den XML Code an. Möglicherweise kommt vorher noch ein Warnhinweis wg. potentieller Risiken beim Öffnen.

 

Mit Rechtsklick auf den Namen der Datei können Sie die XML Datei in einem Verzeichnis speichern.

Hinweise

Falls Sie z.B. von Ihren Lieferanten Rechnungen im PDF/A-3 Format bekommen, wird genau wie zuvor beschrieben vorgegangen, um den XML Anhang zu exportieren.

Auf der IBM i ist es möglich, eine XML-Datei automatisiert in's IFS zu exportieren und zu verarbeiten. Weitere Informationen hierzu:

 

XML mit einem PC-Editor bearbeiten

Einige Editor-Programme für PCs bieten die Möglichkeit XML-Dateien "vernünftig" anzuzeigen und auch die Syntax zu prüfen.

Zum Beispiel Notepad++

Zum Beispiel gibt es sog. "Plug-Ins" für die OpenSource Software Notepad++ (https://notepad-plus-plus.org/) für diese Zwecke. Hier wären zu nennen

  • XML Tools - Saubere Darstellung, Syntaxprüfung

  • Npp Xml Treeview - Darstellung der XML-Datei als Baum

 

XML mit Notepad++ validieren

Dazu benötigt man die XSD-Dateien, die vom ZUGErD-Konsortium bereitgestellt werden:

  • Prüfungen mit Schema Beispiele für Zugferd 2.4

…Hier die Anleitung, wie man das macht

 

ZUGFeRD-Validierungsportale

Disclaimer

Disclaimer: Wir haben keinen Einfluss auf die Inhalte dieser Website und übernehmen keine Gewähr für sie.

 

https://www.portinvoice.com/

 

 

Im Fehlerfall sieht das anders aus.

Beispiele für Fehlermeldungen von portinvoice

Meldung

“Pfad” in der XML-Datei factur-x.xml

Hinweis

Meldung

“Pfad” in der XML-Datei factur-x.xml

Hinweis

grafik-20260317-135916.png
grafik-20260317-140436.png

 

Die E-Mail-Adresse darf nicht leer sein, wenn das Feld in der XML-Datei vorkommt.

Bei Einsatz der XSLT-Transformation sollte solch ein Fehler nicht mehr vorkommen.

grafik-20260317-140952.png

 

grafik-20260317-141655.png

 

Ein Rechenfehler bei der Berechnung der Gesamt-Postionssumme

 

Hinweis: mit KI-Seiten, wie z.B. ChatGPT ist es möglich die Fehlermeldungen besser zu interpretieren.

 


XLST-Konvertierungen der erstellten Zugferd-XML-Datei

2026-01-15 - Verfügbar ab Version 5.60 mit PTF 18

Mit Hilfe von XSLT-Konvertierungen kann eine XML-Datei nachträglich noch einmal “überarbeitet” werden. Die ZUGFeRD- oder X-Rechnungs-XML wurde als von Automail erstellt und kann jetzt noch geändert werden.

Das ist z.B. dann nützlich, wenn die XML-Zeilen für Werte entfernen möchten, die 0 oder leer sind.

Beispiel: hier ist der Werte für einen Rabatt - die AppliedTradeAllowanceCharge - 0.00. In diesem Fall soll die ganze Zeile aus der XML-Datei entfernt werden. Es sollten also alle Zeilen

von <ram:AppliedTradeAllowanceCharge>
bis </ram:AppliedTradeAllowanceCharge>

aus der Datei gelöscht werden.

<ram:GrossPriceProductTradePrice> <ram:ChargeAmount>912.00</ram:ChargeAmount> <ram:AppliedTradeAllowanceCharge> <ram:ChargeIndicator> <udt:Indicator>false</udt:Indicator> </ram:ChargeIndicator> <ram:CalculationPercent>0.00</ram:CalculationPercent> <ram:ActualAmount>0.00</ram:ActualAmount> <ram:Reason/> </ram:AppliedTradeAllowanceCharge> <ram:AppliedTradeAllowanceCharge> <ram:ChargeIndicator> <udt:Indicator>false</udt:Indicator> </ram:ChargeIndicator> <ram:CalculationPercent>-15.90</ram:CalculationPercent> <ram:ActualAmount>-145.01</ram:ActualAmount> <ram:Reason>Verbandsrabatt</ram:Reason> </ram:AppliedTradeAllowanceCharge> <ram:AppliedTradeAllowanceCharge> <ram:ChargeIndicator> <udt:Indicator>false</udt:Indicator> </ram:ChargeIndicator> <ram:CalculationPercent>0.00</ram:CalculationPercent> <ram:ActualAmount>0.00</ram:ActualAmount> <ram:Reason/> </ram:AppliedTradeAllowanceCharge> </ram:GrossPriceProductTradePrice> <ram:NetPriceProductTradePrice> <ram:ChargeAmount>766.99</ram:ChargeAmount> </ram:NetPriceProductTradePrice>

Komponenten für die XSLT-Transformierung

Muster-XSLT-Datei “ZUG.XSLT”

Diese XSLT-Datei wird mit dem Produkt mitgeliefert.

Sie löscht alle Felder, die leer oder 0 sind.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="//AppliedTradeAllowanceCharge[CalculationPercent=0]"/> </xsl:stylesheet>$

Die Muster-XSLT-Datei aktivieren (durch Kopieren der ZUG.XLST)

Wenn diese XSLT-Transformation gewünscht wird, dann muss die Datei ZUG.XLST im IFS-Verzeichhnis /Toolmaker/directmail400/Zugferd kopiert werden.

Der Name der Kopie muss identisch sein, mit dem Namen des X-File Template, das in den “X-File Einstellungen” angegeben ist:

  1. WRKATMDEF

  2. F7

  3. Auswahl 2 für die verwendete Definition:

grafik-20260115-095452.png

In diesem Beispiel ist das verwendete X-File Template ZUGTT.XML.

Die Kopie der ZUG.XLST muss also ZUGTT.XSLT heissen.

Wenn directspool bei der Verarbeitung einer spooled file mit Zugferd-Daten eine XSLT-Datei findet, die denselben Namen trägt, wie das X-File Template, dann wird automatisch dese XLS-Transformation durchgeführt.

Die XSLT-Transformation abschalten

Die ganze XSLT-Funktionalität ist erst unter IBMi V7R3 verfügbar und erfordert auch einen Mindest-PTF-Stand.

Wenn dieser nicht gegeben ist, dann muss sie abgeschaltet werden, damit das Programm DMCVTCX nicht abstürzt:

  • Abschalten: CHGDTAARA DTAARA(DIRMAIL/DMDTAARA (1439 1)) VALUE('X')

  • Einschalten: CHGDTAARA DTAARA(DIRMAIL/DMDTAARA (1439 1)) VALUE(' ')

Die XADD-Dateien

Eine XADD-Datei bearbeiten

Rufen Sie DirectSpool (Automail) mit WRKATMDEF auf. Drücken Sie dann Taste F7 ZUGFeRD Definition.

Wählen Sie Auswahl 8 für die zu ändernde Datei

Damit öffnet sich der Editor mit dieser Datei. Sie können jetzt die anstehenden Änderungen vornehmen.

 

Export-API DMEXPPDA für PDF/A-3 Dateien

Diese Schnittstelle wird gesondert lizenziert und kann mit dem Lizenzcode XMR von Toolmaker freigeschaltet werden.

Sie haben eine PDF/A-3 Datei erhalten. Wenn Sie den Export der XML Daten in der IBM i Welt automatisiert durchführen und die XML Daten gleich verarbeiten wollen, können Sie das DirectSpool API Programm DMEXPPDA aus Ihrer Anwendung aufrufen und 3 Parameter übergeben.

RPGLE Beispiel (Testprogramm Ausschnitt):
// Definitions
DCL-S ifsobj char(250) inz('/A/Zugferd_Testhw1_QPRINT.PDF') ;
DCL-S ifsout char(250) inz('/A/Zugferd_Testhw1_OUTPUT.xml') ;
DCL-S retcod char(80) inz ;
Dcl-Pr DMexppda ExtPgm('DMEXPPDA') ;
PDFDocument CHAR(250) ;
resultFile CHAR(250) ;
returnCode CHAR(80) ;
End-Pr ;
// Call the program
DMexppda(ifsobj:ifsout:retcod) ;
if retcod = *blank ;
// PDF Attachment has been exported
Else ;
// error handling
Endif ;

 

Virtuelle Positionsnummern

2026-03-03

Es gibt Anwendungen, die keine eindeutigen Positionsnummern in den Rechnungen. Diese sind aber zwingend erforderlich.

Für diese Fälle steht das Hotfix “Virtuelle Positionsnummern” zur Verfügung.

Hinweise zur Verwendung:

Es muss ein Index erstellt werden, der den Namen POSNR trägt:

grafik-20260303-085205.png
grafik-20260303-085306.png

Zu-/Abschläge und Rabatte auf Positionsebene

In unserem Standard XML-template, ("ZUG2025.xml”) gibt es Felder für einen Positionsrabatt.

Wenn mehr Zu- und/oder Abschläge auf Positionsebene benötigt werden, dann ist so vorzugehen:

Schnittstellendatei für Positionen erweitern

  1. die Anzahl der maximal benötigten Zu-/Abschläge pro Position ermitteln. - Das ist “n”

  2. Die Schnittstellendatei für die Position um n mal die Felder in der Tabelle erweitern:

Feldname

Bedeutung

Inhalt (wird vom Programm in die Schnittstellendatei für die Positionen geschrieben)

Feldname

Bedeutung

Inhalt (wird vom Programm in die Schnittstellendatei für die Positionen geschrieben)

RBxxCHG

Zu- oder Abschlag

Erlaubte Werte

  • true = Zuschlag

  • false = Abschlag (Rabatt)

  • *none = werden die Felder dieser Unterposition gelöscht (mit XSLT-Transformation)

RBxxPRC

Zu-/Abschlag Prozent

Prozentzahl, z.B. “12.0

RBxxAMTB

Basistbetrag

Positions-Betrag, von/zu dem berechnet wird, z.B. “260.00

RBxxAMTA

Betrag des Zu-/Abschlges

Berechneter Wert für den Zu-/Abschlag, z.B. “31.20

RBxxTXT

Freitext

Text, wie z.B. “Positionsrabatt”, “Verpackungspauschale”, etc.

  1. Das Programm, das die Schnittstellendateien füllt so ändern, dass es diese n Feld-Gruppen füllt.

Neues XML-template erstellen

Das template und die Felder definieren

WRKATMDEF - F7

Die Definition ZUG2025 kopieren - hier z.B. nach “ZUG2025POS”:

grafik-20260313-102107.png
grafik-20260313-102317.png

Enter drücken

grafik-20260313-103443.png
  • höchste Zahl in Spalte Reihenfolge merken: hier 111

F6 drücken

grafik-20260313-103604.png
  • P

  • RBxxCHG

  • Enter

grafik-20260313-104035.png
  • Beschreibung bei Default Wert eintrgen

  • Lfd. Nummer = die oben gemerkte Zahl +1

  • F6 drücken

Diese Schritte wiederholen, bis alle Felder vorhanden sind (hier ein Beispiel für maximal 2 Unterpositionen, wenn mehr benötigt werden, muss man natürlich entsprechend mehr erstellen):

grafik-20260313-104808.png

Enter

Die template XML-Datei erstellen (als Kopie von ZUG2025.XML)

  1. CD DIR('/Toolmaker/DirectMail400/Zugferd/')

  2. CPY OBJ('/Toolmaker/DirectMail400/Zugferd/ZUG2025.xml') TOOBJ(ZUG2025POS.xml)

Die nächsten Schritte kann man am Besten mit einem PC mit dem Windows Explorer durchführen, mit dem Programm NOTEPAD++ oder einem anderen Editor, der gut mit XML umgehen kann:

  1. Die Kopie editieren

    1. In der Datei suchen nach dem String </ram:IncludedSupplyChainTradeLineItem>

    2. Vor der Zeile den diesen Block n mal einfügen, dabei “xx” durch die passende Nummer (“01”, “02”, usw) ersetzen

<ram:SpecifiedTradeAllowanceCharge> <ram:ChargeIndicator> <udt:Indicator>*RBxxCHG*</udt:Indicator> </ram:ChargeIndicator> <ram:CalculationPercent>*RBxxPRC*</ram:CalculationPercent> <ram:BasisAmount>*RBxxAMTB*</ram:BasisAmount> <ram:ActualAmount>*RBxxAMTA*</ram:ActualAmount> <ram:Reason>*RBxxTXT*</ram:Reason> </ram:SpecifiedTradeAllowanceCharge>

Bei n (maximal mögliche Zu-/Abschläge) = 2 sieht das dann so aus:

grafik-20260313-112144.png

 

Die Felder in den Automail-Definitionen eintragen

  1. SQL-Indizes für alle RBxx - Felder definieren

  2. diese in F7 eintragen

Sicherstellen, dass die XSLT-Transformation “eingeschaltet” ist

Diese XSLT-Transformation entfernt die leeren, ungenutzen Unterpositions-tags aus der fertigen XML.