- Thema
- VB.NET
- SDK-Mitglieder
- Add_ReferencedDocument() AddBuyerAssignedID() AddProduct_Comfort() Trade_ItemTradeAgreement
- Business Terms
- BT-132 Referenz zur Bestellposition BT-13 Bestellreferenz BG-25 Rechnungsposition BT-126 Kennung der Rechnungsposition
- Codebeispiele
- VB.NET, XML
- Veröffentlicht
Kurz: Viele Kunden, vor allem mit SAP, verlangen auf der E-Rechnung zu jeder Position die Positionsnummer aus ihrer Bestellung. Das ist der Business Term BT-132 („Referenced purchase order line reference“, auch Bestellposition, PO-Position oder in SAP das Feld EBELP der Bestellung). Er steht im XML in der Position unter SpecifiedLineTradeAgreement / BuyerOrderReferencedDocument / LineID; die Bestellnummer selbst steht einmal im Rechnungskopf (BT-13). Mit dem Aloaha ZUGFeRD SDK gibt es zwei Wege. Beide sprechen die Position über ihren Index an (0 = erste Position), nicht über Ihre Positionsnummer – das ist der häufigste Grund, warum die Bestellposition im XML fehlt.
Auf einen Blick
| Weg 1: EN 16931 / XRechnung | Weg 2: EXTENDED | |
|---|---|---|
| Inhalt je Position | Positionsnummer der Bestellung (BT-132) | Bestellnummer und Positionsnummer der Bestellung |
| Bestellnummer | einmal im Rechnungskopf (BT-13) | je Position, mehrere Bestellungen möglich |
| SDK | Trade_ItemTradeAgreement(Index) | Add_ReferencedDocument |
| Profil | bleibt unverändert, XRechnung bleibt XRechnung | wird auf Factur-X EXTENDED umgestellt |
Der häufigste Fehler: Positionsnummer statt Index
Die Positionsnummer Ihres ERP-Systems (BT-126, z. B. 10, 20, 30) übergeben Sie in AddProduct_Comfort. Wenn Sie danach eine Position ändern oder ergänzen, erwartet das SDK dagegen den Index der Position in der Reihenfolge, in der Sie sie angelegt haben: die erste Position hat den Index 0, die zweite den Index 1. Übergeben Sie stattdessen die Positionsnummer 10, gibt es diese Position nicht; das SDK speichert nichts und liefert False. Bei kleinen Positionsnummern (1, 2, 3) landet die Referenz dagegen eine Position zu weit hinten – das fällt oft erst beim Kunden auf.
Zählen Sie den Index deshalb in Ihrer Positionsschleife selbst mit:
Dim posIndex As Integer = 0 ' vor der Schleife
' je Position:
alo.AddProduct_Comfort(...) ' legt die Position an (Index = posIndex)
' ... Bestellposition setzen (siehe unten), immer mit posIndex
posIndex += 1 ' am Ende jeder Position
Weg 1: EN 16931 und XRechnung – nur die Bestellpositionsnummer
In den Profilen EN 16931 (COMFORT) und XRechnung gibt es in der Position nur die Positionsnummer der Bestellung. Die Bestellnummer steht einmal im Rechnungskopf. Das ist der passende Weg, wenn sich die ganze Rechnung auf eine Bestellung bezieht – der Normalfall:
' Rechnungskopf: Bestellnummer des Kunden (BT-13)
alo.AddBuyerAssignedID(SapBestellnummer)
' je Position, direkt nach AddProduct_Comfort:
Dim ta As Aloaha_ZUGFeRD.iXML.TradeAgreement = alo.Trade_ItemTradeAgreement(posIndex)
ta.BuyerOrderReferencedDocument.LineID = SapBestellposition ' BT-132, z. B. "00020"
alo.Trade_ItemTradeAgreement(posIndex) = ta
Lesen Sie die Struktur immer zuerst und weisen Sie sie danach zurück; eine neue, leere TradeAgreement würde auch die Preise der Position löschen (siehe Preis, Menge, Steuer und Zeitraum einer Position ändern). Das Profil bleibt dabei unverändert, eine XRechnung bleibt eine XRechnung.
Ergebnis in der Position:
<ram:SpecifiedLineTradeAgreement>
<ram:BuyerOrderReferencedDocument>
<ram:LineID>00020</ram:LineID>
</ram:BuyerOrderReferencedDocument>
...
</ram:SpecifiedLineTradeAgreement>
Weg 2: EXTENDED – Bestellnummer und Bestellposition je Position
Bezieht sich eine Rechnung auf mehrere Bestellungen, braucht jede Position zusätzlich ihre eigene Bestellnummer. Das gibt es nur im Profil Factur-X/ZUGFeRD EXTENDED. Dafür ist Add_ReferencedDocument gedacht:
Add_ReferencedDocument(Dokumentart, PositionsIndex, Bestellnummer, Bestellposition, [Datum], [Datumsformat])
| Parameter | Inhalt |
|---|---|
Doctype | iXML.WhichReferencedDocument.BuyerOrderReferencedDocument für die Bestellung (außerdem Angebot, Vertrag, Bestellung des Endkunden) |
PositionNo | Index der Position, beginnend bei 0 – nicht die Positionsnummer |
IssuerAssignedID | Bestellnummer des Kunden für diese Position – nicht die Artikelnummer |
ReferencedLineID | Positionsnummer in der Bestellung (BT-132); darf nicht leer sein |
IssueDateTime, Document_DateFormat | optional: Bestelldatum (JJJJMMTT) und Format (102) |
If Not alo.Add_ReferencedDocument(Aloaha_ZUGFeRD.iXML.WhichReferencedDocument.BuyerOrderReferencedDocument, _
posIndex, SapBestellnummer, SapBestellposition) Then
' nicht gespeichert: Index, leere Bestellposition oder Position ohne Positionsnummer
End If
Wichtig: Add_ReferencedDocument stellt die Rechnung auf das Profil EXTENDED um. Verlangt Ihr Kunde eine XRechnung, nutzen Sie Weg 1. Ab Version 11 meldet LastWarning, wenn eine XRechnung durch einen Aufruf auf EXTENDED umgestellt wurde. Welche weiteren Aufrufe auf EXTENDED umstellen – etwa ein Befreiungsgrund in der Position – zeigt Warum wird meine XRechnung als Factur-X EXTENDED erstellt? Aus VB6, VBA oder anderen COM-Clients gibt es dieselbe Funktion mit einer Zahl als Dokumentart: Add_ReferencedDocumentVBA (1 = Bestellung).
Ergebnis in der Position:
<ram:BuyerOrderReferencedDocument>
<ram:IssuerAssignedID>4500012345</ram:IssuerAssignedID>
<ram:LineID>00020</ram:LineID>
</ram:BuyerOrderReferencedDocument>
Bestellnummer im Rechnungskopf
Für die Bestellnummer im Rechnungskopf (BT-13) genügt AddBuyerAssignedID. AddBuyerOrderReferencedDocument speichert die Angaben nur, wenn zusätzlich Dokument-ID und Bestelldatum übergeben werden; ein Aufruf nur mit der Bestellnummer ändert nichts.
Häufige Fragen
Warum finde ich die Bestellpositionsnummer nicht im XML?
Meist wurde statt des Positions-Index die eigene Positionsnummer übergeben. Das SDK zählt die Positionen ab 0 in der Reihenfolge, in der sie mit AddProduct_Comfort angelegt wurden. Eine Positionsnummer wie 10 ist kein gültiger Index; dann wird nichts gespeichert und die Funktion gibt False zurück.
Welcher Business Term ist die Positionsnummer der Bestellung?
BT-132, Referenced purchase order line reference. Er steht in der Rechnungsposition unter SpecifiedLineTradeAgreement/BuyerOrderReferencedDocument/LineID. Die Bestellnummer selbst ist BT-13 im Rechnungskopf.
Bleibt meine XRechnung eine XRechnung, wenn ich BT-132 setze?
Ja, wenn Sie nur die Positionsnummer über Trade_ItemTradeAgreement setzen (Weg 1). Add_ReferencedDocument stellt die Rechnung dagegen auf das Profil EXTENDED um, weil es zusätzlich eine Bestellnummer je Position schreibt.
Kann eine Rechnung mehrere Bestellungen enthalten?
In EN 16931 und XRechnung gibt es nur eine Bestellnummer im Rechnungskopf. Eine eigene Bestellnummer je Position ist nur im Profil Factur-X/ZUGFeRD EXTENDED möglich, mit Add_ReferencedDocument.
Funktioniert das auch aus VB6 oder Access?
Ja. Für COM-Clients gibt es Add_ReferencedDocumentVBA mit einer Zahl als Dokumentart (1 = Bestellung). Die Positionen werden ebenfalls ab 0 gezählt.