F: Wie übergebe ich die Positionsnummer aus der Bestellung des Kunden (BT-132) in der Rechnungsposition?

BT-132 BT-13 BG-25 BT-126
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 / XRechnungWeg 2: EXTENDED
Inhalt je PositionPositionsnummer der Bestellung (BT-132)Bestellnummer und Positionsnummer der Bestellung
Bestellnummereinmal im Rechnungskopf (BT-13)je Position, mehrere Bestellungen möglich
SDKTrade_ItemTradeAgreement(Index)Add_ReferencedDocument
Profilbleibt unverändert, XRechnung bleibt XRechnungwird 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])
ParameterInhalt
DoctypeiXML.WhichReferencedDocument.BuyerOrderReferencedDocument für die Bestellung (außerdem Angebot, Vertrag, Bestellung des Endkunden)
PositionNoIndex der Position, beginnend bei 0 – nicht die Positionsnummer
IssuerAssignedIDBestellnummer des Kunden für diese Position – nicht die Artikelnummer
ReferencedLineIDPositionsnummer in der Bestellung (BT-132); darf nicht leer sein
IssueDateTime, Document_DateFormatoptional: 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.

Business Terms in diesem Artikel: BT-132 BT-13 BG-25 BT-126