{"id":55001447,"date":"2023-08-01T00:00:00","date_gmt":"2023-07-31T14:23:33","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1447"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Belege_und_Belegdaten_nach_lexoffice_hochladen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/","title":{"rendered":"Belege und Belegdaten nach lexoffice hochladen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/eee8d762704149ccad1c23375c078d42\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_001.png\" alt=\"Erfassen eines Belegs in lexoffice\" width=\"699,559\" height=\"510,218\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erfassen eines Belegs in lexoffice<\/span><\/b><\/p>\n<p><b>Im Beitrag &#8222;Zugriff auf lexoffice per REST-API und VBA&#8220; (www.access-im-unternehmen.de\/1422) haben wir bereits gezeigt, wie wir in lexoffice Rechnungen auf Basis von Rechnungsdaten aus einer Access-Datenbank erstellen k&ouml;nnen. In manchen F&auml;llen reichen die M&ouml;glichkeiten von lexoffice nicht aus, um die gew&uuml;nschten Rechnungen zu erstellen. Dann kann man lexoffice aber immer noch f&uuml;r die Buchhaltung nutzen. Die Rechnung erstellt man dann in Access statt direkt in lexoffice und &uuml;bertr&auml;gt dann ein PDF-Dokument mit der Rechnung sowie die begleitenden Daten wie den Umsatz, die enthaltenen Steuern und weitere Informationen per Rest API nach lexoffice. Dieser Beitrag zeigt, wie wir dies bewerkstelligen k&ouml;nnen.<\/b><\/p>\n<p>Mit dem Ziel f&uuml;r diesen Beitrag automatisieren wir einen Vorgang, den wir sonst manuell erledigen k&ouml;nnten. Dazu startet man in lexoffice das Erfassen eines neuen Belegs (siehe Bild 1). Hier kann man einen Beleg hochladen. lexoffice versucht dann, die ben&ouml;tigten Informationen f&uuml;r den rechten Bereich automatisch zu ermitteln. Gelingt dies nicht oder nur teilweise, arbeiten wir von Hand nach.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_001.png\" alt=\"Erfassen eines Belegs in lexoffice\" width=\"699,559\" height=\"510,218\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Erfassen eines Belegs in lexoffice<\/span><\/b><\/p>\n<p>Mit der nachfolgend vorgestellten L&ouml;sung wollen wir solche Unw&auml;gbarkeiten verhindern und gleichzeitig die ben&ouml;tigte Zeit minimieren. Statt das PDF manuell in das Formular zu ziehen und abzuwarten, bis lexoffice das Dokument analysiert hat, &uuml;bergeben wir das Dokument samt den ben&ouml;tigten Daten per Webservice. Wir man diesen bedient, haben wir schon ausf&uuml;hrlich in dem oben genannten Beitrag beschrieben.<\/p>\n<p>Wir brauchen also nur auf den dort erw&auml;hnten Techniken aufzubauen und diese an die neue Aufgabe anzupassen. Wer schon einmal in der Dokumentation der Rest API st&ouml;bern m&ouml;chte: W&auml;hrend wir im ersten Beitrag Elemente des Typs <b>Invoice <\/b>erstellt haben (Rechnung), geht es nun um das Hochladen von Elementen des Typs <b>Voucher <\/b>(Beleg). Beide verwenden ein <b>Contact<\/b>-Element, das je nach Anwendungszweck als Debitor oder Kreditor verwendet wird. Da wir im ersten Teil bereits die Techniken zum Hochladen von Kundendaten in Form eines <b>Contact<\/b>-Elements erledigt haben, brauchen wir uns auch darauf nicht mehr zu konzentrieren, sondern k&ouml;nnen uns dem Upload von Elementen des Typs <b>Voucher <\/b>k&uuml;mmern.<\/p>\n<h2>Datenmodell f&uuml;r Belege<\/h2>\n<p>F&uuml;r das Erfassen eines Belegs ben&ouml;tigen wir mehr Daten als f&uuml;r das Erstellen von Rechnungen. In Bild 2 sehen wir alle ben&ouml;tigten Tabellen. Die Tabelle <b>tblContacts <\/b>kennen wir bereits aus dem oben genannten Beitrag. Jedem Voucher aus der Tabelle <b>tblVouchers <\/b>weisen wir genau einen Kontakt zu, der je nach der Art der Positionen des Belegs Kreditor oder Debitor ist. Damit kommen wir gleich zur Tabelle <b>tblVouchers<\/b>, welche die grundlegenden Informationen zum Beleg enth&auml;lt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_002.png\" alt=\"Datenmodell der Beispieldatenbank\" width=\"699,559\" height=\"473,9534\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Datenmodell der Beispieldatenbank<\/span><\/b><\/p>\n<h2>Belegtyp<\/h2>\n<p>Dazu geh&ouml;rt der Typ des Belegs. Diese haben wir in einer eigenen Lookuptabelle namens <b>tblVoucherTypes <\/b>abgelegt (siehe Bild 3). Diese enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld ein Feld  namens <b>VoucherType<\/b>, das die Beschreibung enth&auml;lt, die wir in die JSON-Datei mit den Informationen zum Erfassen des Belegs schreiben. Ein weiteres Feld namens <b>VoucherTypeGerman <\/b>enth&auml;lt den Wert, den wir im Formular zur Auswahl des Belegtyps anbieten wollen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_003.png\" alt=\"Belegtypen\" width=\"424,5589\" height=\"182,2222\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Belegtypen<\/span><\/b><\/p>\n<h2>Belegstatus<\/h2>\n<p>Ein weiteres Feld namens <b>VoucherStatusID <\/b>dient dazu, den Status des Belegs zu &uuml;bermitteln. Auch daf&uuml;r haben wir eine Lookuptabelle angelegt. Diese hei&szlig;t <b>tblVoucherStatus <\/b>und enth&auml;lt ebenfalls ein Feld f&uuml;r die Angabe des Wertes f&uuml;r die JSON-Datei und eines f&uuml;r die deutsche Version des Wertes. Diese Tabelle enth&auml;lt die Werte aus Bild 4.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_004.png\" alt=\"Tabelle mit den verschiedenen Belegstatus\" width=\"424,5589\" height=\"214,6225\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Tabelle mit den verschiedenen Belegstatus<\/span><\/b><\/p>\n<h2>Steuertyp<\/h2>\n<p>Die n&auml;chste Lookuptabelle namens <b>tblTaxTypes <\/b>liefert die Werte f&uuml;r das Feld <b>TaxTypeID<\/b>. Hier legen wir fest, ob wir in den Belegpositionen die Netto- oder die Bruttowerte angeben (siehe Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_005.png\" alt=\"Tabelle mit den Steuertypen\" width=\"424,5589\" height=\"140,0424\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Tabelle mit den Steuertypen<\/span><\/b><\/p>\n<h2>Fremdschl&uuml;sselfelder der Tabelle tblVoucher<\/h2>\n<p>Die Felder <b>VoucherTypeID<\/b>, <b>VoucherStatusID <\/b>und <b>TaxTypeID <\/b>der Tabelle <b>tblVoucher <\/b>richten wir jeweils als Nachschlagefelder mit den zuvor vorgestellten Tabellen als Datensatzherkunft ein. Dabei geben wir als anzuzeigendes Feld jeweils das Feld mit der deutschen Bezeichnung der jeweiligen Werte an.<\/p>\n<h2>Weitere Felder der Tabelle tblVoucher<\/h2>\n<p>Au&szlig;erdem enth&auml;lt die Tabelle noch Felder zum Speichern der Rechnungsnummer (<b>VoucherID<\/b>), das Rechnungsdatum (<b>VoucherDate<\/b>), das Versanddatum (<b>ShippingDate<\/b>) und das F&auml;lligkeitsdatum (<b>DueDate<\/b>). Au&szlig;erdem enth&auml;lt die Tabelle die Bruttosumme (<b>TotalGrossAmount<\/b>) und die Summe der Mehrwertsteuer (<b>TotalTaxAmount<\/b>).<\/p>\n<p>Die n&auml;chsten beiden Felder <b>UseCollectiveContact <\/b>und <b>ContactID <\/b>geben an, ob wir als Lieferant oder Kunde den Wert <b>Sammelkunde <\/b>angeben wollen oder einen bereits gespeicherten Kontakt. Mit <b>Remark <\/b>geben wir einen Bemerkungstext an und mit <b>Filename <\/b>den Namen des Belegs, beispielsweise in Form einer PDF-Datei. <\/p>\n<p>Die &uuml;brigen Felder haben folgenden Nutzen:<\/p>\n<ul>\n<li><b>LexOfficeID<\/b>: Speichert die ID, unter welcher der Beleg in lexoffice angelegt wurde.<\/li>\n<li><b>LexOfficeRequest<\/b>: Speichert den Request, den wir zum Anlegen des Belegs an lexoffice geschickt haben.<\/li>\n<li><b>LexOfficeResponse<\/b>: Speichert die Antwort von lexoffice auf diese Anfrage.<\/li>\n<\/ul>\n<h2>Belegpositionen<\/h2>\n<p>Im Gegensatz zu einer Rechnung, die verschiedene Positionen mit den zu bezahlenden Produkten oder Leistungen enth&auml;lt, tragen wir f&uuml;r einen Beleg Zusammenfassungen von Betr&auml;gen mit bestimmten Mehrwertsteuers&auml;tzen und Buchungskategorien ein. Diese werden jedoch &auml;hnlich wie die Rechnungspositionen in einer eigenen Tabelle gespeichert, wobei jede Belegposition ebenfalls mit einem Datensatz aus der Belegtabelle, hier <b>tblVouchers<\/b>, verkn&uuml;pft.<\/p>\n<p>Die Tabelle zum Speichern dieser Daten hei&szlig;t <b>tblVoucherItems <\/b>und sieht mit einigen Beispieldaten wie in Bild 6 aus. Neben dem Prim&auml;rschl&uuml;sselfeld enth&auml;lt sie ein Fremdschl&uuml;sselfeld, &uuml;ber das die Positionen mit einem der Belege aus der Tabelle <b>tblVouchers <\/b>verkn&uuml;pft werden. In dieser Tabelle speichern wir den Betrag der Position (<b>Amount<\/b>), die Mehrwertsteuer zu dieser Position (<b>TaxAmount<\/b>) und den Steuersatz (<b>TaxRatePercentage<\/b>).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_006.png\" alt=\"Tabelle mit den Positionen eines Belegs\" width=\"524,559\" height=\"174,2943\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Tabelle mit den Positionen eines Belegs<\/span><\/b><\/p>\n<p>Hier ist anzumerken, dass das Feld <b>Amount<\/b> sowohl den Netto- als auch den Bruttobetrag enthalten kann. Welcher eingetragen werden muss, h&auml;ngt davon ab, welchen Wert das Feld <b>TaxTypeID <\/b>der Tabelle <b>tblVouchers <\/b>f&uuml;r diesen Beleg aufweist &#8211; mehr dazu weiter unten in der Beschreibung der Formulare.<\/p>\n<h2>Belegkategorien<\/h2>\n<p>lexoffice bietet eine ganze Reihe von Kategorien an, welche im Grunde Vereinfachungen f&uuml;r die &uuml;blicherweise verwendeten Buchungskonten sind (zum Beispiel 8300 f&uuml;r Erl&ouml;se mit 7% Mehrwertsteuer). Diese weisen wir einer Belegposition &uuml;ber das Fremdschl&uuml;sselfeld <b>CategoryID <\/b>zu, das wir als Nachschlagefeld auslegen. Dieses Feld ist mit der Tabelle <b>tblCategories <\/b>verkn&uuml;pft. Diese Tabelle sieht wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_007.png\" alt=\"Eintr&auml;ge der Tabelle tblCategories\" width=\"700\" height=\"281,9169\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Eintr&auml;ge der Tabelle tblCategories<\/span><\/b><\/p>\n<p>Diese Tabelle haben wir nicht von Hand gef&uuml;llt, sondern wir haben die Daten per Rest API von lexoffice eingelesen. Und das wird auch unsere Programmier&uuml;bung zum Aufw&auml;rmen.<\/p>\n<h2>Kategorien von lexoffice einlesen<\/h2>\n<p>Die Kategorien k&ouml;nnen wir automatisiert von lexoffice einlesen. Dazu nutzen wir die Prozedur aus Listing 1. Die Prozedur hei&szlig;t <b>GetCategories <\/b>und sie verwendet den folgenden Endpunkt der Rest API von lexoffice:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>GetCategories()\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>i<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCategoryGUID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCategory<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strType<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strContactRequired<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSplitAllowed<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strGroupName<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     strURL = \"https:\/\/api.lexoffice.io\/v1\/posting-categories\"\r\n     <span style=\"color:blue;\">If <\/span>Request(strURL, \"GET\", strRequest, strResponse, \"\", \"\", 0) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strResponse)\r\n         db.Execute \"DELETE FROM tblCategories\", dbFailOnError\r\n         For i = 1 To objJSON.Count\r\n             strCategoryGUID = objJSON.Item(i).Item(\"id\")\r\n             strCategory = objJSON.Item(i).Item(\"name\")\r\n             strType = objJSON.Item(i).Item(\"type\")\r\n             strContactRequired = IIf(objJSON.Item(i).Item(\"contactRequired\") = \"Wahr\", -1, 0)\r\n             strSplitAllowed = IIf(objJSON.Item(i).Item(\"splitAllowed\") = \"Wahr\", -1, 0)\r\n             strGroupName = objJSON.Item(i).Item(\"groupName\")\r\n             db.Execute \"INSERT INTO tblCategories(CategoryGUID, Category, Type, ContactRequired, SplitAllowed, \" _\r\n                 & \"GroupName) VALUES(''\" & strCategoryGUID & \"'', ''\" & strCategory & \"'', ''\" & strType & \"'', \" _\r\n                 & strContactRequired & \", \" & strSplitAllowed & \", ''\" & strGroupName & \"'')\", dbFailOnError\r\n         <span style=\"color:blue;\">Next<\/span> i\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Diese Prozedur liest die Kategorien von lexoffice ein.<\/span><\/b><\/p>\n<pre>https:\/\/api.lexoffice.io\/v1\/posting-categories<\/pre>\n<p>Dies liefert ohne weitere Angaben alle Kategorien zur&uuml;ck. Dazu rufen wir die Funktion <b>Request <\/b>auf, die wir bereits im oben erw&auml;hnten Beitrag ausf&uuml;hrlich beschrieben haben  Diese Funktion f&uuml;hrt den eigentliche Request aus und liefert mit dem Parameter <b>strResponse <\/b>das Ergebnis zur&uuml;ck. Mit der Funktion <b>ParseJson<\/b>, die wir im Beitrag <b>JSON-Daten auslesen <\/b>(<b>www.access-im-unternehmen.de\/1403<\/b>) beschrieben haben, &uuml;bertragen wir die Inhalte des JSON-Dokuments in eine f&uuml;r uns besser verarbeitbare Form.<\/p>\n<p>Bevor wir diese verarbeiten, l&ouml;schen wir alle vorhandenen Eintr&auml;ge der Tabelle <b>tblCategories<\/b>. Anschlie&szlig;end durchlaufen wir bereits in einer <b>For&#8230;Next<\/b>-Schleife alle Elemente des Objekts <b>objJSON<\/b>. Darin legen wir jeweils einen neuen Datensatz in der Tabelle <b>tblCategories<\/b> an, wobei wir die Informationen zuvor &uuml;ber das in <b>objJSON <\/b>geschaffene Objektmodell auslesen.<\/p>\n<p>Die Grundlagen daf&uuml;r beschreiben wir ebenfalls im Beitrag <b>JSON-Daten auslesen <\/b>(<b>www.access-im-unternehmen.de\/1403<\/b>).<\/p>\n<h2>Formulare zur Eingabe der Belege und Belegpositionen<\/h2>\n<p>Bevor wir die Prozeduren zum &Uuml;bertragen von Belegen an lexoffice erstellen, wollen wir ein Formular schaffen, mit dem wir die zu &uuml;bertragenden Daten komfortabel eingeben k&ouml;nnen. Dazu erstellen wir zun&auml;chst ein Unterformular namens <b>sfmVouchers<\/b>. Diesem weisen wir &uuml;ber die Eigenschaft <b>Datensatzquelle <\/b>die Tabelle <b>tblVoucherItems <\/b>zu und ziehen die Felder <b>CategoryID<\/b>, <b>Amount<\/b>, <b>TaxAmount <\/b>und <b>TaxRatePercent <\/b>in den Detailbereich. Au&szlig;erdem stellen wir die Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>ein (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_008.png\" alt=\"Das Unterformular sfmVouchers\" width=\"424,5589\" height=\"179,0071\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Das Unterformular sfmVouchers<\/span><\/b><\/p>\n<p>Das Hauptformular <b>frmVouchers <\/b>soll die Tabelle <b>tblVouchers <\/b>als Datensatzquelle verwenden. Aus dieser ziehen wir alle Felder in den oberen Bereich des Formulars und ordnen diese wie in Bild 9 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_009.png\" alt=\"Das Formular frmVouchers\" width=\"649,559\" height=\"513,458\" \/><\/p>\n<p>[<\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Das Formular frmVouchers<\/span><\/b><\/p>\n<p>Darunter ziehen wir das Unterformular <b>sfmVouchers <\/b>hinein. F&uuml;r das Unterformular-Steuerelemente sollte Access nun automatisch die beiden Eigenschaften Verkn&uuml;pfen von und Verkn&uuml;pfen nach mit dem Feld <b>VoucherID <\/b>f&uuml;llen.<\/p>\n<p>Auf diese Weise zeigt das Unterformular nur die zu dem jeweiligen Beleg angelegten Belegpositionen an.<\/p>\n<p>Die beiden Felder <b>TotalGrossAmount <\/b>und <b>TotalTaxAmount <\/b>verschieben wir unter das Unterformular. Au&szlig;erdem f&uuml;gen wir zwei Schaltfl&auml;chen mit der Beschriftung <b>Beleg nach Lexoffice <\/b>und <b>Beleg in Lexoffice anzeigen <\/b>hinzu.<\/p>\n<h2>Hinweis auf die Steuerart<\/h2>\n<p>Mit dem Kombinationsfeld <b>cboTaxTypeID <\/b>k&ouml;nnen wir ausw&auml;hlen, ob die Belegpositionen den Betrag netto oder brutto aufnehmen sollen. Damit dies deutlicher wird, haben wir ein Textfeld namens <b>txtTaxTypeRemark <\/b>angelegt, in dem wir je nach der Auswahl einen entsprechenden Hinweistext anzeigen.<\/p>\n<p>Dieser wird jeweils nach der Auswahl des Eintrags im Kombinationsfeld <b>cboTaxTypeID <\/b>aktualisiert:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cboTaxTypeID_AfterUpdate()\r\n     <span style=\"color:blue;\">If <\/span>Me!TaxTypeID = 1<span style=\"color:blue;\"> Then<\/span>\r\n         Me!txtTaxTypeRemark = _\r\n             \"TaxType Netto: Amount ist der Netto-Betrag.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         Me!txtTaxTypeRemark = _\r\n             \"TaxType Brutto: Amount ist der Brutto-Betrag.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit diese Anzeige auch beim Wechseln des Beleg-Datensatzes aktualisiert wird, rufen wir die entsprechende Prozedur im Ereignis f&uuml;r die Eigenschaft <b>Beim Anzeigen <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     cboTaxTypeID_AfterUpdate\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Datei ausw&auml;hlen<\/h2>\n<p>Das Feld <b>Filename<\/b> enth&auml;lt den Pfad zu der Datei, die als Belegdokument hochgeladen werden soll. Um dem Benutzer die Eingabe zu erleichtern, haben wir rechts daneben eine Schaltfl&auml;che hinzugef&uuml;gt, welche die folgende Prozedur aufruft:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDateiauswahl_Click()\r\n     Me!Filename = mdlTools.DateiOeffnen()\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die hier f&uuml;r die Anzeige eines Dateiauswahl-Dialogs verwendete Funktion haben wir im Modul <b>mdlTools <\/b>hinterlegt. Sie verwendet die <b>FileDialog<\/b>-Klasse der Office-Bibliothek, sodass wir noch einen Verweis auf die Bibliothek <b>Microsoft Office 16.0 Object Library <\/b>hinzuf&uuml;gen m&uuml;ssen. Die Funktion zeigt einen Dateiauswahl-Dialog an, der einen Filter f&uuml;r PDF-Dateien enth&auml;lt und beim &Ouml;ffnen das Verzeichnis der aktuellen Datenbank anzeigt:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DateiOeffnen()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objFiledialog<span style=\"color:blue;\"> As <\/span>Office.FileDialog\r\n     <span style=\"color:blue;\">Set<\/span> objFiledialog = _\r\n         Application.FileDialog(msoFileDialogFilePicker)\r\n     objFiledialog.InitialFileName = _\r\n         CurrentProject.Path & \"\\\"\r\n     objFiledialog.Filters.Clear\r\n     objFiledialog.Filters.Add \"PDF\", \"*.pdf\"\r\n     <span style=\"color:blue;\">If <\/span>objFiledialog.Show = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         DateiOeffnen = objFiledialog.SelectedItems(1)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<h2>Beleg nach lexoffice &uuml;bertragen<\/h2>\n<p>Damit kommen wir zu der Prozedur, die durch einen Klick auf die Schaltfl&auml;che <b>cmdBelegNachLexoffice<\/b> ausgel&ouml;st wird. Den ersten Teil dieser Prozedur finden wir in Listing 2. Hier pr&uuml;fen wir zuerst, ob der Kontakt, den wir diesem Beleg zugeordnet haben, bereits in lexoffice angelegt ist. Die Grundlagen dazu finden Sie im Beitrag <b>Zugriff auf lexoffice per REST-API und VBA<\/b> (<b>www.access-im-unternehmen.de\/1422<\/b>). Dort haben wir einen Aufruf der Rest API beschrieben, mit dem wir einen Kontakt nach lexoffice hochladen k&ouml;nnen. In der aktuellen Prozedur pr&uuml;fen wir lediglich, ob f&uuml;r den Kontakt in der Tabelle <b>tblContacts <\/b>das Feld <b>ContactID <\/b>gef&uuml;llt ist. Dieses enth&auml;lt nach dem Hochladen des Kontakts die GUID des Kontakts bei lexoffice, die wir auch beim Hochladen eines Belegs angeben k&ouml;nnen. Ist diese nicht vorhanden, wird die Prozedur abgebrochen und eine entsprechende Meldung erscheint.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBelegNachLexoffice_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMethod<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As Object<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rstVoucherItems<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strVoucherItems<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFileID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span>Nz(DLookup(\"LexofficeID\", \"tblContacts\", \"ContactID = \" & Me!ContactID), \"\") = \"\"<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Der Kontakt muss erst noch nach Lexoffice &uuml;bertragen werden.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strURL = \"https:\/\/api.lexoffice.io\/v1\/vouchers\"\r\n     strMethod = \"POST\"\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(Nz(Me!Filename, \"\")) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span>UploadPDF(Me!Filename, \"\", strResponse)<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strResponse)\r\n             strFileID = objJSON.Item(\"id\")\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End If    <span style=\"color:blue;\">Set<\/span> rstVoucherItems = Me.sfmVouchers.Form.RecordsetClone\r\n     strRequest = strRequest & \"{\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"type\"\": \"\"\" & DLookup(\"VoucherType\", \"tblVoucherTypes\", \"VoucherTypeID = \" _\r\n         & Me!cboVoucherTypeID) & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"voucherNumber\"\": \"\"\" & Me!VoucherNumber & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"voucherDate\"\": \"\"\" & Format(Me!VoucherDate, \"YYYY-MM-DD\") & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"shippingDate\"\": \"\"\" & Format(Me!ShippingDate, \"YYYY-MM-DD\") & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"dueDate\"\": \"\"\" & Format(Me!DueDAte, \"YYYY-MM-DD\") & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"totalGrossAmount\"\": \"\"\" & <span style=\"color:blue;\">Replace<\/span>(Me!TotalGrossAmount, \",\", \".\") & \"\"\",\" _\r\n         & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"totalTaxAmount\"\": \"\"\" & <span style=\"color:blue;\">Replace<\/span>(Me!TotalTaxAmount, \",\", \".\") & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"taxType\"\": \"\"\" & DLookup(\"TaxType\", \"tblTaxTypes\", \"TaxTypeID = \" & Me!TaxTypeID) _\r\n         & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"  \"\"useCollectiveContact\"\": \"\"\" & IIf(Me!UseCollectiveContact, \"true\", \"false\") _\r\n         & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Me!UseCollectiveContact<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"  \"\"contactId\"\": \"\"\" & DLookup(\"LexOfficeID\", \"tblContacts\", \"ContactID = \" _\r\n             & Me!ContactID) & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strRequest = strRequest & \"  \"\"remark\"\": \"\"\" & Me.Remark & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strFileID) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strRequest = strRequest & \"    \"\"files\"\": [\"\"\" & strFileID & \"\"\"],\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ...<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: &Uuml;bertragen eines Belegs nach lexoffice, Teil 1<\/span><\/b><\/p>\n<h2>URL, Methode und Upload des Belegs<\/h2>\n<p>Die folgenden beiden Zeilen tragen die URL der Methode, hier mit der Endung <b>vouchers <\/b>und der Methode <b>POST<\/b>, in die entsprechenden Variablen ein, die wir sp&auml;ter an die <b>Request<\/b>-Funktion &uuml;bergeben.<\/p>\n<p>Au&szlig;erdem pr&uuml;ft die Prozedur hier, ob f&uuml;r das Feld <b>Filename <\/b>der Dateiname des hochzuladenden Belegs angegeben wurde. Dieser wurde beispielsweise zuvor als Bericht in Access erstellt und unter dem gew&uuml;nschten Dateinamen als PDF gespeichert.<\/p>\n<p>Ist das Feld <b>Filename <\/b>gef&uuml;llt, wird die Datei durch den Aufruf der Funktion <b>UploadPDF <\/b>nach lexoffice hochgeladen. Diese Funktion beschreiben wir weiter unten. Lautet das Funktionsergebnis auf <b>True<\/b>, liefert <b>strResponse <\/b>die Antwort im JSON-Format. Diese enth&auml;lt wiederum im Feld <b>id <\/b>eine GUID, die wir in der Variablen <b>strFileID <\/b>speichern. Wir geben diese sp&auml;ter in dem JSON-Dokument an, das wir beim Request beim Anlegen des Belegs in lexoffice &uuml;bergeben.<\/p>\n<h2>Zusammenstellen des JSON-Dokuments f&uuml;r den Requests <\/h2>\n<p>Damit starten wir in den Prozess, der das JSON-Dokument mit den Daten des Belegs zusammenstellt. Das sind die Daten, die lexoffice beim manuellen Hochladen eines Beleg teilweise automatisch per OCR erkennt. Die folgende Methode stellt die Daten jedoch vollst&auml;ndig zusammen.<\/p>\n<p>Dabei f&uuml;llt sie zuerst ein Recordset mit der <b>RecordsetClone<\/b>-Eigenschaft des Unterformulars mit den Belegpositionen. Nach der ersten Zeile mit der &ouml;ffnenden geschweiften Klammer folgt die Angabe des Belegtyps, den wir zun&auml;chst aus dem Feld <b>cboVoucherType<\/b> entnehmen und daf&uuml;r aus der Tabelle <b>tblVoucherTypes <\/b>den Typ entnehmen, der in das JSON-Dokument eingetragen werden soll.<\/p>\n<p>Danach f&uuml;gen wir eine weitere Zeile mit der Belegnummer hinzu, die im Feld <b>voucherNumber <\/b>landet. Das Belegdatum formatieren wir noch um in das Format <b>YYYY-MM-DD<\/b>, bevor wir es dem Attribut <b>voucherDate <\/b>zuweisen. Auf die gleiche Weise gehen wir mit den Werten f&uuml;r die Attribute <b>shippingDate <\/b>und <b>dueDate <\/b>um.<\/p>\n<p>Die Bruttosumme landet im Attribut <b>totalGrossAmount<\/b>, die Steuersumme in <b>totalTaxAmount<\/b>. Bei beiden ersetzen wir zuvor noch ein eventuell als Dezimaltrennzeichen verwendetes Komma durch einen Punkt.<\/p>\n<p>Danach geben wir den Steuertyp an, also Netto oder Brutto. Diesen Wert ermitteln wir per <b>DLookup <\/b>aus dem Feld <b>TaxType <\/b>der Tabelle <b>tblTaxTypes <\/b>und schreiben ihn in das Feld <b>taxType<\/b>.<\/p>\n<p>Anschlie&szlig;end geben wir an, ob es sich um einen Sammelkunden handelt oder hinterlegen f&uuml;r das Attribut <b>contactId <\/b>den Wert der Feldes <b>LexOfficeID <\/b>f&uuml;r den angegebenen Kontakt. Schlie&szlig;lich tragen wir noch eine eventuelle Bemerkung f&uuml;r das Attribut <b>remark <\/b>ein sowie die GUID f&uuml;r die zuvor hochgeladene Datei aus der Variablen <b>strFileID <\/b>in die Liste <b>files<\/b>. Hier k&ouml;nnen wir theoretisch auch mehrere Dateien angeben.<\/p>\n<h2>Belegpositionen eintragen<\/h2>\n<p>Im zweiten Teil der Prozedur aus Listing 3 sehen wir, wie wir die Belegpositionen in einer <b>Do While<\/b>-Schleife &uuml;ber alle Elemente des Recordsets aus <b>rstVoucherItems <\/b>anlegen. Diese landen jeweils in einem durch geschweifte Klammern eingefassten Satz von Attributen in einer neuen Variablen namens <b>strVoucherItems<\/b>, in der wir zun&auml;chst die Daten aller Belegpositionen sammeln. Wir starten mit dem Betrag, der vom Steuerbetrag, dem Steuersatz und der GUID der Kategorie der Position gefolgt wird. Das Element wird durch eine schlie&szlig;ende geschweifte Klammer geschlossen und der Inhalt der Klammern noch mit einem abschlie&szlig;enden Komma versehen.<\/p>\n<pre>     ...\r\n     strRequest = strRequest & \"  \"\"voucherItems\"\": [\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     rstVoucherItems.MoveFirst\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstVoucherItems.EOF\r\n         strVoucherItems = strVoucherItems & \"    {\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strVoucherItems = strVoucherItems & \"      \"\"amount\"\": \"\"\" & <span style=\"color:blue;\">Replace<\/span>(rstVoucherItems!Amount, \",\", \".\") _\r\n             & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strVoucherItems = strVoucherItems & \"      \"\"taxAmount\"\": \"\"\" & <span style=\"color:blue;\">Replace<\/span>(rstVoucherItems!TaxAmount, \",\", \".\") _\r\n             & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strVoucherItems = strVoucherItems & \"      \"\"taxRatePercent\"\": \"\"\" & rstVoucherItems!TaxRatePercent * 100 _\r\n             & \"\"\",\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strVoucherItems = strVoucherItems & \"      \"\"categoryId\"\": \"\"\" & rstVoucherItems!CategoryID & \"\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strVoucherItems = strVoucherItems & \"    },\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         rstVoucherItems.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strVoucherItems) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strVoucherItems = <span style=\"color:blue;\">Left<\/span>(strVoucherItems, <span style=\"color:blue;\">Len<\/span>(strVoucherItems) - 3) & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     strRequest = strRequest & strVoucherItems\r\n     strRequest = strRequest & \"  ]\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"}\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     Inzwischenablage strRequest\r\n     <span style=\"color:blue;\">If <\/span>Request(strURL, strMethod, strRequest, strResponse, \"tblVouchers\", \"VoucherID\", Me!VoucherID) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(strResponse)\r\n         GetJSONDOM strResponse, False, <span style=\"color:blue;\">False<\/span>\r\n         strID = objJSON.Item(\"id\")\r\n         Me!LexOfficeID = strID\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Rechnung angelegt.\" & <span style=\"color:blue;\">vbCrLf<\/span> & \"ID: \" & strID\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Rechnung nicht angelegt. Antwort in Zwischenablage .\"\r\n         Inzwischenablage strResponse\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: &Uuml;bertragen eines Belegs nach lexoffice, Teil 2<\/span><\/b><\/p>\n<p>Nachdem alle Elemente durchlaufen wurden, pr&uuml;fen wir, ob <b>strVoucherItems <\/b>mindestens ein Zeichen enth&auml;lt und entfernen dann das letzte Komma der Auflistung. Den verbleibenden Inhalt von <b>strVoucherItems <\/b>h&auml;ngen wir nun an <b>strVoucher <\/b>an und schlie&szlig;en die noch offenen eckigen und geschweiften Klammern.<\/p>\n<p>Zu Zwecken der Untersuchung eventuell fehlerhafter Requests schreiben wir den Inhalt von <b>strRequest <\/b>in die Zwischenablage, damit wir diesen in eine Anwendung zur Darstellung von JSON-Dateien einf&uuml;gen und dort analysieren k&ouml;nnen.<\/p>\n<p>Schlie&szlig;lich rufen wir die bereits im oben genannten Beitrag genannte Funktion <b>Request <\/b>auf, der wir die URL des Endpunktes der API, die Methode (<b>POST<\/b>) und den Request aus <b>strRequest <\/b>&uuml;bergeben.<\/p>\n<p>Au&szlig;erdem &uuml;bergeben wir den Namen der Tabelle mit den Belegdaten (<b>tblVouchers<\/b>) und das Prim&auml;rschl&uuml;sselfeld und den Wert des zu &uuml;bertragenden Belegs. Dies dient dazu, dass wir das Ergebnis direkt in der <b>Request<\/b>-Funktion in die Tabelle <b>tblVouchers <\/b>eintragen k&ouml;nnen.<\/p>\n<p>War der Aufruf erfolgreich, parsen wir die zur&uuml;ckgelieferte Antwort aus <b>strResponse <\/b>und lesen die ID des neu erstellten Belegs in lexoffice aus. Diesen geben wir per Meldung aus. War der Aufruf nicht erfolgreich, erscheint eine Meldung, dass die Antwort mit einer eventuellen Fehlermeldung zur weiteren Untersuchung in die Zwischenablage geschrieben wurde.<\/p>\n<h2>Hochladen des Belegdokuments<\/h2>\n<p>Neben den Belegdaten haben wir auch noch ein Belegdokument hochgeladen. Die dazu notwendigen Prozeduren beschreiben wir im Folgenden.<\/p>\n<p>Den Start machen wir mit der Funktion <b>UploadPDF<\/b> (siehe Listing 4). Diese nimmt den Pfad der hochzuladenden Datei sowie die bereits von der Funktion <b>Request <\/b>bekannten Parameter entgegen. Als Erstes definieren wir mit <b>strBoundary <\/b>eine Zeichenkette, die wir zur Markierung der Daten der hochzuladenden Datei im Request verwenden. Dann erzeugen wir ein Objekt auf Basis der Klasse <b>XMLHTTP60<\/b> und rufen seine <b>Open<\/b>-Methode auf, der wir die URL und die Methode &uuml;bergeben (hier <b>POST<\/b>).<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>UploadPDF(strPath<span style=\"color:blue;\"> As String<\/span>, strRequest<span style=\"color:blue;\"> As String<\/span>, strResponse<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> strTabelle<span style=\"color:blue;\"> As String<\/span>, _\r\n        <span style=\"color:blue;\">Optional<\/span> strPK<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> lngID<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Dim <\/span>strBoundary<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMessage<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>objJSON<span style=\"color:blue;\"> As Object<\/span>\r\n     strBoundary = \"--1234567890\"\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">With<\/span> objXMLHTTP\r\n         .Open \"POST\", \"https:\/\/api.lexoffice.io\/v1\/files\", <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"multipart\/form-data; boundary=\" & strBoundary\r\n         .setRequestHeader \"Authorization\", \"Bearer \" + cstrAPIKey\r\n         .setRequestHeader \"Accept\", \"application\/json\"\r\n         .send CreateBody(strPath, strBoundary)\r\n         <span style=\"color:blue;\">Select Case <\/span>.status\r\n             <span style=\"color:blue;\">Case <\/span>200, 201, 202\r\n                 strResponse = .responseText\r\n                 UploadPDF = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strTabelle) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(.responseText) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                         <span style=\"color:blue;\">Set<\/span> objJSON = ParseJson(.responseText)\r\n                         strMessage = objJSON.Item(\"message\")\r\n                     <span style=\"color:blue;\">Else<\/span>\r\n                         strMessage = .status\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n                     db.Execute \"UPDATE \" & strTabelle & \" SET LexOfficeRequest = ''\" & <span style=\"color:blue;\">Replace<\/span>(strRequest, \"''\", \"''''\") _\r\n                         & \"'', LexOfficeResponse = ''\" & strMessage & \"'' WHERE \" & strPK & \" = \" & lngID, _\r\n                         dbFailOnError + dbSeeChanges\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     DoEvents\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: &Uuml;bertragen der Belegdatei nach lexoffice<\/span><\/b><\/p>\n<p>Dann stellen wir im Header <b>Content-Type <\/b>des Requests ein, dass wir einen durch den Wert aus <b>strBoundary <\/b>markierten Inhalt &uuml;bergeben. Der Header <b>Authorization <\/b>erh&auml;lt wieder den API-Key zur Anmeldung an den Webservice. Schlie&szlig;lich senden wir den zuvor mit der Funktion <b>CreateBody <\/b>zusammengestellten Inhalt (siehe unten) mit der <b>send<\/b>-Methode. Das Ergebnis ist ein Zahlenwert, den wir in einer <b>Select Case<\/b>-Bedingung auswerten. Im Falle einer erfolgreichen &Uuml;bertragung, welche beispielsweise die Werte <b>200<\/b>, <b>201 <\/b>oder <b>202 <\/b>nach sich zieht, gibt die Funktion die Antwort mit dem Parameter strResponse zur&uuml;ck. <\/p>\n<p>Anderenfalls wird <b>False <\/b>als Ergebnis zur&uuml;ckgeliefert und <b>Request <\/b>und <b>Response <\/b>werden in der Tabelle <b>tblVouchers <\/b>gespeichert.<\/p>\n<h2>Zusammenstellen des zu &uuml;bermittelnden Body<\/h2>\n<p>Die Funktion <b>CreateBody<\/b> nimmt den Pfad zu der zu &uuml;bermittelnden Datei und den Wert der Boundary-Zeichenkette als Parameter entgegen und liefert ein Byte-Array zur&uuml;ck. Sie stellt den Body zusammen aus der Boundary, einigen Metadaten, darunter dem Dateinamen, sowie der bin&auml;ren Darstellung der Datei, und liefert diese an die aufrufende Prozedur zur&uuml;ck (siehe Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>CreateBody(strPath<span style=\"color:blue;\"> As String<\/span>, strBoundary<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Byte<\/span>()\r\n     <span style=\"color:blue;\">Dim <\/span>strBody<span style=\"color:blue;\"> As String<\/span>\r\n     strBody = \"--\" & strBoundary & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"Content-Disposition: form-data; name=\"\"file\"\"; filename=\"\"\" _\r\n         & Mid$(strPath, <span style=\"color:blue;\">InStrRev<\/span>(strPath, \"\\\") + 1) & \"\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"Content-Type: application\/pdf\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & ReadBinaryFile(strPath) & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"--\" & strBoundary & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"Content-Disposition: form-data; name=\"\"type\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"voucher\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strBody = strBody & \"--\" & strBoundary & \"--\"\r\n     CreateBody = StrConv(strBody, vbFromUnicode)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Zusammenstellen des Body zum &Uuml;bermitteln der Datei<\/span><\/b><\/p>\n<p>Dabei nutzt diese Funktion noch eine weitere Funktion namens <b>ReadBinaryFile<\/b>, welche den Pfad zu der zu codierenden Datei entgegennimmt und die enthaltenen Daten in ein Byte-Array umwandelt (siehe Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>ReadBinaryFile(strPath<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intFile<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bytBuffer()<span style=\"color:blue;\"> As Byte<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFileData<span style=\"color:blue;\"> As String<\/span>\r\n     intFile = FreeFile\r\n     Open strPath For Binary Access Read<span style=\"color:blue;\"> As <\/span>intFile\r\n     <span style=\"color:blue;\">If <\/span>LOF(intFile) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         ReDim bytBuffer(0 To LOF(intFile) - 1)<span style=\"color:blue;\"> As Byte<\/span>\r\n         Get intFile, , bytBuffer\r\n         strFileData = StrConv(bytBuffer, vbUnicode)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Close intFile\r\n     ReadBinaryFile = strFileData\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Umwandeln der Datei in ein Byte-Array<\/span><\/b><\/p>\n<h2>Beleg auf lexoffice einsehen<\/h2>\n<p>Genau wir bei den Rechnungen haben wir auch dem Formular zum &Uuml;bertragen der Belege eine Schaltfl&auml;che hinzugef&uuml;gt, mit der wir den Beleg direkt auf lexoffice.de anzeigen k&ouml;nnen. Diese l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdBelegInLexofficeAnzeigen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     strURL = \"https:\/\/app.lexoffice.de\/vouchers#!\/ VoucherView\/SalesInvoice\/\" & Me!LexOfficeID\r\n     FollowHyperlink strURL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Nach dem Aufruf erscheint der Beleg wie in Bild 10 im Webbrowser.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2023_04\/pic_1447_010.png\" alt=\"Ein per VBA an lexoffice gesendeter Beleg\" width=\"700\" height=\"588,0552\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Ein per VBA an lexoffice gesendeter Beleg<\/span><\/b><\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Dieser Beitrag zeigt, wie Sie bereits fertiggestellte Belege inklusive Detaildaten zu einem Beleg nach lexoffice hochladen k&ouml;nnen. Dabei k&ouml;nnen Sie alle Daten angeben, die Sie in lexoffice sonst von Hand eigeben w&uuml;rden oder die nach dem manuellen Hochladen eines Belegs mehr oder weniger automatisch erkannt werden.<\/p>\n<p>Wir haben das Datenmodell und das Formular recht einfach gehalten und deshalb auch keine automatische Berechnung von Betr&auml;gen und Steuern vorgenommen &#8211; auch die Summen f&uuml;r einen Beleg pr&uuml;fen wir nicht. Wir gehen aber ohnehin davon aus, dass solche Daten aus bestehenden Tabellen eingelesen werden, die bereits die korrekten Daten enthalten.<\/p>\n<h2>Downloads zu diesem Beitrag<\/h2>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>AccessUndLexoffice.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/2805F5FB-C3A2-4808-8BE5-564D41105C10\/aiu_1447.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Zugriff auf lexoffice per REST-API und VBA&#8220; (www.access-im-unternehmen.de\/1422) haben wir bereits gezeigt, wie wir in lexoffice Rechnungen auf Basis von Rechnungsdaten aus einer Access-Datenbank erstellen k&ouml;nnen. In manchen F&auml;llen reichen die M&ouml;glichkeiten von lexoffice nicht aus, um die gew&uuml;nschten Rechnungen zu erstellen. Dann kann man lexoffice aber immer noch f&uuml;r die Buchhaltung nutzen. Die Rechnung erstellt man dann in Access statt direkt in lexoffice und &uuml;bertr&auml;gt dann ein PDF-Dokument mit der Rechnung sowie die begleitenden Daten wie den Umsatz, die enthaltenen Steuern und weitere Informationen per Rest API nach lexoffice. Dieser Beitrag zeigt, wie wir dies bewerkstelligen k&ouml;nnen.<\/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":[662023,66042023,44000027],"tags":[],"class_list":["post-55001447","post","type-post","status-publish","format-standard","hentry","category-662023","category-66042023","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Belege und Belegdaten nach lexoffice hochladen - 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\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Belege und Belegdaten nach lexoffice hochladen\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Zugriff auf lexoffice per REST-API und VBA&quot; (www.access-im-unternehmen.de\/1422) haben wir bereits gezeigt, wie wir in lexoffice Rechnungen auf Basis von Rechnungsdaten aus einer Access-Datenbank erstellen k&ouml;nnen. In manchen F&auml;llen reichen die M&ouml;glichkeiten von lexoffice nicht aus, um die gew&uuml;nschten Rechnungen zu erstellen. Dann kann man lexoffice aber immer noch f&uuml;r die Buchhaltung nutzen. Die Rechnung erstellt man dann in Access statt direkt in lexoffice und &uuml;bertr&auml;gt dann ein PDF-Dokument mit der Rechnung sowie die begleitenden Daten wie den Umsatz, die enthaltenen Steuern und weitere Informationen per Rest API nach lexoffice. Dieser Beitrag zeigt, wie wir dies bewerkstelligen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-31T14:23:33+00:00\" \/>\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\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Belege und Belegdaten nach lexoffice hochladen\",\"datePublished\":\"2023-07-31T14:23:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/\"},\"wordCount\":3194,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/eee8d762704149ccad1c23375c078d42\",\"articleSection\":[\"2023\",\"4\\\/2023\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/\",\"name\":\"Belege und Belegdaten nach lexoffice hochladen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/eee8d762704149ccad1c23375c078d42\",\"datePublished\":\"2023-07-31T14:23:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/eee8d762704149ccad1c23375c078d42\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/eee8d762704149ccad1c23375c078d42\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Belege_und_Belegdaten_nach_lexoffice_hochladen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Belege und Belegdaten nach lexoffice hochladen\"}]},{\"@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":"Belege und Belegdaten nach lexoffice hochladen - 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\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/","og_locale":"de_DE","og_type":"article","og_title":"Belege und Belegdaten nach lexoffice hochladen","og_description":"Im Beitrag \"Zugriff auf lexoffice per REST-API und VBA\" (www.access-im-unternehmen.de\/1422) haben wir bereits gezeigt, wie wir in lexoffice Rechnungen auf Basis von Rechnungsdaten aus einer Access-Datenbank erstellen k&ouml;nnen. In manchen F&auml;llen reichen die M&ouml;glichkeiten von lexoffice nicht aus, um die gew&uuml;nschten Rechnungen zu erstellen. Dann kann man lexoffice aber immer noch f&uuml;r die Buchhaltung nutzen. Die Rechnung erstellt man dann in Access statt direkt in lexoffice und &uuml;bertr&auml;gt dann ein PDF-Dokument mit der Rechnung sowie die begleitenden Daten wie den Umsatz, die enthaltenen Steuern und weitere Informationen per Rest API nach lexoffice. Dieser Beitrag zeigt, wie wir dies bewerkstelligen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/","og_site_name":"Access im Unternehmen","article_published_time":"2023-07-31T14:23:33+00:00","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\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Belege und Belegdaten nach lexoffice hochladen","datePublished":"2023-07-31T14:23:33+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/"},"wordCount":3194,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/eee8d762704149ccad1c23375c078d42","articleSection":["2023","4\/2023","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/","url":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/","name":"Belege und Belegdaten nach lexoffice hochladen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/eee8d762704149ccad1c23375c078d42","datePublished":"2023-07-31T14:23:33+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/eee8d762704149ccad1c23375c078d42","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/eee8d762704149ccad1c23375c078d42"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Belege_und_Belegdaten_nach_lexoffice_hochladen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Belege und Belegdaten nach lexoffice hochladen"}]},{"@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\/55001447","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=55001447"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001447\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}