- Thema
- VB.NET
- SDK-Mitglieder
- FillZUGFeRD_Structure() ItemWriteBillingPeriod() Trade_ItemTradeAgreement Trade_ItemTradeBillingPeriod Trade_ItemTradeDelivery Trade_ItemTradeSettlement TradeItemsCount
- Business Terms
- BG-29 Detailinformationen zum Preis BG-26 Rechnungspositionszeitraum BT-129 In Rechnung gestellte Menge BG-30 Umsatzsteuerinformationen auf der Ebene der Rechnungsposition BG-25 Rechnungsposition BT-130 Code der Maßeinheit der in Rechnung gestellten Menge BT-131 Nettobetrag der Rechnungsposition BT-132 Referenz zur Bestellposition
- Codebeispiele
- VB.NET
- Veröffentlicht
Neben den Artikelinformationen besteht jede Rechnungsposition (BG-25) aus Preisangaben, Liefermenge, Steuer und optional einem Zeitraum. Für jeden dieser Teile hat das Aloaha ZUGFeRD SDK eine Trade_Item-Eigenschaft, die die zugehörige Struktur einer vorhandenen Position liefert und wieder entgegennimmt. Wie die Eigenschaften grundsätzlich arbeiten – 0-basierter Index, Strukturen als Kopie, Verhalten bei ungültigem Index – erklärt der Artikel Rechnungspositionen mit Trade_Item-Eigenschaften lesen und ändern.
Übersicht
| Eigenschaft | Struktur | Wichtige Felder |
|---|---|---|
Trade_ItemTradeAgreement | iXML.TradeAgreement – Preisangaben (BG-29) | NetPriceProductTradePrice.ChargeAmount.Amount = Nettopreis (BT-146)GrossPriceProductTradePrice.ChargeAmount.Amount = Bruttopreis (BT-148)NetPriceProductTradePrice.BasisQuantity = Basismenge und Einheit (BT-149, BT-150)BuyerOrderReferencedDocument.LineID = Bestellposition (BT-132) |
Trade_ItemTradeDelivery | iXML.TradeDelivery – Lieferangaben der Position | BilledQuantity.BasisQuantity = Menge (BT-129)BilledQuantity.UnitCode = Einheit (BT-130) |
Trade_ItemTradeSettlement | iXML.TradeItemSettlement – Steuer und Betrag (BG-30) | TradeTax.CategoryCode = Steuerkategorie (BT-151)TradeTax.RateApplicablePercent = Steuersatz (BT-152)Monetary_Summation.LineTotalAmount.Amount = Nettobetrag (BT-131)AppliedTradeAllowanceCharge = Ab- und Zuschläge der Position (BG-27, BG-28) |
Trade_ItemTradeBillingPeriod | iXML.BillingPeriod – Positionszeitraum (BG-26) | StartDateTime = Beginn (BT-134)EndDateTime = Ende (BT-135), jeweils mit Document_Date und Document_DateFormat |
Alle Werte sind Zeichenketten. Beträge und Mengen stehen mit Dezimalpunkt darin, so wie in der XML (5.00).
Lesen
Dim alo As New Aloaha_ZUGFeRD.XML(Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort, False, "IHR-LIZENZSCHLUESSEL")
If alo.FillZUGFeRD_Structure("C:\Rechnungen\eingang.xml", "IHR-LIZENZSCHLUESSEL") Then
For i As Integer = 0 To alo.TradeItemsCount - 1
Dim pr As Aloaha_ZUGFeRD.iXML.TradeAgreement = alo.Trade_ItemTradeAgreement(i)
Dim lf As Aloaha_ZUGFeRD.iXML.TradeDelivery = alo.Trade_ItemTradeDelivery(i)
Dim st As Aloaha_ZUGFeRD.iXML.TradeItemSettlement = alo.Trade_ItemTradeSettlement(i)
Dim zr As Aloaha_ZUGFeRD.iXML.BillingPeriod = alo.Trade_ItemTradeBillingPeriod(i)
Console.WriteLine("Menge: " & lf.BilledQuantity.BasisQuantity & " " & lf.BilledQuantity.UnitCode)
Console.WriteLine("Nettopreis: " & pr.NetPriceProductTradePrice.ChargeAmount.Amount)
Console.WriteLine("Steuer: " & st.TradeTax.CategoryCode & " " & st.TradeTax.RateApplicablePercent & " %")
Console.WriteLine("Nettobetrag: " & st.Monetary_Summation.LineTotalAmount.Amount)
Console.WriteLine("Zeitraum: " & zr.StartDateTime.Document_Date & " - " & zr.EndDateTime.Document_Date)
Next
End If
Felder, die in der Rechnung fehlen, sind Nothing – etwa der Bruttopreis oder der Zeitraum. Beim Verketten mit & ist das harmlos; vor Aufrufen wie .Trim oder Val prüfen Sie mit String.IsNullOrEmpty. Auch das Array AppliedTradeAllowanceCharge kann Nothing sein, wenn die Position keine Ab- oder Zuschläge hat.
Ändern: lesen, anpassen, zurückschreiben
Alle vier Eigenschaften liefern eine Kopie der Struktur. Ändern Sie die Kopie und weisen Sie sie anschließend wieder zu. Beispiel: Position 0 wurde mit 10 Stück zu 5,00 EUR angelegt und soll auf 12 Stück geändert werden.
' Menge (BT-129)
Dim lf As Aloaha_ZUGFeRD.iXML.TradeDelivery = alo.Trade_ItemTradeDelivery(0)
lf.BilledQuantity.BasisQuantity = "12"
alo.Trade_ItemTradeDelivery(0) = lf
' Nettobetrag der Position (BT-131) selbst nachrechnen: 12 x 5.00
Dim st As Aloaha_ZUGFeRD.iXML.TradeItemSettlement = alo.Trade_ItemTradeSettlement(0)
st.Monetary_Summation.LineTotalAmount.Amount = "60.00"
alo.Trade_ItemTradeSettlement(0) = st
' Bezug zur Bestellposition (BT-132)
Dim pr As Aloaha_ZUGFeRD.iXML.TradeAgreement = alo.Trade_ItemTradeAgreement(0)
pr.BuyerOrderReferencedDocument.LineID = "3"
alo.Trade_ItemTradeAgreement(0) = pr
Wie Sie die Bestellpositionsnummer aus dem System Ihres Kunden (z. B. SAP) in jeder Position übergeben und welcher Weg eine XRechnung als XRechnung erhält, zeigt Bestellpositionsnummer (BT-132) je Rechnungsposition übergeben.
Die Eigenschaften speichern nur, was Sie zuweisen. Sie rechnen nichts nach: Ändern Sie Menge oder Preis, passen Sie den Nettobetrag der Position (BT-131) selbst an. Dasselbe gilt für die Umsatzsteueraufschlüsselung (BG-23) und die Summen der Rechnung (BG-22). Am einfachsten ändern Sie Positionen, bevor Sie AddTradeTax und WriteTotals aufrufen (siehe ZUGFeRD-Rechnung in VB.NET erstellen).
Weisen Sie immer die zuvor gelesene Struktur zurück und keine neue: Die Zuweisung ersetzt den ganzen Teil der Position. Eine neue, leere TradeAgreement würde zum Beispiel auch Brutto- und Nettopreis löschen.
Positionszeitraum (BG-26)
Für den Zeitraum ist ItemWriteBillingPeriod meist bequemer, denn es setzt das Datumsformat selbst:
alo.ItemWriteBillingPeriod(0, "20261001", "20261031")
Über die Struktur geht es ebenso. Ein angegebenes Format übernimmt das SDK beim Speichern unverändert; lassen Sie Document_DateFormat leer, schreibt sie für ZUGFeRD 2.x, Factur-X und XRechnung das Format 102 (JJJJMMTT):
Dim zr As Aloaha_ZUGFeRD.iXML.BillingPeriod = alo.Trade_ItemTradeBillingPeriod(0)
zr.StartDateTime.Document_Date = "20261001"
zr.StartDateTime.Document_DateFormat = "102"
zr.EndDateTime.Document_Date = "20261031"
zr.EndDateTime.Document_DateFormat = "102"
alo.Trade_ItemTradeBillingPeriod(0) = zr
Sie können auch nur Beginn oder nur Ende angeben: Das SDK schreibt jedes Datum nur, wenn es gesetzt ist; ein leeres oder fehlendes (Nothing) Datum lässt sie weg. In älteren Versionen des SDK konnte bei fehlendem Beginn ein leeres StartDateTime entstehen – setzen Sie dort das nicht benötigte Datum auf "" und geben Sie das Format immer an.
Lieferangaben und Profil EXTENDED
Die Struktur TradeDelivery enthält außer der Menge auch Felder, die es nur im Profil EXTENDED gibt: PackageQuantity (Packstückanzahl), ShipToTradeParty (abweichende Lieferanschrift der Position) und ActualDeliverySupplyChainEvent (Lieferdatum der Position). Wenn Sie diese Felder direkt in der Struktur setzen, schaltet das SDK das Profil nicht um. Nutzen Sie dafür besser setActualDeliveryDateItem und WriteShipToTradePartyItem, die das Profil auf EXTENDED stellen (WriteShipToTradePartyItem, sobald ein Name, eine Kennung oder eine globale Kennung übergeben wird), oder erstellen Sie die Rechnung gleich im Profil EXTENDED.
Ab- und Zuschläge der Position
Das Array AppliedTradeAllowanceCharge in TradeItemSettlement enthält die Ab- und Zuschläge der Position (BG-27, BG-28). Zum Anlegen und Lesen gibt es eigene Methoden, siehe Zuschläge und Abschläge je Rechnungsposition. Den Preisnachlass auf den Stückpreis (BT-147) finden Sie dagegen in TradeAgreement.GrossPriceProductTradePrice.AppliedTradeAllowanceCharge.
VBA und VB6
Alle vier Eigenschaften liefern verschachtelte .NET-Strukturen. Über COM lassen sich diese in VBA nicht zuverlässig verwenden. Für Steuer und Beträge je Position nutzen Sie dort GetItemTradeTax und ReadTradeItemCSV, für den Zeitraum ItemWriteBillingPeriod; Details in Positionswerte in VBA/Access auslesen.
Häufige Fragen
Rechnet das SDK den Positionsbetrag nach, wenn ich die Menge ändere?
Nein. Die Trade_Item-Eigenschaften speichern nur die zugewiesenen Werte. Nettobetrag der Position (BT-131), Steueraufschlüsselung und Summen passen Sie selbst an.
Was passiert bei einem ungültigen Positionsindex?
Beim Lesen erhalten Sie eine leere Struktur, deren Felder Nothing sind; eine Zuweisung wird ohne Fehlermeldung ignoriert.
Welches Datumsformat gilt für den Positionszeitraum?
Format 102, also JJJJMMTT, zum Beispiel 20261031. ItemWriteBillingPeriod setzt es automatisch; bleibt Document_DateFormat in der Struktur leer, schreibt das SDK für ZUGFeRD 2.x ebenfalls 102.
Business Terms in diesem Artikel: BG-29 BG-26 BT-129 BG-30 BG-25 BT-130 BT-131 BT-132 BT-134 BT-135 BT-146 BT-148 BT-149 BT-150 BT-151 BT-152 BG-22 BG-23 BG-27 BG-28