{"id":55000992,"date":"2015-08-01T00:00:00","date_gmt":"2020-05-22T19:21:46","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=992"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Klasse_fuer_DHLIntrashipCSVDateien","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/","title":{"rendered":"Klasse f&uuml;r DHL-Intraship-CSV-Dateien"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/057ad04beabb47d1967047b85be3666c\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Die CSV-Dateien, die f&uuml;r die Einreichung bei DHL f&uuml;r die Erstellung von Versandetiketten gefordert werden, sind erstens sehr umfangreich und zweitens auch noch komplex. Diese einfach per Code zusammenzusetzen mag auf den ersten Blick schnell gehen, aber was geschieht, wenn sp&auml;ter einmal &auml;nderungen n&ouml;tig sind Um die Programmierung des Exports einer CSV-Datei f&uuml;r DHL-Intraship zu vereinfachen, erstellen wir in diesem Beitrag einige Klassen, mit denen das Zusammenstellen der CSV-Dateien zum Kinderspiel wird.<\/b><\/p>\n<p>Im Beitrag <b>Versandetiketten mit DHL-IntraShip <\/b>(<b>www.access-im-unternehmen.de\/991<\/b>) zeigen wir, wie Sie eine CSV-Datei mit den Versandinformationen an die Webseite von DHL\/IntraShip &uuml;bergeben und damit entsprechende Versandetiketten erhalten. Dabei setzen Sie dort einen Satz von Klassen ein, welcher die einfache Erstellung der CSV-Datei erm&ouml;glicht. Den Aufbau und die Erstellung dieser Klassen m&ouml;chten wir im vorliegenden Beitrag erl&auml;utern.<\/p>\n<h2>Ausgangsmaterial: PDF-Dokument mit CSV-Beschreibung<\/h2>\n<p>Grundlage f&uuml;r die Erstellung der Klasse ist ein PDF-Dokument, das die verschiedenen S&auml;tze beschreibt, die Sie ben&ouml;tigen, um die Informationen zu einer Versendung unterzubringen. Dieses Dokument namens <b>Auftragsimport DD-Shipments  6.1 DE.PDF<\/b>, das Sie als Gesch&auml;ftskunde anfordern k&ouml;nnen (wir k&ouml;nnen es leider nicht zum Download anbieten), ist immerhin 27 Seiten lang. Wir haben davon die f&uuml;r eine Sendung von Deutschland aus an ein Ziel innerhalb Deutschlands oder in ein anderes EU-Land n&ouml;tigen Elemente in Form entsprechender Klassen umgesetzt. Es gibt noch einige weitere Elemente, die beispielsweise zur Erstellung einer ProForma-Rechnung oder der Zollpapiere f&uuml;r den Versand etwa in die Schweiz ben&ouml;tigt werden. Deren Umsetzung beschreibt der vorliegende Beitrag nicht.<\/p>\n<p>Das PDF-Dokument enth&auml;lt die Beschreibung verschiedener Satzarten, von denen einige verpflichtend sind, ein paar andere k&ouml;nnen optional hinzugef&uuml;gt werden. F&uuml;r einen Auftrag ben&ouml;tigen Sie auf jeden Fall eine Zeile der Satzart <b>Sendung<\/b>, die etwa so aussieht &#8211; jede Information ist durch das Pipe-Zeichen von der n&auml;chsten Information getrennt:<\/p>\n<p><b>1234|DPEE-SHIPMENT|EPN|20150629|1.3||||AEMA|||||||||||||||||100|EUR||||||<\/b><\/p>\n<p><b>|01|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||<\/b><\/p>\n<p>Sie enth&auml;lt die grundlegenden Informationen zu der Sendung wie die Sendungsart, das Datum, das Gewicht, den Warenwert oder eine Sendungsreferenz. Au&szlig;erdem enth&auml;lt sie als Erstes eine Zahl, die f&uuml;r alle weiteren S&auml;tze f&uuml;r diese Sendung gleich sein muss. Dementsprechend beginnt die zweite Satzart namens <b>Absender <\/b>auch mit dieser Zahl, enth&auml;lt aber die Absenderinformationen:<\/p>\n<p><b>1234|DPEE-SENDER|6275498028|Andr&eacute; Minhorst Verlag||Andr&eacute; Minhorst|Borkhofer Str.|17||47137|Duisburg|DE||andre@minhorst.com|0123\/4567890|||||||||||||||||||||<\/b><\/p>\n<p>Das Element der Satzart <b>Empf&auml;nger <\/b>enth&auml;lt logischerweise die Adresse und weitere Informationen zum Empf&auml;nger der Sendung:<\/p>\n<p><b>1234|DPEE-RECEIVER|Andr&eacute; Minhorst Verlag||||Herr Klaus M&uuml;ller|Borkhofer Str.|17||47137|Duisburg|DE||klaus@mueller.de||||||||||||||||||<\/b><\/p>\n<p>Danach folgt eine Zeile, welche die Daten f&uuml;r die Satzart <b>Packst&uuml;ck <\/b>aufnimmt (diese Zeile kann, wenn es sich um mehrere Packst&uuml;cke handelt, auch mehrfach vorkommen). Sie sieht so aus:<\/p>\n<p><b>1234|DPEE-ITEM|1.3|||||PK||<\/b><\/p>\n<p>Die letzte von uns in diesem Beitrag behandelte Zeile enth&auml;lt die E-Mail-Adresse des Empf&auml;ngers der Versandbenachrichtigung (Satzart <b>Benachrichtigungen<\/b>).<\/p>\n<p>Auch hier k&ouml;nnen Sie mehrere S&auml;tze der gleichen Art angeben, beispielsweise um sich selbst und dem Empf&auml;nger eine Benachrichtigung zu schicken, die etwa die Nummer f&uuml;r die Sendungsverfolgung enth&auml;lt. Sie ist beispielsweise wie folgt aufgebaut:<\/p>\n<p><b>1234|DPEE-NOTIFICATION||andre@minhorst.com|||<\/b><\/p>\n<h2>Warum Klassen<\/h2>\n<p>Man k&ouml;nnte beispielsweise das erste Element mit den grundlegenden Informationen zur Sendung wie folgt in die CSV-Datei schreiben:<\/p>\n<pre>Print #1, lngKundeID & \"|DPEE-SHIPMENT|\" & strPaketart & \"|\" & Format(Date, \"yyyymmdd\") _\r\n    & \"|\" & <span style=\"color:blue;\">Replace<\/span>(curGewicht, \",\", \".\") & \"||||\" & strKuerzel & \"|||||||||||||||||\" _\r\n    & <span style=\"color:blue;\">Replace<\/span>(curWert, \",\", \".\") _\r\n    & \"|EUR|||||||01|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\"<\/pre>\n<p>Sobald Sie aber mal einen Parameter in der CSV-Datei ben&ouml;tigen, den Sie hier nicht ber&uuml;cksichtigt haben und der irgendwo zwischen dem 80. und 81. Pipe-Zeichen eingef&uuml;gt werden muss, d&uuml;rfen Sie erstmal die Dokumentation suchen, die Zeile anpassen et cetera.<\/p>\n<p>Der Ansatz in der beschriebenen Codezeile ist Teil meines ersten Versuchs, die Erstellung der CSV-Datei zu automatisieren, und funktioniert nat&uuml;rlich gut &#8211; zumindest, bis man dann etwas an der Programmierung &auml;ndern oder, noch schlimmer, den Code anderen Entwicklern zug&auml;nglich machen m&ouml;chte &#8211; also beispielsweise den Lesern dieses Beitrags.<\/p>\n<p>Gerade in letzterem Fall werden doch die unterschiedlichsten Anforderungen zusammentreffen, die sich unm&ouml;glich mit einer einzigen Zeile Code je Element der CSV-Datei erledigen lassen. So ist dann nach einigem Hin und Her die Idee entstanden, ein System von Klassenmodulen aufzusetzen, von denen eines die Hauptschnittstelle zum Erstellen der CSV-Datei bildet und weitere Klassen jeweils eine Zeile der CSV-Datei repr&auml;sentieren.<\/p>\n<h2>CSV erstellen mit Klassen<\/h2>\n<p>Schauen wir uns zun&auml;chst an, wie Sie mit den nachfolgend erl&auml;uterten Klassen die CSV-Datei zusammenstellen k&ouml;nnen. Dies sieht in einem Beispiel f&uuml;r eine einzelne Sendung wie in Listing 1 aus. Keine Sorge: Der Code wird nicht wesentlich l&auml;nger, wenn Sie beispielsweise die CSV-Datei f&uuml;r ein paar hundert Sendungen erstellen wollen &#8211; Sie m&uuml;ssen dann nur hier und da ein paar Schleifen hinzuf&uuml;gen und ein paar feste Zuweisungen durch Verweise auf die jeweiligen Feldinhalt ersetzen.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BeispielDHL()\r\n     <span style=\"color:blue;\">Dim <\/span>objDPEEMain<span style=\"color:blue;\"> As <\/span>clsDPEEMain\r\n     <span style=\"color:blue;\">Set<\/span> objDPEEMain = <span style=\"color:blue;\">New<\/span> clsDPEEMain\r\n     <span style=\"color:blue;\">With<\/span> objDPEEMain\r\n         .Ordnungsnummer = 1234\r\n         <span style=\"color:blue;\">With<\/span> .DPEEShipment\r\n             .Produktcode = eDHLPaket\r\n             .Sendungsdatum = Date\r\n             .Gewicht = 1.3\r\n             .Sendungsreferenz = \"AEMA\"\r\n             .Warenwert = 100\r\n             .WarenwertWaehrung = \"EUR\"\r\n             .Teilnahme = \"01\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> .DPEESender\r\n             .Kundennummer = \"6275498028\"\r\n             .Firmenname1 = \"Andr&eacute; Minhorst Verlag\"\r\n             .Kontaktperson = \"Andr&eacute; Minhorst\"\r\n             .Strasse = \"Borkhofer Str.\"\r\n             .Hausnummer = \"17\"\r\n             .PLZ = \"47137\"\r\n             .Stadt = \"Duisburg\"\r\n             .Laendercode = LaendercodeAusLand(\"Deutschland\")\r\n             .Emailadresse = \"andre@minhorst.com\"\r\n             .Telefonnummer = \"0123\/4567890\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> .DPEEReceiver\r\n             .Firmenname = \"Andr&eacute; Minhorst Verlag\"\r\n             .Firmenname2 = \"\"\r\n             .Kontaktperson = \"Herr Klaus M&uuml;ller\"\r\n             .Strasse = \"Borkhofer Str.\"\r\n             .Hausnummer = \"17\"\r\n             .PLZ = \"47137\"\r\n             .Stadt = \"Duisburg\"\r\n             .Land = LaendercodeAusLand(\"Deutschland\")\r\n             .Emailadresse = \"klaus@mueller.de\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> .AddDPEEItem\r\n             .GewichtDesPackstueckesInKg = 1.3\r\n             .PackartKollitraeger = ePaket\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> .AddDPEENotification\r\n        &nbsp;&nbsp;&nbsp;&nbsp;    .Emailadresse = \"andre@minhorst.com\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         <span style=\"color:blue;\">With<\/span> .AddDPEENotification\r\n             .Emailadresse = \"test@test.de\"\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         Open CurrentProject.Path & \"\\dhltest.csv\" For Output<span style=\"color:blue;\"> As <\/span>#1\r\n         Print #1, .Satz\r\n         Close #1\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Erstellen einer CSV-Datei f&uuml;r den Versand<\/span><\/b><\/p>\n<p>Die Prozedur deklariert ein Objekt auf Basis der Klasse <b>clsDPEEMain<\/b>. Dieses erstellt sie gleich in der darauffolgenden Zeile mit der <b>New<\/b>-Anweisung. Da wir nachfolgend einige Eigenschaften dieser Klasse einstellen m&ouml;chten, verwenden wir nun die <b>With<\/b>-Anweisung, damit wir den Objektbezeichner <b>objDPEEMain <\/b>nicht in jeder Zeile wiederholen m&uuml;ssen.<\/p>\n<p>Als Erstes legen wir die Ordnungsnummer fest. Dies ist die Nummer, die wir in jedem Satz als erstes Element angeben m&uuml;ssen, damit wir die einzelnen S&auml;tze als zu einer Versendung geh&ouml;rend markieren k&ouml;nnen. Gleichzeitig ist das auch die einzige Information, die wir direkt an diese Klasse &uuml;bergeben.<\/p>\n<p>&uuml;ber diese Klasse greifen wir jedoch &uuml;ber Eigenschaften wie <b>DPEEShipment <\/b>(Satzart <b>Sendung<\/b>), <b>DPEESender <\/b>(Satzart <b>Absender<\/b>), <b>DPEEReceiver <\/b>(Satzart <b>Empfaenger<\/b>), <b>DPEEItem <\/b>(Satzart <b>Packst&uuml;ck<\/b>) und <b>DPEENotification <\/b>(Satzart <b>Benachrichtigungen<\/b>) auf die Objekte f&uuml;r die einzelnen S&auml;tze beziehungsweise Zeilen in der CSV-Datei zu.<\/p>\n<p>&uuml;ber <b>DPEEShipment <\/b>stellen Sie so etwa den Produktcode, das Sendungsdatum oder das Gesamtgewicht ein.<\/p>\n<p><b>DPEESender <\/b>stellt Eigenschaften bereit, mit denen Sie die Kundennummer und die Adresse des Absenders festlegen.<\/p>\n<p>Dementsprechend dient das Objekt <b>DPEEReceiver <\/b>dazu, die Adresse des Empf&auml;ngers zu &uuml;bergeben.<\/p>\n<p>Auf die Objekte <b>DPEEItem <\/b>und <b>DPEENotification <\/b>greifen Sie nicht wie auf die anderen Elemente zu. Der Grund ist, dass Sie beide mehrfach anlegen k&ouml;nnen. Daher legen Sie diese jeweils mit der entsprechenden <b>Add&#8230;<\/b>-Methode an, also etwa <b>AddDPEEItem <\/b>oder <b>AddDPEENotification<\/b>. Da die beiden Methoden aber auch jeweils ein Element des Typs <b>clsDPEEItem <\/b>beziehungsweise <b>clsDPEENotification <\/b>zur&uuml;ckliefern, k&ouml;nnen Sie auf die <b>Add&#8230;<\/b>-Methode jeweils mit der <b>With<\/b>-Anweisung verweisen und dar&uuml;ber die einzelnen Eigenschaften festlegen &#8211; bei der Satzart <b>Packst&uuml;ck <\/b>also etwa das Gewicht und die Packart (Paket oder Palette).<\/p>\n<p>Bei der Benachrichtigung verwenden Sie die Methode <b>AddDPEENotification<\/b>, f&uuml;r die Sie nur die jeweilige E-Mail-Adresse des Empf&auml;ngers angeben m&uuml;ssen. Im Beispiel legen wir gleich zwei E-Mail-Adressen f&uuml;r die Versandbest&auml;tigung an &#8211; eine f&uuml;r den Sender und eine f&uuml;r den Empf&auml;nger.<\/p>\n<p>Schlie&szlig;lich erstellt die Prozedur eine neue Textdatei mit der Endung <b>.csv <\/b>und schreibt den Wert der Eigenschaft <b>Satz <\/b>des Objekts <b>objDPEEMain <\/b>hinein. Diese Eigenschaft liefert den Inhalt der CSV-Datei, den die Klasse auf Basis der &uuml;bergebenen Werte zusammengestellt hat. F&uuml;r unser Beispiel sieht diese Datei nun genau wie in Listing 2 aus.<\/p>\n<pre>1234|DPEE-SHIPMENT|EPN|20150629|1.3||||AEMA|||||||||||||||||100|EUR||||||\r\n|01|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\r\n1234|DPEE-SENDER|6275498028|Andr&eacute; Minhorst Verlag||Andr&eacute; Minhorst\r\n|Borkhofer Str.|17||47137|Duisburg|DE|\r\n|andre@minhorst.com|0123\/4567890|||||||||||||||||||||\r\n1234|DPEE-RECEIVER|Andr&eacute; Minhorst Verlag||||Herr Klaus M&uuml;ller\r\n|Borkhofer Str.|17||47137|Duisburg|DE|| klaus@mueller.de||||||||||||||||||\r\n1234|DPEE-ITEM|1.3|||||PK||\r\n1234|DPEE-NOTIFICATION||andre@minhorst.com|||\r\n1234|DPEE-NOTIFICATION||test@test.de|||<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Frisch erstellte CSV-Datei mit Sendungsdaten<\/span><\/b><\/p>\n<p>Das Tolle bei der Verwendung dieser Klassen ist, dass Sie nicht erst die Dokumentation nach den Namen der einzelnen Eigenschaften einer Zeile der CSV-Datei suchen oder die Position innerhalb der Zeile ermitteln m&uuml;ssen, sondern einfach einen Punkt hinter dem Objektbezeichner einf&uuml;gen und dann alle m&ouml;glichen Eigenschaften per IntelliSense pr&auml;sentiert bekommen (s. Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_992_002.png\" alt=\"IntelliSense beim Programmieren der Erstellung der CSV-Datei\" width=\"650\" height=\"461,0132\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: IntelliSense beim Programmieren der Erstellung der CSV-Datei<\/span><\/b><\/p>\n<p>Versierte Access-Entwickler haben nach der Durchsicht dieses Beispielcodes schon eine Vorstellung, wie sie auf dieser Basis den Code erstellen, um die ben&ouml;tigten Informationen aus einigen Tabellen zusammenzusuchen und so in die CSV-Datei zu schreiben.<\/p>\n<h2>Klassen programmieren<\/h2>\n<p>Nun fehlt noch die Antwort auf die Frage: Wie kommt man von der Definition des Aufbaus der verschiedenen Satzarten aus einem 27 Seiten langen PDF-Dokument, das beispielsweise wie in Bild 2 aussieht, zu einer Reihe von Klassenmodulen, welche die Eingabe dann wie hier beschrieben erleichtern Dazu geh&ouml;rt in der Tat entweder eine Menge Handarbeit oder, was wir Access-Entwickler eindeutig bevorzugen, ein paar Zeilen VBA-Code, die uns einen Gro&szlig;teil der Arbeit abnehmen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_992_001.png\" alt=\"Umzusetzende Beschreibung aus dem PDF\" width=\"600\" height=\"257,5342\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Umzusetzende Beschreibung aus dem PDF<\/span><\/b><\/p>\n<p>Wir haben es im Detail mit f&uuml;nf Tabellen zu tun, die von  weniger als zehn bis zu knapp 100 Zeilen enthalten.<\/p>\n<p>Jede Tabelle beschreibt eine Satzart, also ben&ouml;tigen wir f&uuml;r jede Tabelle eine eigene Klasse. Jede Zeile der Tabelle beschreibt eine Eigenschaft, also ben&ouml;tigen wir f&uuml;r jede Zeile eine private Variable in der Klasse, um den zugewiesenen Wert speichern zu k&ouml;nnen, sowie eine <b>Property Let<\/b>-Prozedur, um diese Eigenschaften von au&szlig;erhalb der Klasse f&uuml;llen zu k&ouml;nnen.<\/p>\n<p><!--30percent--><\/p>\n<p>Schlie&szlig;lich soll jede Klasse noch eine Eigenschaft namens <b>Satz<\/b> bereitstellen, die nach dem Zuweisen der Eigenschaften alle Eigenschaften auswertet und die Zeile der CSV-Datei f&uuml;r diese Satzart zusammenstellt und zur&uuml;ckgibt. Das w&auml;ren f&uuml;r die f&uuml;nf hier behandelten S&auml;tze insgesamt 289 Zeilen, f&uuml;r die entsprechenden Eigenschaften, <b>Property Let<\/b>-Prozeduren und Eintr&auml;ge in die <b>Satz<\/b>-Eigenschaft vorgenommen werden m&uuml;ssten. Nein: Von Hand wollen wir das nicht erledigen.<\/p>\n<p>Dummerweise k&ouml;nnen wir die Inhalte der Tabellen noch nicht einmal direkt in eine Excel- oder Access-Tabelle einf&uuml;gen &#8211; zwar landet jede Zeile in einer eigenen Zeile der Zieltabelle, aber die Spalten werden alle in das erste Feld geschrieben. Also sind wir so vorgegangen: Wir haben die Tabellen zun&auml;chst in eine Text-Datei geschrieben, Tab-Zeichen zwischen die erste und zweite Spalte gebracht, in die dritte Spalte den Datentyp unter VBA eingetragen und die maximale Zeichenanzahl in die vierte Spalte geschrieben &#8211; alles jeweils durch Tabulatorzeichen voneinander getrennt. Das Zwischenergebnis sah dann wie in Bild 3 aus. Die Anzahl der manuellen Eingriffe h&auml;lt sich hier noch in Grenzen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_992_003.png\" alt=\"Felder im Textformat\" width=\"600\" height=\"250,173\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Felder im Textformat<\/span><\/b><\/p>\n<p>Danach haben wir den kompletten Inhalt in die Zwischen-ablage kopiert und dann in eine neue Tabelle namens <b>tblFelderDPEEItem <\/b>kopiert, die wir zuvor mit den vier ben&ouml;tigten Feldern ausgestattet haben. Der neue Zwischenstand ist in Bild 4 abgebildet.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_992_004.png\" alt=\"Felder in der Zieltabelle\" width=\"550\" height=\"322,6535\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Felder in der Zieltabelle<\/span><\/b><\/p>\n<p>Nun haben wir die Daten, wie wir sie brauchen &#8211; sch&ouml;n ordentlich in einer Tabelle untergebracht und per VBA erreichbar. Auf die gleiche Weise gehen wir noch f&uuml;r die &uuml;brigen vier Satzarten vor und erhalten f&uuml;nf Tabellen mit den Daten der jeweiligen Eigenschaften einer Satzart.<\/p>\n<p>Nun ben&ouml;tigen wir nur noch eine Prozedur, die jeweils den Inhalt einer Tabelle ausliest und den Code f&uuml;r eine Klasse erzeugt &#8211; oder zumindest eine Grundlage, die wir durch wenige manuelle Anpassungen zum gew&uuml;nschten Code umwandeln k&ouml;nnen.<\/p>\n<p>Die dazu verwendete Prozedur finden Sie in Listing 3. Die Prozedur erstellt als Erstes ein Recordset auf Basis der Tabelle mit der umzusetzenden Satzart, in diesem Fall <b>tblFelderDPEENotification <\/b>(f&uuml;r die anderen Tabellen haben wir die Tabellen manuell angepasst und die Prozedur neu gestartet).<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>KlasseErstellen()\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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strMember<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strProperties<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPraefix<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSatz<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblFelderDPEENotification\", dbOpenDynaset)\r\n     strSatz = strSatz & \"Public Property Get Satz()<span style=\"color:blue;\"> As String<\/span>\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSatz = strSatz & \"    Dim strSatz<span style=\"color:blue;\"> As String<\/span>\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         Select Case rst!Datentyp\r\n             <span style=\"color:blue;\">Case <\/span>\"String\"\r\n                 strPraefix = \"str\"\r\n             <span style=\"color:blue;\">Case <\/span>\"Long\"\r\n                 strPraefix = \"lng\"\r\n             <span style=\"color:blue;\">Case <\/span>\"Currency\"\r\n                 strPraefix = \"cur\"\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         strMember = strMember & \"Private m_\" & rst!Feldname & \" AS String\" & <span style=\"color:blue;\">vbCrLf<\/span> ''Alle String!\r\n         strProperties = strProperties & \"Public Property Let \" & rst!Feldname & \"(\" & strPraefix & rst!Feldname _\r\n             & \" AS \" & rst!Datentyp & \")\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         Select Case rst!Datentyp\r\n             <span style=\"color:blue;\">Case <\/span>\"Long\"\r\n                 strProperties = strProperties & \"    If \" & strPraefix & rst!Feldname & \" &gt; 0 Then\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strProperties = strProperties & \"        m_\" & rst!Feldname & \" = \" & strPraefix & rst!Feldname _\r\n                     & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strProperties = strProperties & \"    End If\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">Case <\/span>\"Currency\"\r\n                 strProperties = strProperties & \"    If \" & strPraefix & rst!Feldname & \" &gt; 0 Then\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strProperties = strProperties & \"        m_\" & rst!Feldname & \" = <span style=\"color:blue;\">Replace<\/span>(\" & strPraefix _\r\n                     & rst!Feldname & \", \"\",\"\", \"\".\"\")\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 strProperties = strProperties & \"    End If\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 strProperties = strProperties & \"    m_\" & rst!Feldname & \" = \" & strPraefix & rst!Feldname & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n         strProperties = strProperties & \"End Property\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strProperties = strProperties & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strSatz = strSatz & \"    strSatz = strSatz & m_\" & rst!Feldname & \" & \"\"|\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     strSatz = strSatz & \"    strSatz = left(strSatz, <span style=\"color:blue;\">Len<\/span>(strSatz) - 1)\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSatz = strSatz & \"    Satz = strSatz\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSatz = strSatz & \"End Property\"\r\n     Inzwischenablage strMember & <span style=\"color:blue;\">vbCrLf<\/span> & strProperties & <span style=\"color:blue;\">vbCrLf<\/span> & strSatz\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Code zum Erstellen des Inhalts der Klassenmodule<\/span><\/b><\/p>\n<p>Danach stellt sie in drei Variablen den kompletten Code der Klasse zusammen:<\/p>\n<ul>\n<li><b>strMember<\/b>: Nimmt die Deklarationszeilen der Member-Variablen auf, also etwa <b>Private m_Ordnungsnummer As String<\/b>.<\/li>\n<li><b>strProperties<\/b>: Erfasst die <b>Property Let<\/b>-Methoden f&uuml;r die Felder der Tabelle.<\/li>\n<li><b>strSatz<\/b>: Stellt die Prozedur zusammen, welche die Zeile f&uuml;r den kompletten Satz f&uuml;r die CSV-Datei liefern soll.<\/li>\n<\/ul>\n<p>Es soll eine Prozedur erstellt werden, die den kompletten Satz mit den zuvor eingegebenen Eigenschaftswerten ausgibt. Diese sieht im einfachsten Fall der Satzart <b>Benachrichtigungen <\/b>(<b>DPEENotification<\/b>) wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>Satz()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSatz<span style=\"color:blue;\"> As String<\/span>\r\n     strSatz = strSatz & m_Ordnungsnummer & \"|\"\r\n     strSatz = strSatz & \"DPEE-NOTIFICATION|\"\r\n     strSatz = strSatz & m_Empfaengername & \"|\"\r\n     strSatz = strSatz & m_Emailadresse & \"|\"\r\n     strSatz = strSatz & m_Zusatztext1 & \"|\"\r\n     strSatz = strSatz & m_Zusatztext2 & \"|\"\r\n     strSatz = strSatz & m_Zusatztext3 & \"|\"\r\n     strSatz = <span style=\"color:blue;\">Left<\/span>(strSatz, <span style=\"color:blue;\">Len<\/span>(strSatz) - 1)\r\n     Satz = strSatz\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Die ersten beiden Zeilen dieser Prozedur erstellt die Prozedur <b>KlasseErstellen <\/b>gleich zu Beginn. Dann startet sie eine <b>Do While<\/b>-Schleife &uuml;ber alle Datens&auml;tze der Tabelle <b>tblFelderDPEENotification<\/b>, um innerhalb der Schleife die jeweils gleichen Schritte f&uuml;r jede einzelne in der Tabelle gespeicherte Eigenschaft durchzuf&uuml;hren.<\/p>\n<p>Dies beginnt damit, dass die Prozedur den Datentyp des jeweilige Elements aus dem Feld <b>Datentyp <\/b>ausliest und das passende Pr&auml;fix in die Variable <b>strPraefix <\/b>schreibt (zum Beispiel <b>str <\/b>f&uuml;r <b>String<\/b>).<\/p>\n<p>Danach f&uuml;gt die Prozedur die Deklaration der privaten Variablen f&uuml;r dieses Feld zur Variablen <b>strMember <\/b>hinzu. Diese Zeilen sehen nach dem Durchlaufen aller Felder der Tabelle <b>tblFelderDPEENotification<\/b> etwa so aus:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Ordnungsnummer<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Empfaengername<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Emailadresse<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Zusatztext1<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Zusatztext2<span style=\"color:blue;\"> As String<\/span>\r\n<span style=\"color:blue;\">Private <\/span>m_Zusatztext3<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Anschlie&szlig;end f&uuml;gt die Prozedur der Variablen <b>strProperties <\/b>die <b>Property Let<\/b>-Eigenschaft f&uuml;r das aktuelle Feld hinzu. Dabei untersucht sie den im Feld <b>Datentyp <\/b>gespeicherten Datentyp. Handelt es sich um den Datentyp <b>Long <\/b>oder <b>Currency<\/b>, soll die <b>Property Let<\/b>-Prozedur pr&uuml;fen, ob die Felder einen Wert ungleich <b>0 <\/b>enthalten und nur in diesem Fall einen Wert zur entsprechenden Membervariablen zuweisen.<\/p>\n<p>Die fertigen <b>Property Let<\/b>-Prozeduren sehen dann f&uuml;r die aktuelle Tabelle so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Ordnungsnummer(strOrdnungsnummer<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Ordnungsnummer = strOrdnungsnummer\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Empfaengername(strEmpfaengername<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Empfaengername = strEmpfaengername\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Emailadresse(strEmailadresse<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Emailadresse = strEmailadresse\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Zusatztext1(strZusatztext1<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Zusatztext1 = strZusatztext1\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Zusatztext2(strZusatztext2<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Zusatztext2 = strZusatztext2\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Let <\/span>Zusatztext3(strZusatztext3<span style=\"color:blue;\"> As String<\/span>)\r\n     m_Zusatztext3 = strZusatztext3\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Schlie&szlig;lich folgt noch die Zeile f&uuml;r das aktuelle Feld f&uuml;r die Prozedur <b>Satz<\/b>. Diese f&uuml;gt eine Zeile wie die folgende hinzu:<\/p>\n<pre>strSatz = strSatz & m_Ordnungsnummer & \"|\"<\/pre>\n<p>Danach durchl&auml;uft die Prozedur die &uuml;brigen Datens&auml;tze des Recordsets.<\/p>\n<p>Ist dies erledigt, tr&auml;gt sie noch die abschlie&szlig;enden Zeilen der Prozedur <b>Satz <\/b>in die Variable <b>strSatz <\/b>ein und kopiert den Inhalt der drei Variablen, getrennt durch jeweils einen Zeilenumbruch, in die Zwischenablage, von wo Sie diesen in die Zielklasse kopieren k&ouml;nnen.<\/p>\n<p>Dazu legen Sie eine neue Klasse an, kopieren den Inhalt mit <b>Strg + C <\/b>hinein und speichern die Klasse unter dem gew&uuml;nschten Namen &#8211; in diesem Fall <b>clsDPEENotification<\/b>. Nachdem Sie auf die gleiche Weise die Klassen auf Basis der &uuml;brigen Tabellen erstellt und gespeichert haben, ist der Gro&szlig;teil der Arbeit erledigt. Nun hei&szlig;t es: Den Code testen und diesen an der einen oder anderen Stelle anpassen.<\/p>\n<h2>Feintuning<\/h2>\n<p>Dies gilt zum Beispiel f&uuml;r solche Felder, wo wir den Benutzer bei der Eingabe nicht nur durch die Bereitstellung der Eigenschaft per IntelliSense, sondern auch noch durch die Angabe der m&ouml;glichen Werte unterst&uuml;tzen wollen.<\/p>\n<p>Dies ist zum Beispiel bei der Eigenschaft <b>Produktcode <\/b>der Klasse <b>clsDPEEShipment<\/b>, die wie folgt als private Variable deklariert wird, der Fall:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Produktcode<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Wir sehen aktuell zwei Produkte vor, n&auml;mlich DHL-Paket (f&uuml;r Sendungen innerhalb Deutschlands) und Weltpaket (f&uuml;r alle anderen Sendungen). Die Codes daf&uuml;r hei&szlig;en <b>EPN <\/b>und <b>BPI<\/b>. Das kann sich nat&uuml;rlich niemand merken, weshalb wir zun&auml;chst eine Enumeration erstellen, welche benutzerfreundliche Konstanten enth&auml;lt:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Enum eProduktcode\r\n     eDHLPaket\r\n     eWeltpaket\r\nEnd Enum<\/pre>\n<p>Nun m&uuml;ssen wir nur noch daf&uuml;r sorgen, dass die <b>Property Let<\/b>-Prozedur diese beiden Werte anzeigt, wenn der Benutzer dieser Eigenschaft einen Wert hinzuf&uuml;gen m&ouml;chte, und dass sie daf&uuml;r dann die entsprechenden Zeichenfolgen <b>EPN <\/b>beziehungsweise <b>BPI <\/b>hinterlegt.<\/p>\n<p>Dies erledigt die folgende Anpassung der <b>Property Let<\/b>-Prozedur <b>Produktcode<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Produktcode(intProduktcode<span style=\"color:blue;\"> As <\/span>_\r\n         eProduktcode)\r\n     <span style=\"color:blue;\">Dim <\/span>strProduktcode<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case intProduktcode\r\n         <span style=\"color:blue;\">Case <\/span>eWeltpaket\r\n             strProduktcode = \"BPI\"\r\n         <span style=\"color:blue;\">Case <\/span>eDHLPaket\r\n             strProduktcode = \"EPN\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     m_Produktcode = strProduktcode\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Als Belohnung erhalten wir eine weitere Erleichterung bei der Eingabe der Eigenschaften in die Klassen (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_04\/pic_992_005.png\" alt=\"Weitere Unterst&uuml;tzung durch IntelliSense\" width=\"550\" height=\"333,8308\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Weitere Unterst&uuml;tzung durch IntelliSense<\/span><\/b><\/p>\n<h2>Die Klasse clsDPEEMain<\/h2>\n<p>Nachdem wir nun die f&uuml;nf Klassen erstellt haben, welche die Eigenschaften der f&uuml;nf verschiedenen Satzarten aufnehmen und &uuml;ber die <b>Satz<\/b>-Eigenschaft als Zeile f&uuml;r die CSV-Datei wieder ausgeben, ben&ouml;tigen wir noch das verbindende Glied: n&auml;mlich die Klasse <b>clsDPEEMain<\/b>.<\/p>\n<p>Diese wird als einzige Klasse direkt von der Prozedur instanziert, welche die CSV-Datei zusammensetzen soll, und steuert die &uuml;brigen Klassen. Wenn Sie weitere Satzarten etwa f&uuml;r das Anfertigen von Zollunterlagen oder Proforma-Rechnungen hinzuf&uuml;gen m&ouml;chten, m&uuml;ssen Sie nicht nur die entsprechenden Klassen nachr&uuml;sten, sondern diese auch wie die bereits vorhandenen Klassen in der Klasse clsDPEEMain ber&uuml;cksichtigen.<\/p>\n<p>Die Klasse deklariert zun&auml;chst einige Variablen &#8211; erst mal f&uuml;r die &uuml;brigen Klassen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_DPEEShipment<span style=\"color:blue;\"> As <\/span>clsDPEEShipment\r\n<span style=\"color:blue;\">Private <\/span>m_DPEEReceiver<span style=\"color:blue;\"> As <\/span>clsDPEEReceiver\r\n<span style=\"color:blue;\">Private <\/span>m_DPEESender<span style=\"color:blue;\"> As <\/span>clsDPEESender\r\n<span style=\"color:blue;\">Private <\/span>m_DPEEItem<span style=\"color:blue;\"> As <\/span>clsDPEEItem\r\n<span style=\"color:blue;\">Private <\/span>m_DPEENotification<span style=\"color:blue;\"> As <\/span>clsDPEENotification<\/pre>\n<p>Dann folgt die Variable f&uuml;r die Ordnungsnummer, die ja global der Klasse clsDPEEMain &uuml;bergeben und von dort an die &uuml;brigen Klassen weitergereicht wird:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_Ordnungsnummer<span style=\"color:blue;\"> As Long<\/span><\/pre>\n<p>Schlie&szlig;lich ben&ouml;tigen wir zwei <b>Collection<\/b>-Variablen f&uuml;r die Klassen beziehungsweise Satzarten, die mehrfach vorkommen k&ouml;nnen:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>m_DPEEItems<span style=\"color:blue;\"> As <\/span>Collection\r\n<span style=\"color:blue;\">Private <\/span>m_DPEENotifications<span style=\"color:blue;\"> As <\/span>Collection<\/pre>\n<p>Wenn der Benutzer die Klasse mit der Anweisung<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objDPEEMain = <span style=\"color:blue;\">New<\/span> clsDPEEMain<\/pre>\n<p>instanziert, l&ouml;st dies das <b>Initialize<\/b>-Ereignis aus. Dieses erstellt jeweils ein Exemplar der Klassen, die auf jeden Fall ben&ouml;tigt werden (f&uuml;r die Sendung, den Absender und den Empf&auml;nger) sowie die <b>Collection<\/b>-Objekte zum Aufnehmen der mehrfach vorkommenden Klassen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Class_Initialize()\r\n     <span style=\"color:blue;\">Set<\/span> m_DPEEShipment = <span style=\"color:blue;\">New<\/span> clsDPEEShipment\r\n     <span style=\"color:blue;\">Set<\/span> m_DPEESender = <span style=\"color:blue;\">New<\/span> clsDPEESender\r\n     <span style=\"color:blue;\">Set<\/span> m_DPEEReceiver = <span style=\"color:blue;\">New<\/span> clsDPEEReceiver\r\n     <span style=\"color:blue;\">Set<\/span> m_DPEEItems = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> m_DPEENotifications = <span style=\"color:blue;\">New<\/span> Collection\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Anschlie&szlig;end wird die erstellende Routine der Klasse <b>clsDPEEMain <\/b>die Ordnungsnummer f&uuml;r alle S&auml;tze\/Klassen dieser Sendung &uuml;bergeben. Diese nimmt die folgende <b>Property Let<\/b>-Prozedur entgegen und speichert sie in der Variablen <b>m_Ordnungsnummer<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Property Let <\/span>Ordnungsnummer(lngOrdnungsnummer<span style=\"color:blue;\"> As Long<\/span>)\r\n     m_Ordnungsnummer = lngOrdnungsnummer\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Danach wird der Benutzer vermutlich die Eigenschaften f&uuml;r die Sendung selbst, also f&uuml;r die Satzart <b>Sendung <\/b>&uuml;bergeben wollen. Dazu referenziert er zun&auml;chst das Objekt aus der Eigenschaft <b>DPEEShipment <\/b>und dann die gew&uuml;nschten Eigenschaften dieses Objekts &#8211; etwa so:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> objDPEEMain\r\n     .Ordnungsnummer = 1234\r\n     <span style=\"color:blue;\">With<\/span> .DPEEShipment\r\n         .Produktcode = eDHLPaket<\/pre>\n<p>Dazu muss <b>DPEEShipment <\/b>einen Verweis auf das in <b>m_DPEEShipment <\/b>gespeicherte Objekt zur&uuml;ckgeben, was die folgende <b>Property Get<\/b>-Prozedur erledigt:<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>DPEEShipment()<span style=\"color:blue;\"> As <\/span>clsDPEEShipment\r\n     <span style=\"color:blue;\">Set<\/span> DPEEShipment = m_DPEEShipment\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Das Gleiche erledigen die folgenden beiden Prozeduren f&uuml;r die Objekte aus <b>m_DPEEReceiver <\/b>(Satzart <b>Empf&auml;nger<\/b>) und <b>m_DPEESender <\/b>(Satzart <b>Sender<\/b>):<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>DPEEReceiver()<span style=\"color:blue;\"> As <\/span>clsDPEEReceiver\r\n     <span style=\"color:blue;\">Set<\/span> DPEEReceiver = m_DPEEReceiver\r\n<span style=\"color:blue;\">End Property<\/span>\r\n<span style=\"color:blue;\">Public Property Get <\/span>DPEESender()<span style=\"color:blue;\"> As <\/span>clsDPEESender\r\n     <span style=\"color:blue;\">Set<\/span> DPEESender = m_DPEESender\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p>Wenn der Benutzer hingegen etwa ein Packst&uuml;ck hinzuf&uuml;gen und dessen Eigenschaften festlegen m&ouml;chte, muss er dies wie folgt mit der <b>AddDPEEItem<\/b>-Methode erledigen. Dabei kann er das erstellte Objekt beispielsweise in einer entsprechenden Objektvariablen speichern und dann die Eigenschaften einstellen:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> objDPEEItem = .AddDPEEItem\r\n<span style=\"color:blue;\">With<\/span> objDPEEItem\r\n     .GewichtDesPackstueckesInKg = 1.3\r\n     .PackartKollitraeger = ePaket\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Die zus&auml;tzliche Variable kann man sich in diesem Fall aber auch sparen:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> .AddDPEEItem\r\n     .GewichtDesPackstueckesInKg = 1.4\r\n     .PackartKollitraeger = ePaket\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Die Methode <b>AddDPEEItem<\/b>, die dies m&ouml;glich macht, sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AddDPEEItem()<span style=\"color:blue;\"> As <\/span>clsDPEEItem\r\n     <span style=\"color:blue;\">Set<\/span> m_DPEEItem = <span style=\"color:blue;\">New<\/span> clsDPEEItem\r\n     m_DPEEItems.Add m_DPEEItem\r\n     <span style=\"color:blue;\">Set<\/span> AddDPEEItem = m_DPEEItem\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Sie legt also ein neues Objekt auf Basis der Klasse <b>clsDPEEItem <\/b>an, f&uuml;gt es zur Collection <b>m_DPEEItems <\/b>hinzu und gibt dann einen Verweis darauf zur&uuml;ck. Auf die gleiche Art arbeitet die <b>Property Get<\/b>-Prozedur <b>AddDPEENotification<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>AddDPEENotification()<span style=\"color:blue;\"> As <\/span>clsDPEENotification\r\n     <span style=\"color:blue;\">Set<\/span> m_DPEENotification = <span style=\"color:blue;\">New<\/span> clsDPEENotification\r\n     m_DPEENotifications.Add m_DPEENotification\r\n     <span style=\"color:blue;\">Set<\/span> AddDPEENotification = m_DPEENotification\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Fehlt nur noch die Methode <b>Satz<\/b>, welche die kompletten Zeilen einer Versendung f&uuml;r die CSV-Datei zusammenstellt. Diese sieht wie in Listing 4 aus und pr&uuml;ft zun&auml;chst, ob der Benutzer eine Ordnungsnummer angegeben hat. Falls nicht, gibt er eine entsprechende Meldung aus.<\/p>\n<pre><span style=\"color:blue;\">Public Property Get <\/span>Satz()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strSatz<span style=\"color:blue;\"> As String<\/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>objDPEEItem<span style=\"color:blue;\"> As <\/span>clsDPEEItem\r\n     <span style=\"color:blue;\">Dim <\/span>objDPEENotification<span style=\"color:blue;\"> As <\/span>clsDPEENotification\r\n     <span style=\"color:blue;\">If <\/span>m_Ordnungsnummer = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Geben Sie bitte eine Ordnungsnummer an.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     m_DPEEShipment.Ordnungsnummer = m_Ordnungsnummer\r\n     m_DPEESender.Ordnungsnummer = m_Ordnungsnummer\r\n     m_DPEEReceiver.Ordnungsnummer = m_Ordnungsnummer\r\n     strSatz = strSatz & m_DPEEShipment.Satz & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSatz = strSatz & m_DPEESender.Satz & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strSatz = strSatz & m_DPEEReceiver.Satz & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     For i = 1 To m_DPEEItems.Count\r\n         <span style=\"color:blue;\">Set<\/span> objDPEEItem = m_DPEEItems.Item(i)\r\n         objDPEEItem.Ordnungsnummer = m_Ordnungsnummer\r\n         strSatz = strSatz & objDPEEItem.Satz & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     For i = 1 To m_DPEENotifications.Count\r\n         <span style=\"color:blue;\">Set<\/span> objDPEENotification = m_DPEENotifications.Item(i)\r\n         objDPEENotification.Ordnungsnummer = m_Ordnungsnummer\r\n         strSatz = strSatz & objDPEENotification.Satz & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> i\r\n     Satz = strSatz\r\n<span style=\"color:blue;\">End Property<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Code zum Zusammenstellen der Zeilen einer Versendung f&uuml;r die CSV-Datei<\/span><\/b><\/p>\n<p>Genau genommen ist das nur eine Validierung &#8211; man k&ouml;nnte noch eine ganze Menge weiterer Validierungen unterbringen, die daf&uuml;r sorgen, dass die an DHL IntraShip gesendeten CSV-Daten m&ouml;glichst fehlerfrei sind. Dies w&uuml;rde an dieser Stelle jedoch den Umfang sprengen. Ohne Ordnungsnummer jedoch, welche die zu einer Sendung geh&ouml;renden Zeilen zusammenh&auml;lt, k&ouml;nnen Sie die CSV-Datei direkt vergessen.<\/p>\n<p>Ist die Ordnungsnummer korrekt, tr&auml;gt die Prozedur diese f&uuml;r die entsprechende Eigenschaft der einzelnen Objekts ein. Auf diese Weise braucht der Benutzer diesen Wert nicht f&uuml;r jede Satzart selbst hinzuzuf&uuml;gen. Danach ruft die Prozedur die <b>Satz<\/b>-Funktion der drei Objekte f&uuml;r die S&auml;tze <b>Sendung<\/b>, <b>Absender <\/b>und <b>Empf&auml;nger <\/b>auf und stellt somit schon einmal die ersten drei Zeilen der CSV-Datei f&uuml;r diese Sendung zusammen.Dann folgen die S&auml;tze, die mehrfach vorkommen k&ouml;nnen. Dazu durchl&auml;uft die Prozedur zun&auml;chst die Elemente der Collection <b>m_DPEEItems<\/b>, weist den Elementen die Ordnungsnummer zu und liest dann mit der <b>Satz<\/b>-Funktion die Zeile f&uuml;r diese Satzart aus. Dies wiederholt die Funktion f&uuml;r alle Packst&uuml;cke.<\/p>\n<p>Eine &auml;hnliche Schleife durchl&auml;uft die Prozedur f&uuml;r die Elemente der Satzart <b>Benachrichtigungen<\/b>. Auch hier tr&auml;gt sie die Ordnungsnummer ein und liest dann mit der <b>Satz<\/b>-Funktion die resultierende Zeile aus. Die Zeilen aus den Elementen der beiden Auflistungen landen dann wie die vorherigen Pflichtelemente in der Variablen <b>strSatz<\/b>. Der enthaltene Wert wird schlie&szlig;lich als Funktionswert an die aufrufende Funktion zur&uuml;ckgegeben.<\/p>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Mit den hier vorgestellten Techniken k&ouml;nnen Sie auf einfache Weise die Erstellung von CSV-Dateien f&uuml;r DHL-Versendungen f&uuml;llen und speichern. Der Beitrag <b>Versandetiketten mit DHL-IntraShip <\/b>(<b>www.access-im-unternehmen.de\/991<\/b>) zeigt, wie Sie diese Klasse in der Praxis einsetzen k&ouml;nnen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DHL.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{B23E57C6-A5E6-4966-8ECA-58C8015FF274}\/aiu_992.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die CSV-Dateien, die f&uuml;r die Einreichung bei DHL f&uuml;r die Erstellung von Versandetiketten gefordert werden, sind erstens sehr umfangreich und zweitens auch noch komplex. Diese einfach per Code zusammenzusetzen mag auf den ersten Blick schnell gehen, aber was geschieht, wenn sp&auml;ter einmal &Auml;nderungen n&ouml;tig sind Um die Programmierung des Exports einer CSV-Datei f&uuml;r DHL-Intraship zu vereinfachen, erstellen wir in diesem Beitrag einige Klassen, mit denen das Zusammenstellen der CSV-Dateien zum Kinderspiel wird.<\/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":[662015,66042015,44000025],"tags":[],"class_list":["post-55000992","post","type-post","status-publish","format-standard","hentry","category-662015","category-66042015","category-VBA_und_Programmiertechniken"],"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>Klasse f&uuml;r DHL-Intraship-CSV-Dateien - 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\/Klasse_fuer_DHLIntrashipCSVDateien\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Klasse f&uuml;r DHL-Intraship-CSV-Dateien\" \/>\n<meta property=\"og:description\" content=\"Die CSV-Dateien, die f&uuml;r die Einreichung bei DHL f&uuml;r die Erstellung von Versandetiketten gefordert werden, sind erstens sehr umfangreich und zweitens auch noch komplex. Diese einfach per Code zusammenzusetzen mag auf den ersten Blick schnell gehen, aber was geschieht, wenn sp&auml;ter einmal &Auml;nderungen n&ouml;tig sind Um die Programmierung des Exports einer CSV-Datei f&uuml;r DHL-Intraship zu vereinfachen, erstellen wir in diesem Beitrag einige Klassen, mit denen das Zusammenstellen der CSV-Dateien zum Kinderspiel wird.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T19:21:46+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/057ad04beabb47d1967047b85be3666c\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Klasse f&uuml;r DHL-Intraship-CSV-Dateien\",\"datePublished\":\"2020-05-22T19:21:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/\"},\"wordCount\":3456,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/057ad04beabb47d1967047b85be3666c\",\"articleSection\":[\"2015\",\"4\\\/2015\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/\",\"name\":\"Klasse f&uuml;r DHL-Intraship-CSV-Dateien - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/057ad04beabb47d1967047b85be3666c\",\"datePublished\":\"2020-05-22T19:21:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/057ad04beabb47d1967047b85be3666c\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/057ad04beabb47d1967047b85be3666c\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Klasse_fuer_DHLIntrashipCSVDateien\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Klasse f&uuml;r DHL-Intraship-CSV-Dateien\"}]},{\"@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":"Klasse f&uuml;r DHL-Intraship-CSV-Dateien - 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\/Klasse_fuer_DHLIntrashipCSVDateien\/","og_locale":"de_DE","og_type":"article","og_title":"Klasse f&uuml;r DHL-Intraship-CSV-Dateien","og_description":"Die CSV-Dateien, die f&uuml;r die Einreichung bei DHL f&uuml;r die Erstellung von Versandetiketten gefordert werden, sind erstens sehr umfangreich und zweitens auch noch komplex. Diese einfach per Code zusammenzusetzen mag auf den ersten Blick schnell gehen, aber was geschieht, wenn sp&auml;ter einmal &Auml;nderungen n&ouml;tig sind Um die Programmierung des Exports einer CSV-Datei f&uuml;r DHL-Intraship zu vereinfachen, erstellen wir in diesem Beitrag einige Klassen, mit denen das Zusammenstellen der CSV-Dateien zum Kinderspiel wird.","og_url":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T19:21:46+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/057ad04beabb47d1967047b85be3666c","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Klasse f&uuml;r DHL-Intraship-CSV-Dateien","datePublished":"2020-05-22T19:21:46+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/"},"wordCount":3456,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/057ad04beabb47d1967047b85be3666c","articleSection":["2015","4\/2015","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/","url":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/","name":"Klasse f&uuml;r DHL-Intraship-CSV-Dateien - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/057ad04beabb47d1967047b85be3666c","datePublished":"2020-05-22T19:21:46+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/057ad04beabb47d1967047b85be3666c","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/057ad04beabb47d1967047b85be3666c"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Klasse_fuer_DHLIntrashipCSVDateien\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Klasse f&uuml;r DHL-Intraship-CSV-Dateien"}]},{"@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\/55000992","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=55000992"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000992\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000992"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000992"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}