{"id":55001231,"date":"2020-04-01T00:00:00","date_gmt":"2020-07-10T09:40:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1231"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Rechnungen_mit_ZUGFeRD_10_Teil_1_NET","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/","title":{"rendered":"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/c6347d3dbc53416f9a6114d4822a4180\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>ZUGFeRD ist das Akronym f&uuml;r &#8222;Zentraler User Guide des Forums elektronische Rechnung Deutschland&#8220;. Au&szlig;erdem ist es ein elektronisches Rechnungsdatenformat f&uuml;r den Austausch von Rechnungen und damit ein L&ouml;sungsansatz f&uuml;r die Frage, wie man die Daten einer Rechnung auf einfache Weise f&uuml;r die Durchf&uuml;hrung der &Uuml;berweisung des berechneten Betrags verarbeiten kann. Genau genommen nutzt man hier eine Kombination aus einem auf spezielle Weise hergestellten PDF-Dokuments und eines XML-Dokuments, das die in der Rechnung enthaltenen Daten einmal optimiert f&uuml;r das menschliche Auge und einmal optimiert f&uuml;r die Datenverarbeitung enth&auml;lt. In diesem ersten Teil einer kleinen Beitragsreihe zeigen wir, wie Sie die Open Source-Bibliothek von Konik in einer .NET-L&ouml;sung nutzen, um daraus eine DLL f&uuml;r den Zugriff auf Access heraus zu erstellen.<\/b><\/p>\n<p><b>ZUGFeRD-Basics<\/b><\/p>\n<p>Grundidee hinter ZUGFeRD ist es, ein einheitliches Format f&uuml;r den Austausch von Rechnungsdaten zu schaffen, das sowohl vom Menschen als auch vom Computer optimal gelesen werden kann.<\/p>\n<p>Die &uuml;blichen Rechnungen sind durchaus so strukturiert, dass der Mensch die Daten f&uuml;r die zu t&auml;tigende &Uuml;berweisung entnehmen kann &#8211; wenngleich hier eine weitere Vereinheitlichung bez&uuml;glich der Position der verschiedenen Informationen w&uuml;nschenswert w&auml;re.<\/p>\n<p>Wenn Sie die Rechnung computergest&uuml;tzt verarbeiten wollen, wird es ohne Standardisierung umso schwieriger &#8211; Algorithmen brauchen halt genaue Informationen, wo sie was einlesen sollen, damit sie ihre Arbeit fehlerfrei verrichten. Das ist bei gedruckten und eingescannten Rechnungen oder auch bei Rechnungen im PDF-Format nicht zuverl&auml;ssig m&ouml;glich.<\/p>\n<p>Also haben sich die Menschen hinter <b>FeRD<\/b>, dem <b>Forum elektronische Rechnung Deutschland<\/b>, etwas ausgedacht: Sie verwenden ein spezielles PDF-Format, n&auml;mlich das Format PDF\/A-3, mit dem ein PDF-Dokument, das mit herk&ouml;mmlichen PDF-Readern angezeigt werden kann, um ein XML-Dokument erweitert werden kann. Dieses enth&auml;lt die gleichen Daten, die auch schon im PDF-Dokument angezeigt werden, nochmal im XML-Format &#8211; also in einem Format, das von Computern besser verarbeitet werden kann als ein einfaches PDF-Format.<\/p>\n<p><b>Die Konik-Bibliothek<\/b><\/p>\n<p>Die Firma Konik bietet unter <b>https:\/\/konik.io\/ <\/b>eine Open Source-Bibliothek f&uuml;r Java und .NET an. Als Access-Entwickler schauen wir erstmal wieder in die R&ouml;hre, denn es gibt keine direkte M&ouml;glichkeit f&uuml;r uns, direkt auf die Bibliothek zuzugreifen. Wir m&uuml;ssen uns also selbst eine DLL bauen, welche diese Bibliothek nutzt, und auf diese von Access aus zugreifen. Wir werden dies aber in diesem Teil der Beitragsreihe und in den folgenden Teilen detailliert darstellen.<\/p>\n<p><b>ZUGFeRD-Versionen<\/b><\/p>\n<p>Es gibt verschiedene Versionen von ZUGFeRD. Die erste Version 1.0 stammt von 2014. Das ist die Version, die wir im vorliegenden Beitrag beschreiben.<\/p>\n<p>Die neueste Version 2.01 liegt zum Zeitpunkt der Erstellung dieses Beitrags noch nicht in Form einer Open Source-Bibliothek vor.<\/p>\n<p><b>Visual Studio installieren<\/b><\/p>\n<p>Wenn Sie nicht bereits Visual Studio installiert haben, sollten Sie dies nachholen, sofern Sie die Beispiele dieses Beitrags nachvollziehen wollen. Sie k&ouml;nnen aber auch die hier erstellte DLL von Access aus verwenden.<\/p>\n<p>Visual Studio k&ouml;nnen Sie in der aktuellen Version zumindest f&uuml;r private Zwecke und Testzwecke in der Community Edition kostenlos herunterladen und nutzen (weitere Informationen hierzu erhalten Sie in den jeweiligen Lizenzbedingungen).<\/p>\n<p><b>Visual Studio als Administrator starten<\/b><\/p>\n<p>Da die DLL nicht nur erstellt, sondern auch registriert werden muss, ben&ouml;tigen Sie sp&auml;ter Administratorrechte. Daher starten Sie Visual Studio gleich mit diesen Rechten.<\/p>\n<p>Dazu klicken Sie mit der rechten Maustaste auf den Eintrag f&uuml;r Visual Studio und w&auml;hlen dort den Befehl <b>Als Administrator &ouml;ffnen <\/b>aus. Dass Visual Studio mit Administratorrechten gestartet wurde, erkennen Sie daran, dass in der Titelzeile <b>Administrator <\/b>in Klammern ausgegeben wird.<\/p>\n<p><b>DLL erstellen<\/b><\/p>\n<p>Um eine geeignete DLL zu erstellen, &ouml;ffnen Sie mit dem Men&uuml;punkt <b>Datei|Neu|Projekt&#8230; <\/b>den Dialog <b>Neues Projekt<\/b>. Hier w&auml;hlen Sie den Namen und den Speicherort des zu erstellenden Projekts aus.<\/p>\n<p>Am wichtigsten ist jedoch die Wahl des richtigen Projekttyps, in diesem Fall <b>Visual Basic|Windows Desktop|Klassenbibliothek (.NET Framework)<\/b>. Vor dem Erstellen des Projekts sieht der Dialog wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1231_001.png\" alt=\"Anlegen der Klassenbibliothek in Visual Studio\" width=\"700\" height=\"349,2118\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anlegen der Klassenbibliothek in Visual Studio<\/span><\/b><\/p>\n<p><b>Vorbereitungen der DLL<\/b><\/p>\n<p>Als Erstes benennen wir die automatisch hinzugef&uuml;gte Klasse <b>Class1 <\/b>um, und zwar in <b>ZUGFeRD_NET<\/b>. Das erledigen Sie, indem Sie den entsprechenden Eintrag im Projektmappen-Explorer von Visual Studio &auml;ndern.<\/p>\n<p>Wenn Sie das tun, fragt Visual Studio automatisch, ob Sie auch Verweise auf das Codeelement <b>Class1 <\/b>umbenennen wollen, was Sie bejahen sollten. Dadurch wird auch die Klasse entsprechend umbenannt:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> ZUGFeRD_NET\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Danach erweitern wir den Inhalt der Datei <b>ZUGFeRD_NET.vb <\/b>wie folgt um einen Verweis auf den Namespace <b>System.Runtime.InteropServices <\/b>und einer Zusatzinformation:<\/p>\n<pre>Imports System.Runtime.InteropServices\r\n&lt;ClassInterface(ClassInterfaceType.AutoDual)&gt;\r\n<span style=\"color:blue;\">Public Class<\/span> ZUGFeRD_NET\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b>Sichtbarmachen der Klassen und Methoden<\/b><\/p>\n<p>Damit wir die Klasse und die nachfolgend definierten Methoden im VBA-Editor finden k&ouml;nnen, m&uuml;ssen wir noch weitere Schritte durchf&uuml;hren.<\/p>\n<p>Dazu klicken Sie doppelt auf den Eintrag <b>My Project <\/b>im Projektmappen-Explorer und zeigen so die Eigenschaften des Projekts an.<\/p>\n<p>Hier wechseln Sie zum Bereich <b>Anwendung<\/b>, sofern dieser noch nicht angezeigt wird, und klicken dort auf die Schaltfl&auml;che <b>Assemblyinformationen&#8230; <\/b>(siehe Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1231_002.png\" alt=\"Anzeigen der Assemblyinformationen\" width=\"499,6607\" height=\"293,0464\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Anzeigen der Assemblyinformationen<\/span><\/b><\/p>\n<p>Danach erscheint der Dialog <b>Assemblyinformationen<\/b>. Hier finden Sie im unteren Bereich den Eintrag <b>Assembly COM-sichtbar machen<\/b>, den Sie aktivieren (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1231_003.png\" alt=\"Assembly sichtbar f&uuml;r COM machen\" width=\"499,6607\" height=\"355,9566\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Assembly sichtbar f&uuml;r COM machen<\/span><\/b><\/p>\n<p>Fehlt noch ein Schritt, den Sie in den Eigenschaften im Bereich <b>Kompilieren <\/b>erledigen &#8211; hier muss die Option <b>F&uuml;r COM-Interop registrieren <\/b>aktiviert werden (siehe Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1231_004.png\" alt=\"Registrieren f&uuml;r COM-Interop\" width=\"499,6607\" height=\"339,2872\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Registrieren f&uuml;r COM-Interop<\/span><\/b><\/p>\n<p>Schlie&szlig;lich f&uuml;gen wir der Klasse <b>ZUGFeRD_NET <\/b>die folgende Funktion hinzu:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ZUGFeRDRechnungErstellen() <span style=\"color:blue;\"> As Boolean<\/span>\r\n     Return <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Damit k&ouml;nnen wir das Projekt nun erstellen, indem wir den Men&uuml;befehl <b>Erstellen|Projektmappe erstellen <\/b>von Visual Studio aufrufen. Dadurch wird die DLL erstellt und die Registry wird um die Informationen erg&auml;nzt, die gleich beim &Ouml;ffnen von Access eingelesen werden, damit dort die neue Bibliothek als Verweis zur Verf&uuml;gung steht.<\/p>\n<p><b>Verweis auf die neue ZUGFeRD-Bibliothek einbinden<\/b><\/p>\n<p>Um den Verweis zu einem VBA-Projekt einer Access-Datenbank hinzuzuf&uuml;gen, &ouml;ffnen Sie zun&auml;chst die Access-Datenbank, in der Sie die DLL verwenden wollen.<\/p>\n<p>Dann zeigen Sie den VBA-Editor an, am schnellsten mit der Tastenkombination <b>Strg + G<\/b>, und &ouml;ffnen dann mit dem Men&uuml;eintrag <b>Extras|Verweise <\/b>den <b>Verweise<\/b>-Dialog.<\/p>\n<p>Hier finden Sie nun ganz unten den Eintrag <b>ZUGFeRD<\/b>, den Sie anhaken, bevor Sie den Dialog wieder schlie&szlig;en (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1231_005.png\" alt=\"Verweis auf die neue DLL hinzuf&uuml;gen\" width=\"499,6607\" height=\"393,9009\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Verweis auf die neue DLL hinzuf&uuml;gen<\/span><\/b><\/p>\n<p>Wenn dies geschehen ist, k&ouml;nnen Sie ausprobieren, ob die einzige bisher angelegte Funktion bereits wie erwartet arbeitet. Diese sollte beim Aufruf der folgenden Prozedur den Wert <b>True <\/b>im Direktfenster ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>ZUGFeRDTest()\r\n     <span style=\"color:blue;\">Dim <\/span>objZUGFeRD<span style=\"color:blue;\"> As <\/span>ZUGFeRD.ZUGFeRD_NET\r\n     <span style=\"color:blue;\">Set<\/span> objZUGFeRD = <span style=\"color:blue;\">New<\/span> ZUGFeRD.ZUGFeRD_NET\r\n     <span style=\"color:blue;\">Debug.Print<\/span> objZUGFeRD.ZUGFeRDRechnungErstellen\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dies gelingt wie erwartet, sodass wir uns nun der Programmierung zuwenden k&ouml;nnen.<\/p>\n<p><b>ZUGFeRD-Paket zum VB-Projekt hinzuf&uuml;gen<\/b><\/p>\n<p>Die Open Source-Bibliothek <b>ZUGFeRD.NET <\/b>der Firma Konik kommt als NuGet-Paket. Solche Pakete k&ouml;nnen Sie einfach zu einem VB-Projekt unter Visual Studio hinzuf&uuml;gen.<\/p>\n<p>Dazu w&auml;hlen Sie im Kontextmen&uuml; des Projekt-Elements im Projektmappen-Explorer unter Visual Studio den Eintrag <b>NuGet-Pakete verwalten <\/b>aus. Dies &ouml;ffnet den <b>NuGet-Paket-Manager<\/b>. Hier geben Sie als Suchbegriff <b>ZUGFeRD <\/b>ein und wechseln dann zum Bereich <b>Durchsuchen<\/b>.<\/p>\n<p>Wir suchen den Eintrag <b>ZUGFeRD.NET <\/b>der Firma Konik und f&uuml;gen das entsprechende Paket durch einen Klick auf die Schaltfl&auml;che <b>Installieren <\/b>zum aktuellen VB-Projekt hinzu (siehe Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_02\/pic_1231_006.png\" alt=\"Hinzuf&uuml;gen des NuGet-Pakets \" width=\"649,559\" height=\"512,0715\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Hinzuf&uuml;gen des NuGet-Pakets <\/span><\/b><\/p>\n<p><b>Namespace-Verweise<\/b><\/p>\n<p>Im Modul <b>ZUGFeRD_NET.vb <\/b>f&uuml;gen Sie nun zun&auml;chst die folgenden Verweise auf die ben&ouml;tigen Namespaces hinzu:<\/p>\n<pre>Imports System.Runtime.InteropServices \r\nImports java.io\r\nImports org.apache.commons.lang3.time\r\nImports com.neovisionaries.i18n\r\nImports io.konik\r\nImports io.konik.ZUGFeRD\r\nImports io.konik.ZUGFeRD.entity\r\nImports io.konik.ZUGFeRD.entity.trade\r\nImports io.konik.ZUGFeRD.entity.trade.item\r\nImports io.konik.ZUGFeRD.profile\r\nImports io.konik.ZUGFeRD.unece.codes\r\nImports io.konik.ZUGFeRD.unqualified\r\nImports java.math\r\nImports Country = com.neovisionaries.i18n.CountryCode\r\nImports Currency = com.neovisionaries.i18n.CurrencyCode<\/pre>\n<p><b>Verschiedene Profile<\/b><\/p>\n<p>Bevor wir in die Programmierung einsteigen, noch ein Hinweis auf die verschiedenen Profile f&uuml;r ZUGFeRD-Dateien.<\/p>\n<p>Diese sehen wir folgt aus:<\/p>\n<ul>\n<li><b>BASIC<\/b>: F&uuml;r einfachste Rechnungen. Hier werden nur die relevantesten Daten im XML-Dokument ber&uuml;cksichtigt. Einzelne Rechnungspositionen etwa entfallen. Informationen wie die einzelnen Positionen werden in Textform im PDF-Teil der Rechnung &uuml;bermittelt.<\/li>\n<li><b>COMFORT<\/b>: Bietet mehr M&ouml;glichkeiten als das BASIC-Profil, aber nicht alle M&ouml;glichkeiten.<\/li>\n<li><b>EXTENDED<\/b>: Erm&ouml;glicht die vollst&auml;ndige Abbildung des strukturierten Rechnungsaustauschs.<\/li>\n<\/ul>\n<p>Eine bessere Unterscheidung erm&ouml;glicht die Betrachtung der verschiedenen Rechnungsarten.<\/p>\n<p>Das <b>BASIC<\/b>-Profil unterst&uuml;tzt diese Rechnungsarten:<\/p>\n<ul>\n<li>Handelsrechnung (Rechnung f&uuml;r Waren und Dienstleistungen) mit dem Code <b>380<\/b><\/li>\n<li>Bescheide (z. B. Zahlungsaufforderung von Beh&ouml;rden) mit dem Code <b>380<\/b><\/li>\n<li>Kaufm&auml;nnische Gutschrift (zum Beispiel Rechnungskorrektur\/Storno) mit negativen Werten (Code <b>380<\/b>)<\/li>\n<\/ul>\n<p>Das <b>COMFORT<\/b>-Profil bietet folgende zus&auml;tzlichen Rechnungsarten:<\/p>\n<ul>\n<li>Wertbelastung\/Wertrechnung ohne Warenbezug (Code <b>84<\/b>)<\/li>\n<li>Wertgutschrift ohne Warenbezug mit negativen Werten (Code <b>84<\/b>)<\/li>\n<li>Mit dem <b>EXTENDED<\/b>-Profil k&ouml;nnen au&szlig;erdem diese Rechnungsarten verarbeitet werden:<\/li>\n<li>Selbst ausgestellte Rechnung (Steuerrechtliche Gutschrift\/Gutschriftsverfahren, Code <b>389<\/b>)<\/li>\n<li>Selbst ausgestellte Gutschrift mit negativen Werten (Code <b>389<\/b>)<\/li>\n<\/ul>\n<p>Die hier genannten Codes werden einer der Eigenschaften zugeordnet, die wir gleich &uuml;ber das Objektmodell der Bibliothek dem XML-Dokument zuweisen, das mit dem PDF-Dokument zusammengef&uuml;hrt werden soll.<\/p>\n<p><b>&Ouml;ffentliche Eigenschaften der DLL<\/b><\/p>\n<p>Damit wir die im XML-Teil der Rechnung zu ber&uuml;cksichtigenden Informationen von Access aus an die DLL &uuml;bergeben k&ouml;nnen, erstellen wir einige &ouml;ffentliche Eigenschaften.<\/p>\n<p>Deren Programmierung im Modul <b>ZUGFeRD_NET.vb <\/b>besteht aus zwei Teilen &#8211; der privaten Deklaration einer Variablen zum Speichern der zugewiesenen Werte sowie einer &ouml;ffentlichen Eigenschaft mit Getter und Setter.<\/p>\n<p>Die Namen der privaten Variablen beginnen allesamt mit dem Unterstrich und werden wie folgt deklariert:<\/p>\n<pre>     <span style=\"color:blue;\">Private <\/span>_QuellPDF<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_ZielPDF<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Rechnungsnummer<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_Name<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_PLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_Strasse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_Ort<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_Land<span style=\"color:blue;\"> As <\/span>CountryCode\r\n     <span style=\"color:blue;\">Private <\/span>_Bemerkung<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_UstIDNr<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Kaeufer_Name<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Kaeufer_PLZ<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Kaeufer_Strasse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Kaeufer_Ort<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Kaeufer_Land<span style=\"color:blue;\"> As <\/span>CountryCode\r\n     <span style=\"color:blue;\">Private <\/span>_Kaeufer_UstIDNr<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_IBAN<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Verkaeufer_BIC<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Nettobetrag<span style=\"color:blue;\"> As <\/span>BigDecimal\r\n     <span style=\"color:blue;\">Private <\/span>_Aufschlaege<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Abschlaege<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Mehrwertsteuerbetrag<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Bruttobetrag<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Zahlungsreferenz<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_Produkt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>_AnzahlProdukt<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>F&uuml;r jede der Variablen (mit wenigen Ausnahmen) f&uuml;gen wir eine &ouml;ffentliche Eigenschaft hinzu, die von au&szlig;en gelesen und geschrieben werden kann.<\/p>\n<p>F&uuml;r die Variable <b>_ZielPDF <\/b>sieht dieses Konstrukt wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Property <\/span>ZielPDF<span style=\"color:blue;\"> As String<\/span>\r\n     Get\r\n         Return _ZielPDF\r\n     End Get\r\n     Set(value<span style=\"color:blue;\"> As String<\/span>)\r\n         _ZielPDF = value\r\n     End <span style=\"color:blue;\">Set<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>F&uuml;r die &uuml;brigen Variablen haben wir &auml;hnliche Konstrukte erstellt. In einigen F&auml;llen ben&ouml;tigen wir alternative Getter und Setter, zum Beispiel f&uuml;r das Land. Hier m&uuml;ssen wir das als Zeichenkette gelieferte L&auml;nderk&uuml;rzel in ein Objekt umwandeln (zum Beispiel <b>Country.DE<\/b>) und umgekehrt:<\/p>\n<pre><span style=\"color:blue;\">Public Property <\/span>Verkaeufer_Land<span style=\"color:blue;\"> As String<\/span>\r\n     Get\r\n         <span style=\"color:blue;\">If <\/span>(_Verkaeufer_Land Is Country.DE)<span style=\"color:blue;\"> Then<\/span>\r\n             Return \"DE\"\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End Get\r\n     Set(value<span style=\"color:blue;\"> As String<\/span>)\r\n         Select Case value\r\n             <span style=\"color:blue;\">Case <\/span>\"DE\"\r\n                 _Verkaeufer_Land = Country.DE\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     End <span style=\"color:blue;\">Set<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Und f&uuml;r die f&uuml;nf Eigenschaften <b>Nettobetrag<\/b>, <b>Aufschlaege<\/b>, <b>Abschlaege<\/b>, <b>Mehrwertsteuerbetrag <\/b>und <b>Bruttobetrag <\/b>verwenden wir eine Eigenschaft wie die folgende &#8211; hier am Beispiel des Nettobetrags:<\/p>\n<pre><span style=\"color:blue;\">Public Property <\/span>Nettobetrag<span style=\"color:blue;\"> As Double<\/span>\r\n     Get\r\n         Return _Nettobetrag.floatValue\r\n     End Get\r\n     Set(value<span style=\"color:blue;\"> As Double<\/span>)\r\n         _Nettobetrag = <span style=\"color:blue;\">New<\/span> BigDecimal(value)\r\n     End <span style=\"color:blue;\">Set<\/span>\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Dies ist den Inkompatibilit&auml;ten zwischen den Datentypen von Java, auf dem das NuGet-Paket basiert, und .NET begr&uuml;ndet. Hier passiert Folgendes: Der Benutzer &uuml;bergibt den Wert von Access aus als Dezimalzahl, in diesem Fall bei Zahlen ohne Nachkommastellen als <b>Integer <\/b>(bis 32.767) oder <b>Long <\/b>(ab 32.768) und mit Nachkommastellen als <b>Double<\/b>.<\/p>\n<p>Diese m&uuml;ssen wir in den Datentyp <b>BigDecimal <\/b>konvertieren, denn die Eigenschaften, die wir f&uuml;r die Erstellung des XML-Dokuments mit den Zahlenwerten f&uuml;llen m&uuml;ssen, weisen diesen Datentypen des Namespace <b>java.math <\/b>auf.<\/p>\n<p>Beim Zuweisen an die Eigenschaft erstellen wir auf Basis des Wertes aus <b>value <\/b>mit <b>New BigDecimal(value) <\/b>ein <b>BigDecimal<\/b>-Objekt mit dem entsprechenden Wert. Beim Zur&uuml;ckgeben &uuml;ber den Getter ermitteln wir mit der Eigenschaft <b>floatValue <\/b>die im <b>BigDecimal<\/b>-Objekt enthaltene Zahl mit Nachkommastellen.<\/p>\n<p><b>Hauptmethode der DLL<\/b><\/p>\n<p>Neben den vielen Informationen, die wir der DLL &uuml;ber die oben genannten &ouml;ffentlichen Eigenschaften mitteilen, gibt es zun&auml;chst eine einzige Methode, die tats&auml;chlich etwas erledigt. Diese hei&szlig;t <b>ZUGFeRDRechnungErstellen <\/b>und sieht wie in Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ZUGFeRDRechnungErstellen()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objInvoice<span style=\"color:blue;\"> As <\/span>Invoice\r\n     <span style=\"color:blue;\">Dim <\/span>objPDFHandler<span style=\"color:blue;\"> As <\/span>PdfHandler\r\n     <span style=\"color:blue;\">Dim <\/span>objInputPDf<span style=\"color:blue;\"> As <\/span>InputStream\r\n     <span style=\"color:blue;\">Dim <\/span>objResultingPDF<span style=\"color:blue;\"> As <\/span>OutputStream\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     Kill(ZielPDF)\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     IKVM.Runtime.Startup.addBootClassPathAssembly( _\r\n         GetType(io.konik.ZUGFeRD.ObjectFactory).Assembly)\r\n     objInvoice = CreateInvoice()\r\n     objPDFHandler = <span style=\"color:blue;\">New<\/span> PdfHandler\r\n     objInputPDf = <span style=\"color:blue;\">New<\/span> FileInputStream(QuellPDF)\r\n     objResultingPDF = <span style=\"color:blue;\">New<\/span> FileOutputStream(ZielPDF)\r\n     objPDFHandler.appendInvoice(objInvoice, objInputPDf, objResultingPDF)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(ZielPDF)) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         Return <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Return <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Methode zum Erstellen einer Rechnung<\/span><\/b><\/p>\n<p>Die Methode l&ouml;scht zun&auml;chst eine eventuell bereits vorhandene Datei mit dem Namen der zu erstellenden Zieldatei. Dann folgt eine Anweisung, die die technische Voraussetzung f&uuml;r den Einsatz der Bibliotheken in einer DLL schafft (das ist etwa in einer WPF-Anwendung nicht n&ouml;tig).<\/p>\n<p>Nun erstellt die Prozedur mit der Methode <b>CreateInvoice <\/b>ein neues Rechnungsobjekt. Diese Methode erledigt die Hauptarbeit und wird weiter unten beschrieben.<\/p>\n<p>Im Anschluss erstellt die Prozedur ein neues <b>PdfHandler<\/b>-Objekt sowie zwei <b>FileInputStream<\/b>-Objekte auf Basis der bereits bestehenden PDF-Rechnung und f&uuml;r das Erstellen der neuen, um das XML-Dokument angereicherte Rechnungsdatei.<\/p>\n<p>Schlie&szlig;lich sorgt die Methode <b>appendInvoice <\/b>des <b>PDFHandler<\/b>-Objekts daf&uuml;r, dass die Rechnung zum Ausgangs-PDF hinzugef&uuml;gt wird und dass die neue Version unter dem Namen des Zieldokuments gespeichert wird. Liegt das gew&uuml;nschte PDF-Dokument anschlie&szlig;end vor, liefert die Methode den Wert <b>True <\/b>zur&uuml;ck.<\/p>\n<p><b>Die Methode CreateInvoice<\/b><\/p>\n<p>Die weiter oben bereits erw&auml;hnte Methode <b>CreateInvoice <\/b>stellt die &uuml;ber die &ouml;ffentlichen Eigenschaften &uuml;bergebenen Informationen zusammen.<\/p>\n<p>Sie liefert ein Objekt des Typs <b>Invoice <\/b>als Ergebnis an die aufrufende Routine zur&uuml;ck.<\/p>\n<p>Die folgende Methode haben wir aus folgendem Link bezogen und dann an Visual Basic angepasst und um die &ouml;ffentlichen Eigenschaften erg&auml;nzt:<\/p>\n<pre>https:\/\/github.com\/konik-io\/ZUGFeRD.NET-Example\/blob\/master\/KonikNetExample\/NetExampleInvoice.cs<\/pre>\n<p><b>Deklaration<\/b><\/p>\n<p>Zu Beginn deklariert die Methode erst einmal einige Variablen, die wir im sp&auml;teren Verlauf ben&ouml;tigen:<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>CreateInvoice()<span style=\"color:blue;\"> As <\/span>Invoice\r\n     <span style=\"color:blue;\">Dim <\/span>objInvoice<span style=\"color:blue;\"> As <\/span>Invoice\r\n     <span style=\"color:blue;\">Dim <\/span>objHeader<span style=\"color:blue;\"> As <\/span>Header\r\n     <span style=\"color:blue;\">Dim <\/span>Today<span style=\"color:blue;\"> As <\/span>ZfDate\r\n     <span style=\"color:blue;\">Dim <\/span>nextMonth<span style=\"color:blue;\"> As <\/span>ZfDate\r\n     <span style=\"color:blue;\">Dim <\/span>objTrade<span style=\"color:blue;\"> As <\/span>Trade\r\n     <span style=\"color:blue;\">Dim <\/span>objSeller<span style=\"color:blue;\"> As <\/span>TradeParty\r\n     <span style=\"color:blue;\">Dim <\/span>objBuyer<span style=\"color:blue;\"> As <\/span>TradeParty\r\n     <span style=\"color:blue;\">Dim <\/span>objAgreement<span style=\"color:blue;\"> As <\/span>Agreement\r\n     <span style=\"color:blue;\">Dim <\/span>objSettlement<span style=\"color:blue;\"> As <\/span>Settlement\r\n     <span style=\"color:blue;\">Dim <\/span>objPaymentmeans<span style=\"color:blue;\"> As <\/span>PaymentMeans\r\n     <span style=\"color:blue;\">Dim <\/span>objMonetarySummation<span style=\"color:blue;\"> As <\/span>MonetarySummation\r\n     <span style=\"color:blue;\">Dim <\/span>objProduct<span style=\"color:blue;\"> As <\/span>Product\r\n     <span style=\"color:blue;\">Dim <\/span>objItem<span style=\"color:blue;\"> As <\/span>Item\r\n     <span style=\"color:blue;\">Dim <\/span>objSpecifiedDelivery<span style=\"color:blue;\"> As <\/span>SpecifiedDelivery\r\n     <span style=\"color:blue;\">Dim <\/span>objQuantity<span style=\"color:blue;\"> As <\/span>Quantity<\/pre>\n<p><b>Vorbereitende Schritte<\/b><\/p>\n<p>Dann f&uuml;llt sie die Variable <b>Today <\/b>mit dem aktuellen Datum in einem von der <b>ZUGFeRD<\/b>-Bibliothek lesbaren Format.<\/p>\n<p>In der Variablen <b>nextMonth <\/b>speichern wir das Datum, das einen Monat hinter dem Rechnungsdatum liegt:<\/p>\n<pre>     Today = <span style=\"color:blue;\">New<\/span> ZfDateDay()\r\n     nextMonth = <span style=\"color:blue;\">New<\/span> ZfDateMonth(DateUtils.addMonths(Today, 1))<\/pre>\n<p>Die folgende Anweisung erstellt das grundlegende Rechnungsobjekt auf Basis der Vorlage <b>BASIC<\/b>:<\/p>\n<pre>     objInvoice = <span style=\"color:blue;\">New<\/span> Invoice(ConformanceLevel.BASIC)<\/pre>\n<p>Das erste Element, das wir hinzuf&uuml;gen, hei&szlig;t <b>Header<\/b>. Es enth&auml;lt Daten wie die Rechnungsnummer, den Dokumentcode (siehe oben &#8211; <b>380 <\/b>entspricht Handelsrechnungen, Bescheide oder kaufm&auml;nnischen Gutschriften). <b>setIssued <\/b>nimmt das Erstellungsdatum entgegen. Mit <b>addNote <\/b>f&uuml;gen wir einen Hinweistext hinzu wie beispielsweise <b>F&auml;llig in zehn Tagen<\/b>. Mit <b>setName <\/b>legen wir die Bezeichnung fest: <\/p>\n<pre>     objHeader = <span style=\"color:blue;\">New<\/span> Header\r\n     <span style=\"color:blue;\">With<\/span> objHeader\r\n         .setInvoiceNumber(_Rechnungsnummer)\r\n         .setCode(DocumentCode._380)\r\n         .setIssued(Today)\r\n         .addNote(<span style=\"color:blue;\">New<\/span> Note(_Bemerkung))\r\n         .setName(\"Rechnung\")\r\n     End <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Die folgende Anweisung f&uuml;gt das <b>Header<\/b>-Objekt &uuml;ber die Methode <b>setHeader <\/b>zu <b>objInvoice <\/b>hinzu:<\/p>\n<pre>     objInvoice.setHeader(objHeader)<\/pre>\n<p>Danach beginnen wir mit dem Eintragen weiterer Informationen in weitere Objekte, die sp&auml;ter als Eigenschaften weiteren Objekten hinzugef&uuml;gt werden.<\/p>\n<p>Wir beginnen mit den Verk&auml;uferdaten, die in einem Objekt des Typs <b>TradeParty <\/b>namens <b>objSeller <\/b>landen. Hier weisen wir den Namen des Verk&auml;ufers, seine Adressdaten sowie die Umsatzsteuer-Identifikationsnummer zu:<\/p>\n<pre>     objSeller = <span style=\"color:blue;\">New<\/span> TradeParty\r\n     <span style=\"color:blue;\">With<\/span> objSeller\r\n         .setName(_Verkaeufer_Name)\r\n         .setAddress(<span style=\"color:blue;\">New<\/span> Address(_Verkaeufer_PLZ,  _Verkaeufer_Strasse, _Verkaeufer_PLZ,  _Verkaeufer_Land))\r\n         .addTaxRegistrations(<span style=\"color:blue;\">New<\/span> TaxRegistration( _Verkaeufer_UstIDNr))\r\n     End <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Das Gleiche erledigen wir anschlie&szlig;end f&uuml;r den K&auml;ufer, der in einem Objekt mit dem Namen <b>objBuyer <\/b>landet:<\/p>\n<pre>     objBuyer = <span style=\"color:blue;\">New<\/span> TradeParty()\r\n     <span style=\"color:blue;\">With<\/span> objBuyer\r\n         .setName(_Kaeufer_Name)\r\n         .setAddress(<span style=\"color:blue;\">New<\/span> Address(_Kaeufer_PLZ,  _Kaeufer_Strasse, _Kaeufer_Ort,  _Verkaeufer_Land))\r\n         .addTaxRegistrations(<span style=\"color:blue;\">New<\/span> TaxRegistration( _Kaeufer_UstIDNr))\r\n     End <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Diese beiden Objekte landen im Objekt <b>objAgreement <\/b>des Typs <b>Agreement<\/b>:<\/p>\n<pre>     objAgreement = <span style=\"color:blue;\">New<\/span> Agreement()\r\n     <span style=\"color:blue;\">With<\/span> objAgreement\r\n         .setSeller(objSeller)\r\n         .setBuyer(objBuyer)\r\n     End <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Das <b>Settlement<\/b>-Objekt in <b>objSettlement<\/b> nimmt weitere Informationen auf, zum Beispiel die Zahlungsreferenz und die W&auml;hrung, die wir hier standardm&auml;&szlig;ig auf EUR festlegen:<\/p>\n<pre>     objSettlement = <span style=\"color:blue;\">New<\/span> Settlement()\r\n     <span style=\"color:blue;\">With<\/span> objSettlement\r\n         .setPaymentReference(_Zahlungsreferenz)\r\n         .setCurrency(Currency.EUR)<\/pre>\n<p>Unter <b>objPaymentMeans <\/b>fasst die Methode die IBAN und die BIC des Zahlungsempf&auml;ngers zusammen.<\/p>\n<p>Das Objekt <b>objPaymentmeans <\/b>wird dann mit der Methode <b>addpaymentMeans <\/b>zu <b>objSettlement <\/b>hinzugef&uuml;gt:<\/p>\n<pre>         objPaymentmeans = <span style=\"color:blue;\">New<\/span> PaymentMeans\r\n         <span style=\"color:blue;\">With<\/span> objPaymentmeans\r\n             .setPayeeAccount(<span style=\"color:blue;\">New<\/span>  CreditorFinancialAccount(_Verkaeufer_IBAN))\r\n             .setPayeeInstitution(<span style=\"color:blue;\">New<\/span>  FinancialInstitution(_Verkaeufer_BIC))\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         .addPaymentMeans(objPaymentmeans)<\/pre>\n<p>Im letzten Teil der Informationen des Objekt <b>objSettlement <\/b>handelt es sich um die Rechnungssummen.<\/p>\n<p>Es gibt die Nettosumme (<b>setLineTotal<\/b>), Aufschl&auml;ge (<b>setChargeTotal<\/b>), Abschl&auml;ge (<b>setAllowanceTotal<\/b>), Steuerbetrag (<b>setTaxBasisTotal<\/b>) und Bruttosumme (<b>setGrandTotal<\/b>):<\/p>\n<pre>         objMonetarySummation = <span style=\"color:blue;\">New<\/span> MonetarySummation\r\n         <span style=\"color:blue;\">With<\/span> objMonetarySummation\r\n             .setLineTotal(<span style=\"color:blue;\">New<\/span> Amount( _Nettobetrag, Currency.EUR))\r\n             .setChargeTotal(<span style=\"color:blue;\">New<\/span> Amount( _Aufschlaege, Currency.EUR))\r\n             .setAllowanceTotal(<span style=\"color:blue;\">New<\/span> Amount( _Abschlaege, Currency.EUR))\r\n             .setTaxBasisTotal(<span style=\"color:blue;\">New<\/span> Amount( _Mehrwertsteuerbetrag, Currency.EUR))\r\n             .setGrandTotal(<span style=\"color:blue;\">New<\/span> Amount( _Bruttobetrag, Currency.EUR))\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         .setMonetarySummation(objMonetarySummation)\r\n     End <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Danach erstellt die Methode ein neues Objekt namens <b>objTrade <\/b>auf Basis der Klasse <b>Trade <\/b>und weist die zuvor erstellten Objekte <b>objAgreement <\/b>und <b>objSettlement <\/b>sowie das Lieferdatum hinzu, das der Methode <b>setDelivery <\/b>zugewiesen wird:<\/p>\n<pre>     objTrade = <span style=\"color:blue;\">New<\/span> Trade()\r\n     <span style=\"color:blue;\">With<\/span> objTrade\r\n         .setAgreement(objAgreement)\r\n         .setDelivery(<span style=\"color:blue;\">New<\/span> Delivery(nextMonth))\r\n         .setSettlement(objSettlement)<\/pre>\n<p>Danach wird noch, wenn mit <b>_Produkt <\/b>der Name eines Produkts &uuml;bergeben wurde, ein Produkt mit einen Objekt des Typs <b>Product <\/b>hinzugef&uuml;gt. Au&szlig;erdem legen wir in einem Objekt des Typs <b>SpecifiedDelivery <\/b>die Menge des Produkts fest.<\/p>\n<p>Diese beiden Objekte werden dann als neues <b>Item<\/b>-Objekt zu <b>objTrade <\/b>hinzugef&uuml;gt:<\/p>\n<pre>         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(_Produkt) = 0<span style=\"color:blue;\"> Then<\/span>\r\n             objProduct = <span style=\"color:blue;\">New<\/span> Product()\r\n             <span style=\"color:blue;\">With<\/span> objProduct\r\n                 .setName(_Produkt)\r\n             End <span style=\"color:blue;\">With<\/span>\r\n             objSpecifiedDelivery = <span style=\"color:blue;\">New<\/span> SpecifiedDelivery\r\n             <span style=\"color:blue;\">With<\/span> objSpecifiedDelivery\r\n                 objQuantity = <span style=\"color:blue;\">New<\/span> Quantity( _AnzahlProdukt, UnitOfMeasurement.UNIT)\r\n                 .setPackageQuantity(objQuantity)\r\n             End <span style=\"color:blue;\">With<\/span>\r\n             objItem = <span style=\"color:blue;\">New<\/span> Item\r\n             <span style=\"color:blue;\">With<\/span> objItem\r\n                 .setProduct(objProduct)\r\n                 .setDelivery(objSpecifiedDelivery)\r\n             End <span style=\"color:blue;\">With<\/span>\r\n             .addItem(objItem)\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Schlie&szlig;lich landet das <b>Trade<\/b>-Objekt im <b>Invoice<\/b>-Objekt, dass als Ergebnis an die aufrufende Routine zur&uuml;ckgegeben wird:<\/p>\n<pre>     objInvoice.setTrade(objTrade)\r\n     Return objInvoice\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>Informationen aus ZUGFeRD-Rechnung einlesen<\/b><\/p>\n<p>Wenn Sie schon die Rechnungsinformationen in einem XML-Dokument erfassen und diese zu einem PDF-Dokument mit der eigentlichen Rechnung hinzuf&uuml;gen, dann sollten Sie solche Informationen auch auslesen k&ouml;nnen.<\/p>\n<p>Das ist schlie&szlig;lich der Sinn von ZUGFeRD. Deshalb schauen wir uns eine weitere Funktion an, mit der Sie die Daten aus einem mit der vorherigen Funktion erstellten Dokument auslesen k&ouml;nnen.<\/p>\n<p>Die Funktion hei&szlig;t <b>ZUGFeRDRechnungExtrahieren <\/b>und erwartet keine Parameter (siehe Listing 2). Diese geben Sie &uuml;ber die Eigenschaften der Klasse der DLL ein.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ZUGFeRDRechnungExtrahieren()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objPDFHandler<span style=\"color:blue;\"> As <\/span>PdfHandler\r\n     <span style=\"color:blue;\">Dim <\/span>objInvoice<span style=\"color:blue;\"> As <\/span>Invoice\r\n     <span style=\"color:blue;\">Dim <\/span>objInputPDF<span style=\"color:blue;\"> As <\/span>InputStream\r\n     <span style=\"color:blue;\">Dim <\/span>objTrade<span style=\"color:blue;\"> As <\/span>Trade, objAgreement<span style=\"color:blue;\"> As <\/span>Agreement\r\n     <span style=\"color:blue;\">Dim <\/span>objBuyer<span style=\"color:blue;\"> As <\/span>TradeParty, objSeller<span style=\"color:blue;\"> As <\/span>TradeParty\r\n     <span style=\"color:blue;\">Dim <\/span>objSettlement<span style=\"color:blue;\"> As <\/span>Settlement, objPaymentmeans<span style=\"color:blue;\"> As <\/span>PaymentMeans\r\n     <span style=\"color:blue;\">Dim <\/span>objMonetarySummation<span style=\"color:blue;\"> As <\/span>MonetarySummation\r\n     <span style=\"color:blue;\">Dim <\/span>objTaxRegistration<span style=\"color:blue;\"> As <\/span>TaxRegistration\r\n     IKVM.Runtime.Startup.addBootClassPathAssembly(GetType(io.konik.zugferd.ObjectFactory).Assembly)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(ZielPDF)) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         Return <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         objInputPDF = <span style=\"color:blue;\">New<\/span> FileInputStream(ZielPDF)\r\n         objPDFHandler = <span style=\"color:blue;\">New<\/span> PdfHandler\r\n         objInvoice = objPDFHandler.extractInvoice(objInputPDF)\r\n         objTrade = objInvoice.getTrade\r\n         objAgreement = objTrade.getAgreement\r\n         objBuyer = objAgreement.getBuyer\r\n         _Kaeufer_Name = objBuyer.getName\r\n         _Kaeufer_Ort = objBuyer.getAddress.getCity\r\n         _Kaeufer_PLZ = objBuyer.getAddress.getPostcode\r\n         _Kaeufer_Strasse = objBuyer.getAddress.getLineOne\r\n         _Kaeufer_Land = objBuyer.getAddress.getCountry\r\n         objTaxRegistration = objBuyer.getTaxRegistrations.get(0)\r\n         _Kaeufer_UstIDNr = objTaxRegistration.getTaxNumber\r\n         objSeller = objAgreement.getSeller\r\n         _Verkaeufer_Name = objSeller.getName\r\n         _Verkaeufer_Ort = objSeller.getAddress.getCity\r\n         _Verkaeufer_PLZ = objSeller.getAddress.getPostcode\r\n         _Verkaeufer_Strasse = objSeller.getAddress.getLineOne\r\n         _Verkaeufer_Land = objSeller.getAddress.getCountry\r\n         objTaxRegistration = objSeller.getTaxRegistrations.get(0)\r\n         _Verkaeufer_UstIDNr = objTaxRegistration.getTaxNumber\r\n         objSettlement = objTrade.getSettlement\r\n         objPaymentmeans = objSettlement.getPaymentMeans.get(0)\r\n         _Verkaeufer_BIC = objPaymentmeans.getPayeeInstitution.getBic\r\n         _Verkaeufer_IBAN = objPaymentmeans.getPayeeAccount.getIban\r\n         _Zahlungsreferenz = objSettlement.getPaymentReference\r\n         objMonetarySummation = objSettlement.getMonetarySummation\r\n         _Nettobetrag = <span style=\"color:blue;\">New<\/span> BigDecimal(objMonetarySummation.getLineTotal.getValue.floatValue)\r\n         _Aufschlaege = <span style=\"color:blue;\">New<\/span> BigDecimal(objMonetarySummation.getChargeTotal.getValue.floatValue)\r\n         _Abschlaege = <span style=\"color:blue;\">New<\/span> BigDecimal(objMonetarySummation.getAllowanceTotal.getValue.floatValue)\r\n         _Mehrwertsteuerbetrag = <span style=\"color:blue;\">New<\/span> BigDecimal(objMonetarySummation.getTaxBasisTotal.getValue.floatValue)\r\n         _Bruttobetrag = <span style=\"color:blue;\">New<\/span> BigDecimal(objMonetarySummation.getGrandTotal.getValue.floatValue)\r\n         Return <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Methode zum Einlesen der Daten einer Rechnung<\/span><\/b><\/p>\n<p>In diesem Fall ist nur die Angabe einer einzigen Eigenschaft n&ouml;tig, n&auml;mlich <b>ZielPDF <\/b>mit der Angabe der PDF-Datei, aus der die XML-Daten ausgelesen werden sollen. In der ersten <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft die Funktion, ob die in <b>ZielPDF <\/b>angegebene PDF-Datei vorhanden ist.<\/p>\n<p>Falls nicht, wird die Funktion mit der R&uuml;ckgabe des Wertes <b>False <\/b>beendet. Anderenfalls beginnt der Hauptteil im <b>Else<\/b>-Zweig der <b>If&#8230;Then<\/b>-Bedingung. Hier wird das Objekt des Typs <b>InputStream <\/b>mit den Daten aus <b>ZielPDF <\/b>gef&uuml;llt.<\/p>\n<p>Ein neues <b>PdfHandler<\/b>-Objekt nutzen wir, um die Methode <b>extractInvoice <\/b>mit dem <b>InputStream<\/b>-Objekt als Parameter auszuf&uuml;hren. Danach legen wir die Objekte an, die Sie bereits vom Erstellen des ZUGFeRD-Dokuments kennen, und nutzen diese, um die gew&uuml;nschten Informationen zu ermitteln.<\/p>\n<p>Das <b>Trade<\/b>-Objekt liefert das <b>Agreement<\/b>-Objekt, mit dem wir wiederum die <b>TradeParty<\/b>-Elemente f&uuml;r den Verk&auml;ufer und den K&auml;ufer holen &#8211; und zwar mit den Methoden <b>getBuyer <\/b>und <b>getSeller<\/b>.<\/p>\n<p><b>objBuyer <\/b>liefert dann &uuml;ber <b>getName <\/b>den Namen des K&auml;ufers. <b>getAddress <\/b>liefert ein Objekt, das weitere Methoden wir <b>getCity<\/b>, <b>getPostCode<\/b>, <b>getLineOne <\/b>(f&uuml;r die Stra&szlig;e) und <b>getCountry <\/b>liefert.<\/p>\n<p>Um die Umsatzsteuer-Identifikationsnummer des K&auml;ufers zu erhalten, referenzieren wir das <b>TaxRegistration<\/b>-Objekt von <b>objBuyer<\/b> mit <b>getTaxRegistrations.get(0)<\/b>. Dieses liefert dann mit <b>getTaxNumber <\/b>die gew&uuml;nschte Information.<\/p>\n<p>Die gleichen Informationen ermitteln wir dann f&uuml;r den K&auml;ufer. Anschlie&szlig;end holen wir aus dem <b>Trade<\/b>-Objekt das <b>Settlement<\/b>-Objekt. Dieses liefert &uuml;ber <b>getPaymentMeans.get(0) <\/b>das <b>PaymentMeans<\/b>-Objekt, welches wiederum &uuml;ber <b>getPayeeInstitution.getBic <\/b>die BIC und &uuml;ber <b>getPayeeAccount.getIban <\/b>die IBAN liefert.<\/p>\n<p>Die Zahlungsreferenz liefert die <b>getPaymentReference<\/b>-Methode des <b>Settlement<\/b>-Objekts. Das gleiche Objekt stellt &uuml;ber <b>getMonetarySummary <\/b>auch die Methoden f&uuml;r den Nettobetrag (<b>getLineTotal<\/b>), Aufschl&auml;ge (<b>getChargeTotal<\/b>), Abschl&auml;ge (<b>getAllowanceTotal<\/b>), Mehrwertsteuerbetrag (<b>getTaxBasisTotal<\/b>) und Bruttobetrag (<b>getGrandTotal<\/b>) bereit.<\/p>\n<p>Hier m&uuml;ssen wir jeweils zus&auml;tlich mit <b>getValue.floatValue <\/b>arbeiten, um Werte zu erhalten, welche die Nachkommastellen ber&uuml;cksichtigen. Schlie&szlig;lich geben wir den Wert True als Funktionswert zur&uuml;ck.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Nach dem Erstellen des Projekts mit <b>Erstellen|Projekt erstellen <\/b>k&ouml;nnen Sie von Access aus auf die DLL zugreifen. Wie das im Detail gelingt, schauen wir uns im zweiten Teil der Beitragsreihe namens <b>ZUGFeRD, Teil 2: DLL in Access nutzen <\/b>an (<b>www.access-im-unternehmen.de\/1232<\/b>).<\/p>\n<p>Eine Erweiterungsm&ouml;glichkeit w&auml;re noch die &Uuml;bergabe mehrerer Positionen, aber wir k&ouml;nnen in dieser Version ohnehin nur die Namen und Menge der Produkte angeben, nicht jedoch einzelne Preise oder Mehrwertsteuerbetr&auml;ge.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>ZuGFeRD.zip<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/53ED68AE-546A-4D4A-85C3-AE245DA6A2F7\/aiu_1231.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>ZUGFeRD ist das Akronym f&uuml;r &#8222;Zentraler User Guide des Forums elektronische Rechnung Deutschland&#8220;. Au&szlig;erdem ist es ein elektronisches Rechnungsdatenformat f&uuml;r den Austauschen von Rechnungen und damit ein L&ouml;sungsansatz f&uuml;r die Frage, wie man die Daten einer Rechnung auf einfache Weise f&uuml;r die Durchf&uuml;hrung der &Uuml;berweisung des berechneten Betrags verarbeiten kann. Genau genommen nutzt man hier eine Kombination aus einem auf spezielle Weise hergestellten PDF-Dokuments und eines XML-Dokuments, das die in der Rechnung enthaltenen Daten einmal optimiert f&uuml;r das menschliche Auge und einmal optimiert f&uuml;r die Datenverarbeitung enth&auml;lt. In diesem ersten Teil einer kleinen Beitragsreihe zeigen wir, wie Sie die Open Source-Bibliothek von Konik in einer .NET-L&ouml;sung nutzen, um daraus eine DLL f&uuml;r den Zugriff auf Access heraus zu erstellen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022020,662020,44000027],"tags":[],"class_list":["post-55001231","post","type-post","status-publish","format-standard","hentry","category-66022020","category-662020","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET\" \/>\n<meta property=\"og:description\" content=\"ZUGFeRD ist das Akronym f&uuml;r &quot;Zentraler User Guide des Forums elektronische Rechnung Deutschland&quot;. Au&szlig;erdem ist es ein elektronisches Rechnungsdatenformat f&uuml;r den Austauschen von Rechnungen und damit ein L&ouml;sungsansatz f&uuml;r die Frage, wie man die Daten einer Rechnung auf einfache Weise f&uuml;r die Durchf&uuml;hrung der &Uuml;berweisung des berechneten Betrags verarbeiten kann. Genau genommen nutzt man hier eine Kombination aus einem auf spezielle Weise hergestellten PDF-Dokuments und eines XML-Dokuments, das die in der Rechnung enthaltenen Daten einmal optimiert f&uuml;r das menschliche Auge und einmal optimiert f&uuml;r die Datenverarbeitung enth&auml;lt. In diesem ersten Teil einer kleinen Beitragsreihe zeigen wir, wie Sie die Open Source-Bibliothek von Konik in einer .NET-L&ouml;sung nutzen, um daraus eine DLL f&uuml;r den Zugriff auf Access heraus zu erstellen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-10T09:40:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/c6347d3dbc53416f9a6114d4822a4180\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET\",\"datePublished\":\"2020-07-10T09:40:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/\"},\"wordCount\":3058,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c6347d3dbc53416f9a6114d4822a4180\",\"articleSection\":[\"2\\\/2020\",\"2020\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/\",\"name\":\"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c6347d3dbc53416f9a6114d4822a4180\",\"datePublished\":\"2020-07-10T09:40:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c6347d3dbc53416f9a6114d4822a4180\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/c6347d3dbc53416f9a6114d4822a4180\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/","og_locale":"de_DE","og_type":"article","og_title":"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET","og_description":"ZUGFeRD ist das Akronym f&uuml;r \"Zentraler User Guide des Forums elektronische Rechnung Deutschland\". Au&szlig;erdem ist es ein elektronisches Rechnungsdatenformat f&uuml;r den Austauschen von Rechnungen und damit ein L&ouml;sungsansatz f&uuml;r die Frage, wie man die Daten einer Rechnung auf einfache Weise f&uuml;r die Durchf&uuml;hrung der &Uuml;berweisung des berechneten Betrags verarbeiten kann. Genau genommen nutzt man hier eine Kombination aus einem auf spezielle Weise hergestellten PDF-Dokuments und eines XML-Dokuments, das die in der Rechnung enthaltenen Daten einmal optimiert f&uuml;r das menschliche Auge und einmal optimiert f&uuml;r die Datenverarbeitung enth&auml;lt. In diesem ersten Teil einer kleinen Beitragsreihe zeigen wir, wie Sie die Open Source-Bibliothek von Konik in einer .NET-L&ouml;sung nutzen, um daraus eine DLL f&uuml;r den Zugriff auf Access heraus zu erstellen.","og_url":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-07-10T09:40:38+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/c6347d3dbc53416f9a6114d4822a4180","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET","datePublished":"2020-07-10T09:40:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/"},"wordCount":3058,"commentCount":2,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/c6347d3dbc53416f9a6114d4822a4180","articleSection":["2\/2020","2020","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/","url":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/","name":"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/c6347d3dbc53416f9a6114d4822a4180","datePublished":"2020-07-10T09:40:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/c6347d3dbc53416f9a6114d4822a4180","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/c6347d3dbc53416f9a6114d4822a4180"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Rechnungen_mit_ZUGFeRD_10_Teil_1_NET\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Rechnungen mit ZUGFeRD 1.0, Teil 1: .NET"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001231"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001231\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}