Beitrag aus SmartTools Access Weekly
So erstellen Sie Teil- und Abschlagsrechnungen als E-Rechnung aus Access, Teil 2
Access 365 2024 2021 2019 2016 2013 2010
Der Auftrag ist abgeschlossen, die Abschläge sind bezahlt, jetzt fehlt nur noch die Schlussrechnung. Auf Papier ist das Routine: Gesamtbetrag, darunter die Abschläge mit ihren Steuerbeträgen, und am Ende der Restbetrag. In einer E-Rechnung muss diese Aufstellung jedoch maschinenlesbar sein, damit die Buchhaltung Ihres Kunden erkennt, wie viel Umsatzsteuer bereits mit den Abschlagsrechnungen abgerechnet wurde. Die Standardfelder der E-Rechnungsnorm können das nicht – wie wir im ersten Teil dieser Reihe gezeigt haben, droht sonst ein doppelter Steuerausweis. Einen vollständigen Ausweg bietet nur das ZUGFeRD-Profil "Extended": Es enthält eigene Felder für jede erhaltene Anzahlung samt der darin enthaltenen Umsatzsteuer. In diesem zweiten Teil zeigen wir Ihnen, wie Sie diese Felder mit SmartTools E-Rechnung für Access befüllen und Ihre Schlussrechnung so ausgeben, dass die Steuer aus den Abschlägen korrekt abgesetzt wird.
SmartTools E-Rechnung für Access ist das Komplettpaket, mit dem Sie in Ihren Datenbanken E-Rechnungen erstellen, einlesen, anzeigen und validieren. Unterstützt werden ZUGFeRD in allen Profilen einschließlich Extended sowie XRechnung in den Syntaxen CII und UBL. Nach der automatischen Installation setzen Sie in der VBA-Entwicklungsumgebung einen Verweis auf unsere Komponente und kommen danach mit wenigen Anweisungen aus. Für ZUGFeRD-Rechnungen behalten Sie sogar den gewohnten Weg über Ihren Access-Bericht zur PDF-Datei bei.
Im ersten Teil dieser Reihe haben wir an einem Beispiel gezeigt, wo das Problem liegt: Für einen Auftrag über 500.000 € netto wurden zwei Abschläge über zusammen 300.000 € netto gestellt und bezahlt, also 357.000 € brutto mit 57.000 € Umsatzsteuer. Mit diesem Beispiel arbeiten wir weiter.
Was das Profil "Extended" zusätzlich kann
Im Profil "Extended" enthält die Schlussrechnung für jede erhaltene Anzahlung einen eigenen Block. Darin stehen der gezahlte Betrag, das Datum des Zahlungseingangs, die enthaltene Umsatzsteuer und der Bezug auf die zugehörige Abschlagsrechnung. In unserer Bibliothek bilden Sie jeden Block aus drei Objekten:
- BT-X-291: gezahlter Betrag (brutto) -
AdvancePayment.PaidAmount - BT-X-292: Datum des Zahlungseingangs -
AdvancePayment.Date - BT-X-293: enthaltene Umsatzsteuer -
IncludedTax.Amount - BT-X-296: Steuerkategorie -
IncludedTax.CategoryCode - BT-X-298: Steuersatz -
IncludedTax.Rate - BT-X-558: Nummer der Abschlagsrechnung -
PrecedingInvoiceDocument.Id - BT-X-559: Rechnungsart der Abschlagsrechnung -
PrecedingInvoiceDocument.TypeCode - BT-X-560: Datum der Abschlagsrechnung -
PrecedingInvoiceDocument.Date
Das Profil "Extended" geht über die Norm EN 16931 hinaus. Stimmen Sie deshalb vorher mit Ihrem Auftraggeber ab, ob er ZUGFeRD-Rechnungen in diesem Profil annimmt. Öffentliche Auftraggeber verlangen in der Regel XRechnungen – die passende Lösung dafür zeigen wir in Teil 3.
Vorbereitung: Rechnungsobjekt und Positionen
Die Schlussrechnung legen Sie zunächst an wie jede andere E-Rechnung: mit Rechnungsnummer, Datum, Verkäufer, Käufer, Zahlungsangaben und Positionen. Der Unterschied: Alle Objekte müssen aus dem Profil "Extended" stammen.
Set objInvoice = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_ZUGFeRDExtendedInvoice
'Rechnungsart: Schlussrechnung als Handelsrechnung (Code 380)
objInvoice.TypeCode = DocumentTypeCode_Commercial_invoice
'Bezeichnung des Dokuments (nur im Profil Extended)
objInvoice.Description = "Schlussrechnung"
Im Baugewerbe verwenden Sie gegebenenfalls die Rechnungsart "Schlussrechnung (Bau)" mit der Konstante "DocumentTypeCode_Final_construction_invoice". Die Eigenschaft "Description" ist das Feld für eine Dokumentbezeichnung, das es – wie in Teil 1 beschrieben – nur in diesem Profil gibt.
Die Schlussrechnung weist den vollen Auftragswert aus. In unserem Beispiel genügt dafür eine Position:
Set objInvoiceLine = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_InvoiceLine
With objInvoiceLine
.Id = "1"
.Item.Name = "Errichtung einer Lagerhalle"
.Delivery.InvoicedQuantity = 1
.Delivery.InvoicedQuantityUnitCode = UnitCode_C62
.Item.PriceDetails.NetAmount = 500000
.Totals.NetAmount = 500000
End With
Set objLineVat = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_InvoiceLineApplicableTax
objLineVat.CategoryCode = DutyOrTaxOrFeeCategoryCode_S
objLineVat.Rate = 19
objInvoiceLine.AddVat objLineVat
objInvoice.AddLine objInvoiceLine
Set objLineVat = Nothing
Set objInvoiceLine = Nothing
Beachten Sie die Unterschiede zu den anderen Profilen: Menge und Mengeneinheit stehen bei "Extended" unter "Delivery", der Nettobetrag der Position unter "Totals", und die Umsatzsteuer fügen Sie als eigenes Objekt mit "AddVat" hinzu.
WICHTIG Mischen Sie keine Objekte verschiedener Profile. Ein Objekt aus dem Profil "EN 16931" lässt sich nicht an eine Rechnung im Profil "Extended" übergeben – VBA bricht dann mit einer Fehlermeldung ab.
Eine Vorauszahlung einfügen
Für jede Abschlagsrechnung legen Sie nun einen Vorauszahlungsblock an. Er besteht aus einem "PrecedingInvoiceDocument"-Objekt mit den Daten der Abschlagsrechnung, einem "IncludedTax"-Objekt mit der darin enthaltenen Steuer und einem "AdvancePayment"-Objekt, das beides zusammenfasst. Für den ersten Abschlag über 100.000 € netto vom 17.04.2026, bezahlt am 30.04.2026, sieht das so aus:
'Daten der Abschlagsrechnung
Set objPrecInv = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_PrecedingInvoiceDocument
objPrecInv.Id = "AR-2026-031"
objPrecInv.Date = DateSerial(2026, 4, 17)
objPrecInv.TypeCode = DocumentTypeCode_Partial_invoice
'darin enthaltene Umsatzsteuer
Set objPrecVat = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_IncludedTax
objPrecVat.Amount = 19000
objPrecVat.Rate = 19
objPrecVat.CategoryCode = DutyOrTaxOrFeeCategoryCode_S
'Vorauszahlung: Bruttobetrag und Datum des Zahlungseingangs
Set objAdvPmt = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_AdvancePayment
objAdvPmt.PaidAmount = 119000
objAdvPmt.Date = DateSerial(2026, 4, 30)
objAdvPmt.AddVat objPrecVat
objAdvPmt.AddPrecedingInvoice objPrecInv
objInvoice.AddAdvancePayment objAdvPmt
Set objPrecInv = Nothing
Set objPrecVat = Nothing
Set objAdvPmt = Nothing
Drei Details sind entscheidend:
- "PaidAmount" ist der Bruttobetrag der Abschlagsrechnung, hier 119.000 €. Die enthaltene Steuer von 19.000 € steht separat im "IncludedTax"-Objekt.
- "Date" des "AdvancePayment"-Objekts ist das Datum, an dem das Geld eingegangen ist – nicht das Rechnungsdatum. Das Rechnungsdatum gehört in das "PrecedingInvoiceDocument"-Objekt.
- Jeder Vorauszahlungsblock gehört zu genau einer Abschlagsrechnung. Für jeden weiteren Abschlag legen Sie also einen eigenen Block mit neuen Objekten an.
- Haben Sie im Baugewerbe Abschlagsrechnungen mit der Rechnungsart 875 gestellt, geben Sie im "PrecedingInvoiceDocument"-Objekt entsprechend "DocumentTypeCode_Partial_construction_invoice" an.
Mehrere Abschläge aus einer Tabelle
In der Praxis stehen die Abschlagsrechnungen zu einem Auftrag in einer eigenen Tabelle Ihrer Datenbank. Dann legen Sie die Vorauszahlungsblöcke in einer Schleife an. Für das folgende Beispiel nehmen wir an, dass ein Recordset "rsAbschlag" die Abschlagsrechnungen des aktuellen Auftrags mit diesen Feldern enthält:
| Feldname | Datentyp | Inhalt |
|---|---|---|
| RgNr | Text | Nummer der Abschlagsrechnung |
| RgDatum | Datum | Datum der Abschlagsrechnung |
| Zahlungseingang | Datum | Datum des Zahlungseingangs |
| Brutto | Währung | Bruttobetrag der Abschlagsrechnung |
| USt | Währung | enthaltene Umsatzsteuer |
| UStSatz | Zahl | Steuersatz in Prozent (z. B. 19, nicht 0,19) |
curSummeBrutto = 0
Do Until rsAbschlag.EOF
Set objPrecInv = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_PrecedingInvoiceDocument
objPrecInv.Id = rsAbschlag!RgNr
objPrecInv.Date = rsAbschlag!RgDatum
objPrecInv.TypeCode = DocumentTypeCode_Partial_invoice
Set objPrecVat = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_IncludedTax
objPrecVat.Amount = rsAbschlag!USt
objPrecVat.Rate = rsAbschlag!UStSatz
objPrecVat.CategoryCode = DutyOrTaxOrFeeCategoryCode_S
Set objAdvPmt = New _
SmartTools_Invoicing_EN16931_ZUGFeRD_Extended_AdvancePayment
objAdvPmt.PaidAmount = rsAbschlag!Brutto
objAdvPmt.Date = rsAbschlag!Zahlungseingang
objAdvPmt.AddVat objPrecVat
objAdvPmt.AddPrecedingInvoice objPrecInv
objInvoice.AddAdvancePayment objAdvPmt
'Bruttosumme aller Abschläge für die Rechnungssummen
curSummeBrutto = curSummeBrutto + rsAbschlag!Brutto
Set objPrecInv = Nothing
Set objPrecVat = Nothing
Set objAdvPmt = Nothing
rsAbschlag.MoveNext
Loop
Nur bereits bezahlte Abschläge gehören als Vorauszahlung in die Schlussrechnung. Achten Sie deshalb darauf, dass Ihr Recordset nur Abschlagsrechnungen mit Zahlungseingang enthält – ein leeres Datumsfeld würde in VBA ohnehin zu einem Laufzeitfehler führen. Auch Aufträge mit vielen Abschlägen sind kein Problem: Die Bibliothek nimmt beliebig viele Vorauszahlungsblöcke auf.
Summen berechnen
Zum Schluss lassen Sie die Bibliothek die Umsatzsteueraufschlüsselung und die Rechnungssummen berechnen. Vorher übergeben Sie die Bruttosumme aller Abschläge als bereits gezahlten Betrag (BT-113):
'bereits gezahlter Betrag: Bruttosumme aller Abschläge
objInvoice.Totals.PaidAmount = curSummeBrutto
'Umsatzsteueraufschlüsselung und Rechnungssummen
objInvoice.UpdateVatBreakdown
objInvoice.UpdateTotals
WICHTIG Die Vorauszahlungsblöcke fließen nicht automatisch in die Summen ein. Setzen Sie "Totals.PaidAmount" deshalb immer selbst, bevor Sie "UpdateTotals" aufrufen – sonst weist die E-Rechnung den vollen Bruttobetrag als fällig aus.
Für unser Beispiel enthält die Schlussrechnung damit folgende Angaben:
| Angabe | BT-Feld | Betrag |
|---|---|---|
| Netto-Gesamtbetrag | BT-109 | 500.000,00 € |
| 19 % Umsatzsteuer | BT-110 | 95.000,00 € |
| Brutto-Gesamtbetrag | BT-112 | 595.000,00 € |
| bereits gezahlt | BT-113 | 357.000,00 € |
| fälliger Betrag | BT-115 | 238.000,00 € |
| Umsatzsteuer in den Vorauszahlungen | BT-X-293 | 19.000,00 € + 38.000,00 € |
Die Summen sind dieselben wie in Teil 1. Neu sind die Vorauszahlungsblöcke: Sie weisen die 57.000 € Umsatzsteuer aus, die bereits mit den Abschlagsrechnungen abgerechnet wurden. Damit ist für den Empfänger erkennbar, dass mit der Schlussrechnung nur noch 38.000 € Umsatzsteuer anfallen.
Gespeichert wird wie bei jeder ZUGFeRD-Rechnung: Sie geben zuerst Ihren Access-Bericht als PDF-Datei aus und rufen dann "Save" mit demselben Dateinamen auf. Die Bibliothek bettet die E-Rechnung in die vorhandene PDF-Datei ein.
objInvoice.Save strFileName
Prüfen Sie die fertige Datei anschließend mit der integrierten Validierung und zeigen Sie sie zur Kontrolle an, wie in unseren Tutorials zu SmartTools E-Rechnung für Access beschrieben.
Vertrauen Sie dem Marktführer: SmartTools E-Rechnung für Access
Alle Beispiele in diesem Beitrag beziehen sich auf SmartTools E-Rechnung für Access, das Rundum-Sorglos-Paket für E-Rechnungen in Access-Datenbanken. Mit wenigen Zeilen VBA-Code erstellen Sie Teil-, Abschlags- und Schlussrechnungen als E-Rechnung, lesen eingehende E-Rechnungen ein, zeigen sie an und prüfen sie auf Gültigkeit. Unterstützt werden alle Formate (ZUGFeRD und XRechnung) und alle Profile des E-Rechnungsstandards einschließlich Extended. Sie erwerben eine Dauerlizenz und müssen kein Abo abschließen. Die Erweiterung kann derzeit mit 30% Aktionsrabatt bestellt werden:
Im dritten und letzten Teil dieser Reihe zeigen wir, wie Sie Schlussrechnungen als XRechnung oder in den übrigen ZUGFeRD-Profilen erstellen – mit den Übergangslösungen, die die Finanzverwaltung dafür zulässt.