ZUGFeRD und XRechnung mit Visual FoxPro 9 erstellen – per COM oder CSV

Thema
Beispiel Code
SDK-Mitglieder
AddPaymentMeans() AddProduct_Comfort() AddTradePaymentTerms() AddTradeTax() CreateInvoiceObject() ExportZUGFeRDXML2Disk() MergeXMLIntoPDF() SaveXML() WriteSeller() WriteTotals()
Business Terms
BT-1 Rechnungsnummer BT-2 Rechnungsdatum BT-3 Code für den Rechnungstyp BT-5 Code für die Rechnungswährung BT-31 Umsatzsteuer-Identifikationsnummer des Verkäufers BT-72 Tatsächliches Lieferdatum BG-25 Rechnungsposition BG-23 Umsatzsteueraufschlüsselung
Codebeispiele
Visual FoxPro
Veröffentlicht

Kurz: Anwendungen in Visual FoxPro (VFP 9.0 SP2, auch VFP 8) erzeugen E-Rechnungen nach EN 16931 – ZUGFeRD 2.x, Factur-X und XRechnung – über die COM-Schnittstelle des Aloaha ZUGFeRD SDK: CREATEOBJECT("Aloaha_ZUGFeRD.XML"), Rechnungsdaten setzen, XML speichern und in die vorhandene PDF-Rechnung einbetten. Eine Migration der FoxPro-Anwendung ist dafür nicht nötig. Wer gar nicht gegen das SDK programmieren möchte, schreibt die Daten mit STRTOFILE in CSV-Dateien und ruft das Kommandozeilen-Tool zugcmd auf. Beide Wege lesen auch empfangene ZUGFeRD-PDFs aus.

Auf einen Blick

Weg 1: COMWeg 2: CSV + zugcmd
In FoxProCREATEOBJECT("Aloaha_ZUGFeRD.XML"), Methoden aufrufenSTRTOFILE für vier CSV-Dateien, zugcmd starten
ErgebnisXML nach EN 16931 (ZUGFeRD, Factur-X oder XRechnung) und ZUGFeRD-PDF (PDF/A-3 mit eingebettetem XML)
Empfangene E-RechnungenExportZUGFeRDXML2Disk holt das XML aus dem PDFzugcmd -r zerlegt XML oder PDF in CSV-Dateien
BitbreiteVisual FoxPro ist immer 32 Bit – das SDK-Setup registriert die 32-Bit-COM-Schnittstelle mit
Anleitungdiese Seite, Abschnitt COMAbschnitt CSV und CSV und zugcmd

Voraussetzungen

  • Windows mit .NET Framework 4.7.2 oder neuer (in Windows 10 ab Version 1803 und in Windows 11 enthalten). Die FoxPro-Laufzeit bleibt unverändert.
  • Das SDK-Setup Aloaha_ZUGFeRD_SDK.zip von der Download-Seite. Es registriert die COM-Schnittstelle für 32 und 64 Bit.
  • Registrierung prüfen mit dem mitgelieferten Skript, im 32-Bit-Skripthost: C:\Windows\SysWOW64\cscript.exe //nologo zugferd_com_test.vbs
  • Ein Lizenzschlüssel – eine kostenlose Testlizenz mit vollem Funktionsumfang erhalten Sie per E-Mail an info@aloaha.com.

Beträge immer mit Dezimalpunkt

Das SDK erwartet Beträge als Text mit Punkt ("59.50"). STR() und TRANSFORM() verwenden in FoxPro das Dezimalzeichen aus SET POINT bzw. der Windows-Einstellung – bei deutscher oder niederländischer Einstellung also ein Komma. Diese kleine Funktion gibt immer einen Punkt zurück:

FUNCTION Betrag(tnWert)
    RETURN STRTRAN(ALLTRIM(STR(tnWert, 15, 2)), ",", ".")
ENDFUNC

Weg 1: das SDK per COM aufrufen

Ihr Programm erzeugt die PDF-Rechnung wie bisher. Das SDK schreibt das XML und bettet es ein:

loAlo = CREATEOBJECT("Aloaha_ZUGFeRD.XML")
loAlo.Licensekey = "IHR-LIZENZSCHLUESSEL"
loAlo.ZUGFeRD_Profile = 1                && 0 = BASIC, 1 = EN 16931 (COMFORT), 2 = EXTENDED

* Rechnungskopf: Nummer (BT-1), Hinweis, Datum (BT-2), Datumsformat, Name, Sprache, Währung (BT-5)
loAlo.CreateInvoiceObject("RE-2027-0001", "", "20270104", "102", "", "DE", "EUR")
loAlo.Document_TypeINT = 380             && BT-3, NACH CreateInvoiceObject: 380 Rechnung, 381 Gutschrift
loAlo.ActualDeliveryDate_102 = "20270104"   && BT-72: Leistungsdatum

* Verkäufer: Name, PLZ, Ort, Straße, Straße 2, Land, USt-ID (BT-31)
loAlo.WriteSeller("Muster GmbH", "20095", "Hamburg", "Hauptstr. 1", "", "DE", "DE123456789")

* Käufer
loAlo.BuyerName = "Kunde AG"
loAlo.BuyerAddressLine1 = "Marktplatz 5"
loAlo.BuyerPostCode = "80331"
loAlo.BuyerCity = "München"
loAlo.BuyerCountry = "DE"

* Zahlung: 58 = SEPA-Überweisung (BT-81)
loAlo.AddPaymentMeans(58, "SEPA-Überweisung", "DE02120300000000202051", "Muster GmbH", "", "BYLADEM1001")
loAlo.AddTradePaymentTerms("Zahlbar innerhalb 30 Tagen netto")

* Position (BG-25): 10 Stück à 5,00 EUR, 19 %
loAlo.AddProduct_Comfort(1, "", "ART-100", "10.00", "C62", "Papier A4", "500 Blatt", ;
    "", "EUR", "", "C62", .F., "", "", "", Betrag(5), "EUR", "1.00", ;
    "C62", "VAT", "S", "19.00", "", Betrag(50), "EUR", "", "")

* Umsatzsteuer-Aufschlüsselung (BG-23) und Summen (BG-22)
loAlo.AddTradeTax(Betrag(9.5), "EUR", Betrag(50), "EUR", "VAT", "S", "19.00")
loAlo.WriteTotals(Betrag(50), Betrag(59.5), Betrag(59.5), Betrag(50), Betrag(9.5))

* XML speichern und in die vorhandene PDF-Rechnung einbetten (.T. = Zieldatei überschreiben)
IF loAlo.SaveXML("C:\Rechnungen\RE-2027-0001.xml")
    loAlo.MergeXMLIntoPDF("C:\Rechnungen\RE-2027-0001.xml", ;
        "C:\Rechnungen\RE-2027-0001.pdf", "C:\Rechnungen\RE-2027-0001_zugferd.pdf", .T.)
ELSE
    MESSAGEBOX("Fehler: " + loAlo.LastError)
ENDIF

Die Aufrufe sind dieselben wie in VB6 und VBA – ausführlich mit allen Parametern in ZUGFeRD und XRechnung mit VB6, VB5 und VBA erstellen. In FoxPro gelten nur die eigenen Schreibweisen: ; am Zeilenende für die Fortsetzung, .T. und .F. für Wahr und Falsch, && für Kommentare.

Positionen aus einer Tabelle

Bei vielen Positionen rufen Sie AddProduct_Comfort in einer SCAN-Schleife auf. NVL() schützt vor leeren Feldern (.NULL.), die COM nicht als Text annimmt:

lnPos = 0
SELECT rechpos
SCAN FOR rechnr = lcRechNr
    lnPos = lnPos + 1
    loAlo.AddProduct_Comfort(lnPos, "", ALLTRIM(NVL(artnr, "")), Betrag(menge), "C62", ;
        ALLTRIM(NVL(bezeichnung, "")), "", "", "EUR", "", "C62", .F., "", "", "", ;
        Betrag(preis), "EUR", "1.00", "C62", "VAT", "S", Betrag(mwst), "", ;
        Betrag(menge * preis), "EUR", "", "")
ENDSCAN

Die Summen berechnen Sie aus den gerundeten Positionsbeträgen und übergeben je Steuersatz eine Zeile mit AddTradeTax – siehe BR-S-08, BR-S-09 und BR-CO-17.

XRechnung für öffentliche Auftraggeber

loAlo.isKOSIT = .T.                      && XRechnung (CII) statt ZUGFeRD/Factur-X
loAlo.LeitwegID = "04011000-12345-34"    && BT-10: Leitweg-ID des Auftraggebers

Eine XRechnung braucht außerdem beim Verkäufer einen Kontakt mit Name, Telefon und E-Mail. Welche Aufrufe eine XRechnung ungewollt auf Factur-X EXTENDED umstellen, steht in Warum wird meine XRechnung als Factur-X EXTENDED erstellt?

Empfangene ZUGFeRD-PDFs auslesen

IF loAlo.ExportZUGFeRDXML2Disk("C:\Eingang\rechnung.pdf", "C:\Eingang\rechnung.xml", "IHR-LIZENZSCHLUESSEL", .T.)
    * XML weiterverarbeiten, z. B. mit XMLTOCURSOR() oder MSXML
ENDIF

Weg 2: CSV-Dateien und zugcmd

Ohne SDK-Programmierung schreibt Ihre Anwendung vier CSV-Dateien (Verkäufer, Käufer, Positionen, Summen) und startet zugcmd. Spalten, Beispieldateien und alle Parameter beschreibt E-Rechnungen per CSV und zugcmd erstellen. In FoxPro:

lcDir = "C:\ERechnung\RE-2027-0001\"
lcCRLF = CHR(13) + CHR(10)
STRTOFILE("id,Name,Street1,city,email,country,postcode" + lcCRLF + ;
          "K-1001,Kunde AG,Marktplatz 5,München,einkauf@kunde.example,DE,80331" + lcCRLF, lcDir + "buyer.csv")
* ... items.csv und totals.csv genauso, seller.csv einmal als Stammdatei

loShell = CREATEOBJECT("WScript.Shell")
lnRC = loShell.Run('"C:\zugcmd\zugcmd_wnd.exe" -s "C:\ERechnung\stamm\seller.csv" ' + ;
    '-b "' + lcDir + 'buyer.csv" -p "' + lcDir + 'items.csv" -t "' + lcDir + 'totals.csv" ' + ;
    '-i "' + lcDir + 'RE-2027-0001.pdf" -x "' + lcDir + 'RE-2027-0001.xml" ' + ;
    '-o "' + lcDir + 'RE-2027-0001_zugferd.pdf" -y "," -c ansi -l IHR-LIZENZSCHLUESSEL', 0, .T.)
IF lnRC # 0
    MESSAGEBOX("zugcmd meldet Fehler " + TRANSFORM(lnRC))
ENDIF

WScript.Shell.Run mit .T. als drittem Parameter wartet, bis zugcmd fertig ist, und liefert den Rückgabewert (0 = Erfolg). FoxPro schreibt mit STRTOFILE Windows-ANSI; deshalb -c ansi, sonst kommen Umlaute falsch an.

Typische Fehler

  • Fehler 1733 (Klassendefinition nicht gefunden) bei CREATEOBJECT: Die COM-Schnittstelle ist nicht registriert, oder nur für 64 Bit. Das SDK-Setup erneut ausführen oder die DLL mit dem 32-Bit-RegAsm registrieren (C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe Aloaha_ZUGFeRD.dll /codebase /tlb, als Administrator, lokales Laufwerk).
  • Beträge mit Komma: Der Validator meldet falsche Summen oder das SDK ignoriert Werte – immer über Betrag() übergeben.
  • Rechnungsart bleibt 380: Document_TypeINT erst nach CreateInvoiceObject setzen; der zweite Parameter von CreateInvoiceObject ist ein Hinweistext, keine Rechnungsart.
  • .NULL. aus Tabellenfeldern: mit NVL(feld, "") abfangen.
  • Erste Rechnung prüfen: mit dem KoSIT-Validator, siehe Wie prüfe ich meine XRechnung vor dem Versand?

Häufige Fragen

Kann ich mit Visual FoxPro 9 ZUGFeRD- und XRechnung-Dateien erstellen?

Ja. Das Aloaha ZUGFeRD SDK hat eine COM-Schnittstelle, die Visual FoxPro mit CREATEOBJECT("Aloaha_ZUGFeRD.XML") nutzt. Damit entstehen ZUGFeRD 2.x, Factur-X und XRechnung nach EN 16931, als XML oder eingebettet in eine PDF/A-3-Rechnung.

Muss ich meine FoxPro-Anwendung dafür migrieren?

Nein. Die Anwendung bleibt eine Visual-FoxPro-Anwendung. Auf dem Rechner wird nur das .NET Framework 4.7.2 benötigt; das SDK-Setup registriert die COM-Schnittstelle.

Funktioniert das mit 32 Bit?

Ja. Visual FoxPro ist immer eine 32-Bit-Anwendung. Das SDK-Setup registriert die COM-Schnittstelle für 32 und 64 Bit.

Kann ich empfangene ZUGFeRD-Rechnungen in FoxPro einlesen?

Ja. ExportZUGFeRDXML2Disk holt das eingebettete XML aus dem PDF. Alternativ zerlegt zugcmd -r eine E-Rechnung in CSV-Dateien, die FoxPro direkt importieren kann.

Warum stehen Kommas statt Punkten in den Beträgen?

STR() und TRANSFORM() verwenden das Dezimalzeichen aus SET POINT bzw. der Windows-Einstellung. Das SDK erwartet einen Punkt; die Funktion Betrag() auf dieser Seite ersetzt das Komma.

Gibt es eine Testlizenz?

Ja. Eine kostenlose Testlizenz mit vollem Funktionsumfang für 30 Tage erhalten Sie per E-Mail an info@aloaha.com; bei Bedarf wird sie verlängert.

Business Terms in diesem Artikel: BT-1 BT-2 BT-3 BT-5 BT-31 BT-72 BG-25 BG-23 BG-22 BT-10 BT-81 BT-106 BT-109 BT-110 BT-112 BT-115 BT-116