- 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: COM | Weg 2: CSV + zugcmd | |
|---|---|---|
| In FoxPro | CREATEOBJECT("Aloaha_ZUGFeRD.XML"), Methoden aufrufen | STRTOFILE für vier CSV-Dateien, zugcmd starten |
| Ergebnis | XML nach EN 16931 (ZUGFeRD, Factur-X oder XRechnung) und ZUGFeRD-PDF (PDF/A-3 mit eingebettetem XML) | |
| Empfangene E-Rechnungen | ExportZUGFeRDXML2Disk holt das XML aus dem PDF | zugcmd -r zerlegt XML oder PDF in CSV-Dateien |
| Bitbreite | Visual FoxPro ist immer 32 Bit – das SDK-Setup registriert die 32-Bit-COM-Schnittstelle mit | |
| Anleitung | diese Seite, Abschnitt COM | Abschnitt 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.zipvon 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_TypeINTerst nachCreateInvoiceObjectsetzen; der zweite Parameter vonCreateInvoiceObjectist 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