Genug Theorie – machen wir uns an die Umsetzung.
Meine Auftragsverwaltung ist mittlerweile 20 Jahre alt und wurde seinerzeit noch mit der Version Access 97 entwickelt. Sogar das Backend ist noch eine mdb. Meinen Ansprüchen genügt sie bis heute. Sie spiegelt meine Kenntnisse und Fähigkeiten der Vergangenheit wider und könnte ausschnittsweise als Beispiel für schlechte Entwicklungsmuster dienen – darum soll es hier aber nicht gehen.
Komponenten
Mit dem Erwerb einer Lizenz wird die Demo-Anwendung als mit offenem Code sowie alle notwendigen Module ungeschützt als zip-Archiv geliefert.
Backend
Beim einem Access Backend sind alle notwendigen Tabellen in der Demo-Anwendung zu finden.
Für den MS-SQL-Server stehen im Ordner vbax_BE Skripte bereit, um sämtliche Tabellen anzulegen. Als Standard ist vorgesehen, dass sie im Schema dbo liegen. Das müsste bei Bedarf angepasst werden. Von der Funktionalität sind die beiden Skripte vbax_Tables … identisch. Eins enthält umfangreiche Kommentaren zu jeder Tabellenspalte. Wem das zu unübersichtlich ist, verwendet einfach das ohne Kommentare.
Die Tabelle vbax_tbl_CODELIST wird durch die Skripte erstellt. Die Werte müssten danach aus der Beispieldatenbank kopiert werden. Es handelt sich dabei um Code-Einträge, die bei Auswahlfeldern verwendet werden bzw. deren Werte bei einigen Feldern vorgeschrieben sind.
Access
- Backend öffnen
- Externe Daten –> Neue Datenquelle –> Aus Datenbank –> Access
- zur Demo-Anwendung navigieren
- alle vbax_tbl_… Tabellen auswählen
- Tabellen importieren
MS-SQL-Server
- Management Studio (bzw. bevorzugtes Entwicklungstool) öffnen
- Neue Abfrage
- Skript kopieren
- evtl Schema anpasse
- Skript ausführen
- vbax_tbl_CODELIST mit Daten füllen
Frontend
Daten
Die neuen Tabellen im Frontend verknüpfen.
Code
- Frontend öffnen
- neues Modul anlegen
- Code aus „…\vbax_Object\object_Import.txt“ hineinkopieren
- Pfad in der Function import_VBAX() anpassen, so dass er auf den Ordner vbax_Object führt
- Function ausführen
Im Ordner vbax_Object und dessen Unterordner sind Skripte für alle notwendigen Access Objekte für das Frontend. Sie können über den Befehl Application.LoadFromText in die eigene Anwendung importiert werden. Für den Komfort gibt es eine vorbereitete Funktion. Die steht in der Textdatei object_Import.txt und importiert automatisch alle Module und Klassenmodule.

Neben den eigenen Modulen gibt viele neue vbax Module und Klassenmodule
Fertig – die Anwendung kann ab sofort XRechnungen erstellen!
Jetzt geht es an den Code…
Grundlagen
Einfache XRechnung – vbax_xr_INVOICE
Die Function sample_Simple in Modul vbax_mdl_Sample zeigt beispielhaft, wie eine einfache XRechnung mit VBA erstellt werden kann.
Private Function sample_Simple() As vbax_xr_INVOICE
Dim xRechnung As New vbax_xr_INVOICE
' PROCESS CONTROL - Informationen zum Geschäftsprozess --> Standardwerte
xRechnung.PROCESS_CONTROL.Business_Process_Type.Content = "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0"
xRechnung.PROCESS_CONTROL.Specification_Identifier.Content = "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0"
' INVOICE
xRechnung.Invoice_Number.Content = Format(Now, "yyyyMMdd_nnss") ' Rechnungsnummer
xRechnung.Invoice_Issue_Date.Content = Date ' Rechnungsdatum
... ' diverse weitere Rechnungsdaten
' DOCUMENT_TOTALS - Gesamtbeträge
xRechnung.DOCUMENT_TOTALS.Sum_Of_Invoice_Line_Net_Amount.Content = "473,00" ' Summe aller Positionspreise
xRechnung.DOCUMENT_TOTALS.Invoice_Total_Amount_Without_Vat.Content = "473,00" ' Gesamtbetrag ohne MwSt. (Beachtung von Zu- und Abschlägen)
xRechnung.DOCUMENT_TOTALS.Invoice_Total_Vat_Amount.Content = "56,87" ' Mehrwertsteuer
xRechnung.DOCUMENT_TOTALS.Invoice_Total_Amount_With_Vat.Content = "529,87" ' Gesamtbetrag mit Mehrwertsteuer
xRechnung.DOCUMENT_TOTALS.Amount_Due_For_Payment.Content = "529,87" ' zu zahlen
Set sample_Simple = xRechnung ' Objekt zurückgeben
Set xRechnung = Nothing
End Function
Die Klasse vbax_xr_INVOICE ist das Hauptobjekt für die elektronische Rechnung. Der Name der Klasse besteht aus dem vbaXrechnung Präfix vbax, der Abkürzung xr für XRechnung und dem Namen der abgebildeten Business Group.
Die Variable xRechnung vom Typ vbax_xr_INVOICE wird mit Werten gefüllt. Anschließend wird sie an das aufrufende Modul zur Weiterverarbeitugn zurückgegeben. Das Zuweisen der Werte erfolgt mit Hilfe von Intellisense über die Klasseneigenschaften. Die Eigenschaft für den Wert heißt je nach Feldtyp businessTerm.Content oder businessTerm.Code.
Die Function sample_Simple() gibt das Objekt einer validen XRechnung zurück. Für die Rechnungsstellung braucht man aber kein VBA-Objekt sondern eine xml-Datei in der Syntax Cross Industry Invoice.
Die Elektronische Rechnung in der Syntax Cross Industry Invoice
Die Function sample_Simple_CrossIndustryInvoice() demonstriert die Funktionsweise der Klasse vbax_Adapter. Die Methode xr2cii nimmt ein Objekt vom Typ vbax_xr_INVOICE entgegen und gibt ein Objekt vom Typ vbax_xml_NODE zurück. Dieses Objekt besteht aus Elementen und weiteren verschachtelten Unterobjekten vom Typ vbax_xml_NODE. Der aufbau entspricht den Anforderungen eines XML-Objekts in der Syntax Cross Industry Invoice. Über die Eigenschaft xml_DOM kann das abgeleitete Document Object Model für die xml-Datei abgerufen werden. Über die eingebetteten Kommentare sind die einzelnen Business Groups und deren Business Terms leicht wiederzufinden.

Die Methode trägt die Informationen aus der XRechnung in die entsprechenden Elemente der Elektronischen Rechnung (in der Syntax Cross Industry Invoice – CII) ein.
Die Elektronische Rechung als xml-Datei
Das xml-DOM kann über die Methode UTF8_SAVE der Klasse vbax_hl_TEXT als xml-Datei gespeichert werden. Die Methode erwartet den kompletten Dateipfad inkl. Dateinamen und Suffix sowie das xml-DOM als Text als Aufrufparameter.
In Function sample_Simple_CrossIndustryInvoice_Export() wird die Datei im Anwendungsverzeichnis gespeichert und sofort zur Anzeige aufgerufen.
Private Function sample_Simple_CrossIndustryInvoice_Export()
Dim xRechnung_Test As New vbax_xr_INVOICE
Dim xRechnung_CII As New vbax_XML_NODE
Dim str_Export_File As String
Dim str_CII_Content As String
Set xRechnung_Test = sample_Simple ' Beispiel Objekt XRechnung
Set xRechnung_CII = vbax_Adapter.xr2cii(xRechnung_Test) ' Adapter macht aus der XRechnung eine eRechnung in Syntax "Cross Industry Invoice"
str_CII_Content = xRechnung_CII.xml_DOM ' Inhalt für Exportdatei
str_Export_File = CurrentProject.Path ' Name von Export Datei zusammenstellen
str_Export_File = str_Export_File & "\xrechnung_sample_" & Format(Now, "yyyyMMdd_hhnnss") & ".xml"
vbax_hl_TEXT.UTF8_SAVE str_Export_File, str_CII_Content ' Exportdatei erstellen
FollowHyperlink str_Export_File ' direkt öffnen
Set xRechnung_Test = Nothing
Set xRechnung_CII = Nothing
End Function
Rechnungsdaten speichern, laden und exportieren
Die Function sample_Simple_Save() demonstriert eine weitere Funktion der Klasse vbax_Adapter. Die Methode xr2data nimmt ein Objekt vom Typ vbax_xr_INVOICE entgegen, speichert die Daten in den vorbereiteten Tabellen im Backend und gibt die INV_ID der gespeicherten INVOICE zurück.
Private Function sample_Simple_Save()
Dim xRechnung_Save As New vbax_xr_INVOICE
Dim lng_ID As Long
Set xRechnung_Save = sample_Simple ' Beispiel Objekt
lng_ID = vbax_Adapter.xr2data(xRechnung_Save) ' Objekt in Tabellen schreiben und neue ID zurückgeben
Debug.Print lng_ID ' neue ID ausgeben
Set xRechnung_Save = Nothing
End Function
Die Function sample_Simple_Load() demonstriert, wie die Methode data2xr eine INV_ID entgegen nimmt und ein Objekt vom Typ vbax_xr_INVOICE zurückgibt, das mit den entsprechenden Rechnungsdaten gefüllt ist.
Private Function sample_Simple_Load()
Dim xRechnung_Load As New vbax_xr_INVOICE
Dim lng_ID As Long
lng_ID = DMax("INV_ID", "vbax_tbl_INVOICE") ' letzte INV_ID ermitteln
Set xRechnung_Load = vbax_Adapter.data2xr(lng_ID) ' Daten aus Tabelle lesen und Objekt erstellen
Debug.Print xRechnung_Load.ToXML ' Struktur ausgeben
Set xRechnung_Load = Nothing
End Function
Die Function sample_Simple_Load_Export() kombiniert die oben beschriebenen Arbeitsschritte. Sie lädt die Rechnungsdaten aus dem Backend und erstellt die Rechnung als xml-Datei.
Private Function sample_Simple_Load_Export()
Dim xRechnung_Export As New vbax_xr_INVOICE
Dim xRechnung_Export_CII As New vbax_XML_NODE
Dim str_Export_File As String
Dim str_CII_Content As String
Set xRechnung_Export = vbax_Adapter.data2xr(38) ' Rechnung mit aus Tabellen laden
Set xRechnung_Export_CII = vbax_Adapter.xr2cii(xRechnung_Export) ' aus XRechnung die CII machen
str_CII_Content = xRechnung_Export_CII.xml_DOM ' Inhalt für Exportdatei
str_Export_File = CurrentProject.Path ' Name von Export Datei zusammenstellen
str_Export_File = str_Export_File & "\xrechnung_sample_" & Format(Now, "yyyyMMdd_hhnnss") & ".xml"
vbax_hl_TEXT.UTF8_SAVE str_Export_File, str_CII_Content ' Exportdatei erstellen
FollowHyperlink str_Export_File ' direkt öffnen
Set xRechnung_Export = Nothing
Set xRechnung_Export_CII = Nothing
End Function
Verwendung in einer eigenen Anwendung
Um aus einer VBA-Anwendung eine Elektronische Rechnung zu erstellen, kann man das Objekt vbax_xr_INVOICE – wie in der Function sample_Simple() gezeigt – mit den Rechnungsdaten füllen, über den vbax_Adapter in die richtige Syntax bringen und anschließend als xml-Datei speichern.
Bei der Arbeit mit Datenbanken ist es immer angenehmer, auf der Tabellenebene zu arbeiten anstatt sich mit komplexen Objektklassen zu schäftigen. Daher geht der direktere Weg zu einer Elektronischen Rechnung über eine Methode, die die Rechnungsdaten der eigenen Anwendung in die vorbereiteten vbax_tbl-Tabellen schreibt. Über die INV_ID kann dann – wie in der Function sample_Simple_Load_Export gezeigt – in einem Schritt sofort eine Elektronische Rechnung in der passenden Syntax erstellt und gespeichert werden.