{"id":55000333,"date":"2022-12-01T00:00:00","date_gmt":"2023-03-02T17:03:26","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=333"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"DHLPaketlabel_per_VBA_erstellen","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/DHLPaketlabel_per_VBA_erstellen\/","title":{"rendered":"DHL-Paketlabel per VBA erstellen"},"content":{"rendered":"<p><b>Beim Versand von Paketen kommt recht oft DHL zum Einsatz. Die einfachste Form der computergest&uuml;tzten Erstellung von Paketlabeln ist dabei das Anmelden bei DHL und das Erstellen eines Labels durch Eingabe der Adressdaten und Bezahlung auf der Webseite. Etwas mehr M&ouml;glichkeiten bietet ein Gesch&auml;ftskundenkonto beim Anbieter DHL. Hier k&ouml;nnen wir einen Schritt weitergehen und die Adressdaten beispielsweise per CSV &uuml;bermitteln. Noch sch&ouml;ner w&auml;re es, wenn wir von der jeweiligen Anwendung aus &#8211; ob es sich nun um eine Access-Datenbank, eine Excel-Tabelle oder sogar Outlook handelt &#8211; direkt per Mausklick ein Paketlabel zur Sendung eines Pakets an den jeweiligen Kontakt erstellen k&ouml;nnten, dass dann beispielsweise als PDF auf unserem Rechner landet. Wie das gelingt, zeigen wir im vorliegenden Artikel.<\/b><\/p>\n<h2>Voraussetzung: Gesch&auml;ftskundenkonto bei DHL<\/h2>\n<p>Bevor Du weiter in diesen Artikel einsteigst, hier ein wichtiger Hinweis: Um die Beispiele in der Praxis einzusetzen, ben&ouml;tigst Du ein Gesch&auml;ftskundenkonto bei DHL &#8211; beziehungsweise der Kunde, f&uuml;r den Du diese Anwendung erstellst. Zum Ausprobieren der Beispiele reicht ein einfaches Entwicklerkonto bei DHL aus. Wie Du ein Gesch&auml;ftskundenkonto erstellst, wollen wir hier nicht demonstrieren &#8211; aber zumindest den Weg dorthin. Dazu folgst Du diesem Link und klickst dann auf Gesch&auml;ftskunden (siehe Bild 1):<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_333_005.png\" alt=\"Hier gelangst Du zum Gesch&auml;ftskundenbereich von DHL.\" width=\"700\" height=\"149,1157\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Hier gelangst Du zum Gesch&auml;ftskundenbereich von DHL.<\/span><\/b><\/p>\n<pre>https:\/\/www.dhl.de<\/pre>\n<h2>Entwickler-Konto bei DHL erstellen<\/h2>\n<p>Wenn Du das f&uuml;r die Umsetzung ben&ouml;tigte Entwicklerkonto bei DHl erstellen m&ouml;chtest, folgst Du diesem Link:<\/p>\n<pre>https:\/\/entwickler.dhl.de\/<\/pre>\n<p>Hier findest Du im unteren Bereich einen Link mit dem Text <b>Registrieren Sie sich jetzt<\/b>. Dieser f&uuml;hrt bereits zur Registrierungsseite, wo zun&auml;chst nur eine Entwickler-ID, die E-Mail sowie ein Kennwort einzugeben sind &#8211; nebst Best&auml;tigung von AGB und Datenschutzerkl&auml;rung.<\/p>\n<h2>&Uuml;bersicht der Dienste<\/h2>\n<p>Nach der Registrierung des Entwicklerkontos und der  ersten Anmeldung sehen wir die zur Verf&uuml;gung stehenden Dienste (siehe Bild 2). Uns interessiert als Erstes der <b>Gesch&auml;ftskundenversand<\/b>. Nach einem Klick auf den entsprechenden Link landen wir direkt auf der Seite <b>Gesch&auml;ftskundenversand API<\/b>, die erste Informationen f&uuml;r uns bereith&auml;lt. Hier finden wir zum Zeitpunkt der Erstellung des Artikels die Information, dass es eine neue Version mit der Nummer 3.3 mit neuer Fehlerbehandlung gibt. Und da dies beim Zugriff auf APIs &uuml;ber das Internet immer besonders wichtig ist, wollen wir direkt mit dieser Version einsteigen. Dazu erhalten wir den wichtigen Tipp, die gew&uuml;nschte Version im XML-Block namens <b>Version <\/b>zu &uuml;bergeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_333_001.png\" alt=\"Bereiche im Entwicklerportal\" width=\"700\" height=\"428,9957\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Bereiche im Entwicklerportal<\/span><\/b><\/p>\n<h2>Anlegen einer Applikation<\/h2>\n<p>Bevor wir richtig einsteigen k&ouml;nnen, legen wir eine Applikation an. Das erledigen wir im Bereich <b>Freigabe &#038; Betrieb<\/b> der Webseite (siehe Bild 3). Hier tragen wir den technischen Namen, den Namen und eine Beschreibung ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_333_002.png\" alt=\"Anlegen einer neuen Anwendung\" width=\"649,627\" height=\"933,1345\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anlegen einer neuen Anwendung<\/span><\/b><\/p>\n<p>Au&szlig;erdem f&uuml;gen wir alle Operationen hinzu, die wir verwenden wollen. In diesem Fall klappen wir den Bereich <b>Gesch&auml;ftskundenversand\/Business customer shipment <\/b>auf und selektieren dort alle Eintr&auml;ge. Anschlie&szlig;end schlie&szlig;en wir das Anlegen der Applikation mit einem Klick auf <b>Applikation speichern <\/b>ab.<\/p>\n<h2>Authentifizierung<\/h2>\n<p>Nach dem Anlegen der Applikation k&ouml;nnen wir zum n&auml;chsten Men&uuml;punkt springen und uns die Informationen rund um die Authentifizierung ansehen. Wichtig ist hier f&uuml;r uns die Kenntnis der sogenannten Endpunkte f&uuml;r Test und Entwicklung sowie sp&auml;ter f&uuml;r die produktive Nutzung. Vor dieser steht allerdings noch die Freigabe. Wir wollen den Zugriff per SOAP nutzen, also k&ouml;nnen wir uns den folgenden Endpunkt f&uuml;r die Tests mit der Sandbox merken:<\/p>\n<pre>https:\/\/cig.dhl.de\/services\/sandbox\/soap<\/pre>\n<p>Au&szlig;erdem erhalten wir hier noch wichtige Informationen &uuml;ber die zu verwendenden Zugangsdaten. F&uuml;r den Testzugriff auf die Sandbox verwenden wir dabei als Benutzername die zuvor festgelegte Entwickler-ID und als Kennwort das f&uuml;r das Entwicklerkonto festgelegte Kennwort.<\/p>\n<p>Sp&auml;ter, wenn wir die Freigabe der Anwendung erhalten haben, k&ouml;nnen wir als Benutzernamen den Namen der Anwendung angeben und ein daf&uuml;r festgelegtes Token. Beides erhalten wir im Bereich <b>Freigabe &#038; Betrieb <\/b>der Webseite, also an der gleichen Stelle, an der wir auch die Applikation erstellt haben.<\/p>\n<p>Neben den Informationen &uuml;ber die Authentifizierung erhalten wir auch noch den wichtigen Hinweis, dass wir f&uuml;r den produktiven Betrieb im Header noch die jeweilige Aktion angeben m&uuml;ssen &#8211; dazu kommen wir sp&auml;ter noch.<\/p>\n<h2>Die Gesch&auml;ftskundenversand-API<\/h2>\n<p>Danach folgen im Men&uuml; die einzelnen Bereiche, die wir programmieren k&ouml;nnen. Wie weiter oben festgelegt, wollen wir den Gesch&auml;ftskundenversand automatisieren und wechseln daher zum Men&uuml; <b>Gesch&auml;ftskundenversand<\/b>.<\/p>\n<h2>Finger&uuml;bung: Version abfragen<\/h2>\n<p>Bevor wir uns an die Programmierung der Erstellung von Versandlabeln begeben, wollen wir zum Warmmachen die aktuell verf&uuml;gbar maximale Version abfragen. Dazu erstellen wir als Erstes eine Funktion, die ein entsprechendes SOAP-Dokument zusammenstellt und dieses dann an eine Funktion zum Senden der Anfrage an die API schickt.<\/p>\n<p>Die Funktion hei&szlig;t <b>VersionErmitteln <\/b>und erwartet die beiden Parameter <b>intMajor <\/b>und <b>intMinor<\/b>, welche beides R&uuml;ckgabeparameter sind, also die als leere Variablen &uuml;bergeben und von der Funktion gef&uuml;llt werden (siehe Listing 1).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VersionErmitteln(intMajor<span style=\"color:blue;\"> As Integer<\/span>, intMinor<span style=\"color:blue;\"> As Integer<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLRequest<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Dim <\/span>objXMLResponse<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">Dim <\/span>objMinor<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>objMajor<span style=\"color:blue;\"> As <\/span>MSXML2.IXMLDOMNode\r\n     <span style=\"color:blue;\">Dim <\/span>strRequest<span style=\"color:blue;\"> As String<\/span>\r\n     strRequest = \"&lt;soapenv:Envelope xmlns:soapenv=\"\"http:\/\/schemas.xmlsoap.org\/soap\/envelope\/\"\" \" _\r\n         & \"xmlns:ns=\"\"http:\/\/dhl.de\/webservices\/businesscustomershipping\/3.0\"\"&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"   &lt;soapenv:Body&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"      &lt;ns:Version&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"         &lt;majorRelease&gt;?&lt;\/majorRelease&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"         &lt;minorRelease&gt;?&lt;\/minorRelease&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"         &lt;build&gt;?&lt;\/build&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"      &lt;\/ns:Version&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"   &lt;\/soapenv:Body&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strRequest = strRequest & \"&lt;\/soapenv:Envelope&gt;\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objXMLRequest = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objXMLRequest.loadXML(strRequest)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span> objXMLRequest.parseError.Line, objXMLRequest.parseError.linepos, objXMLRequest.parseError.reason, _\r\n             objXMLRequest.parseError.errorCode\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">If <\/span>RequestSandbox(strRequest, objXMLResponse)<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> objMinor = objXMLResponse.selectSingleNode(\"\/\/minorRelease\")\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objMinor Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n                 intMinor = objMinor.nodeTypedValue\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">Set<\/span> objMajor = objXMLResponse.selectSingleNode(\"\/\/majorRelease\")\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objMajor Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n                 intMajor = objMajor.nodeTypedValue\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Zusammenstellen einer Abfrage der aktuellen Version<\/span><\/b><\/p>\n<p>Sie deklariert zwei Variablen des Typs <b>MSXML2.DOMDocument60<\/b>, womit wir gleich bei einer Voraussetzung landen &#8211; dem Hinzuf&uuml;gen eines Verweises auf die Bibliothek <b>Microsoft XML, v6.0<\/b>. Dies erledigen wir im Dialog <b>Verweise<\/b>, den wir vom VBA-Editor der verwendeten Anwendung aus mit dem Men&uuml;befehl <b>Extras|Verweise <\/b>&ouml;ffnen. Die ben&ouml;tigte Bibliothek f&uuml;gen wir wie in Bild 4 hinzu. Anschlie&szlig;end k&ouml;nnen wir die enthaltenen Klassen, Methoden und Eigenschaften im VBA-Editor unter Verwendung von IntelliSense eingeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_333_007.png\" alt=\"Hinzuf&uuml;gen eines Verweises auf die XML-Bibliothek\" width=\"424,6267\" height=\"334,749\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Hinzuf&uuml;gen eines Verweises auf die XML-Bibliothek<\/span><\/b><\/p>\n<p>Neben diesen beiden Objektvariablen nutzen wir zwei weitere namens <b>objMinor <\/b>und <b>objMajor<\/b>, jeweils mit dem Typ <b>MSXML2.IXMLDOMNode<\/b>, um Elemente mit Versionsangabe zu referenzieren. Die Funktion stellt nun den Code der Anfrage zusammen, die wir an die API von DHL schicken wollen. Zusammengefasst sieht diese in der Variablen <b>strRequest <\/b>erfasste Zeichenkette wie folgt aus:<\/p>\n<pre>&lt;soapenv:Envelope         xmlns:soapenv=\"http:\/\/schemas.xmlsoap.org\/soap\/        envelope\/\" xmlns:ns=\"http:\/\/dhl.de\/webservices\/        businesscustomershipping\/3.0\"&gt;\r\n     &lt;soapenv:Body&gt;\r\n         &lt;ns:Version&gt;\r\n             &lt;majorRelease&gt;?&lt;\/majorRelease&gt;\r\n             &lt;minorRelease&gt;?&lt;\/minorRelease&gt;\r\n             &lt;build&gt;?&lt;\/build&gt;\r\n         &lt;\/ns:Version&gt;\r\n     &lt;\/soapenv:Body&gt;\r\n&lt;\/soapenv:Envelope&gt;<\/pre>\n<p>Nach dem Zusammenstellen dieser Zeichenkette erstellt die Funktion ein neues Objekt des Typs <b>DOMDocument60 <\/b>und ruft dessen Funktion <b>loadXML <\/b>auf. Dieser &uuml;bergibt sie den Inhalt von <b>strRequest <\/b>und f&uuml;llt das Objekt aus <b>objXMLRequest <\/b>damit mit der XML-Anfrage. Die <b>loadXML<\/b>-Funktion pr&uuml;ft gleichzeitig die G&uuml;ltigkeit des &uuml;bergebenen XML-Dokuments und gibt eine Meldung im Direktbereich aus, sollte dieses nicht g&uuml;ltig sein.<\/p>\n<p>Anderenfalls ruft sie die Funktion <b>Request <\/b>auf und &uuml;bergibt dieser das gef&uuml;llte Objekt <b>objXMLRequest <\/b>sowie das noch leere Objekt <b>objXMLResponse<\/b>. Diese Funktion beschreiben wir gleich im Anschluss. Wenn die Funktion den Wert <b>True <\/b>zur&uuml;ckgibt, die Abfrage also erfolgreich war, dann ist <b>objXMLResponse<\/b> anschlie&szlig;end mit einem XML-Dokument wie dem folgenden gef&uuml;llt:<\/p>\n<pre>&lt;soapenv:Envelope \r\n         xmlns:bus=\"http:\/\/dhl.de\/webservices\/\r\n         businesscustomershipping\/3.0\" \r\n         xmlns:soapenv=\"http:\/\/schemas.xmlsoap.org\/soap\/\r\n         envelope\/\"&gt;\r\n     &lt;soapenv:Header\/&gt;\r\n     &lt;soapenv:Body&gt;\r\n         &lt;bus:GetVersionResponse&gt;\r\n             &lt;bus:Version&gt;\r\n                 &lt;majorRelease&gt;3&lt;\/majorRelease&gt;\r\n                 &lt;minorRelease&gt;0&lt;\/minorRelease&gt;\r\n                 &lt;build&gt;0&lt;\/build&gt;\r\n             &lt;\/bus:Version&gt;\r\n         &lt;\/bus:GetVersionResponse&gt;\r\n     &lt;\/soapenv:Body&gt;\r\n&lt;\/soapenv:Envelope&gt;<\/pre>\n<p>Die Aufgabe lautet nun noch, den Inhalt der beiden Elemente <b>majorRelease <\/b>und <b>minorRelease <\/b>auszulesen und in die R&uuml;ckgabeparameter zu schreiben. Das erledigen wir, indem wir mit der Funktion <b>selectSingleNode <\/b>nach den entsprechenden Elementen suchen. Finden wir diese, lesen wir daraus &uuml;ber die Eigenschaft <b>nodeTypedValue <\/b>die enthaltenen Werte aus. Diese f&uuml;llen wir in die R&uuml;ckgabeparameter <b>intMinor <\/b>und <b>intMajor<\/b>.<\/p>\n<p>Diese Funktion rufen wir beispielsweise mit der folgenden Prozedur auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_VersionErmitteln()\r\n     <span style=\"color:blue;\">Dim <\/span>intMajor<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intMinor<span style=\"color:blue;\"> As Integer<\/span>\r\n     VersionErmitteln intMajor, intMinor\r\n     <span style=\"color:blue;\">Debug.Print<\/span> \"Version \" & intMajor & \".\" & intMinor\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>Die Request-Funktion<\/h2>\n<p>Die eigentliche Arbeit beim Aufruf der DHL-API &uuml;bernimmt die Funktion <b>RequestSandbox<\/b> (siehe Listing 2). Diese nimmt &uuml;ber den Parameter <b>strRequest <\/b>den Aufruf entgegen und soll den R&uuml;ckgabeparameter <b>objXMLResponse <\/b>mit dem <b>DOMDocument60<\/b>-Objekt mit der Antwort f&uuml;llen. Dieses erstellt die Funktion mit dem <b>New<\/b>-Schl&uuml;sselwort zun&auml;chst neu. Au&szlig;erdem erstellt sie ein Objekt des Typs <b>XMLHTTP60 <\/b>und referenziert es mit der Objektvariablen <b>objXMLHTTP<\/b>. Hier kommt nun eine Konstante ins Spiel, die wir im Kopf des Moduls deklarieren und mit der weiter oben angegebenen URL f&uuml;r den Zugriff auf die API in der Sandbox-Version f&uuml;llen &#8211; also mit der URL f&uuml;r unsere Tests der API:<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RequestSandbox(strRequest<span style=\"color:blue;\"> As String<\/span>, objXMLResponse<span style=\"color:blue;\"> As <\/span>MSXML2.DOMDocument60)<span style=\"color:blue;\"> As Boolean<\/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>objXMLHTTP<span style=\"color:blue;\"> As <\/span>MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Set<\/span> objXMLHTTP = <span style=\"color:blue;\">New<\/span> MSXML2.XMLHTTP60\r\n     <span style=\"color:blue;\">Set<\/span> objXMLResponse = <span style=\"color:blue;\">New<\/span> MSXML2.DOMDocument60\r\n     <span style=\"color:blue;\">With<\/span> objXMLHTTP\r\n         .Open \"post\", cStrURLBase, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"text\/xml; charset=utf-8\"\r\n         .setRequestHeader \"Content-Length\", <span style=\"color:blue;\">Len<\/span>(strRequest)\r\n         .setRequestHeader \"Authorization\", \"Basic \" + Base64Encode(strUserSandbox + \":\" + strPasswordSandbox)\r\n         .send strRequest\r\n         <span style=\"color:blue;\">Select Case <\/span>.status\r\n             <span style=\"color:blue;\">Case <\/span>200\r\n                 Request = <span style=\"color:blue;\">True<\/span>\r\n                 objXMLResponse.loadXML .responseText\r\n             <span style=\"color:blue;\">Case Else<\/span>\r\n                 <span style=\"color:blue;\">MsgBox<\/span> \"Fehler beim Request:\" & <span style=\"color:blue;\">vbCrLf<\/span> & .statusText\r\n         <span style=\"color:blue;\">End Select<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Die Request-Funktion zum Durchf&uuml;hren eines API-Aufrufs<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cStrURLBase<span style=\"color:blue;\"> As String<\/span> = _\r\n     \"https:\/\/cig.dhl.de\/services\/sandbox\/soap\"<\/pre>\n<p>Diese &uuml;bergeben wir als zweiten Parameter der <b>Open<\/b>-Methode von <b>objXMLHTTP<\/b>. Der erste Parameter lautet <b>post <\/b>und bedeutet, dass wir sp&auml;ter mit der <b>send<\/b>-Methode noch Informationen senden statt diese an die URL anzuh&auml;ngen.<\/p>\n<p>Danach stellen wir drei Header ein, zun&auml;chst <b>Content-Type <\/b>und <b>Content-Length<\/b>. Der erste gibt an, dass wir mit Daten im Format <b>text\/xml <\/b>mit dem Zeichensatz <b>utf-8 <\/b>arbeiten. Der zweite legt die L&auml;nge des &uuml;bermittelten XML-Dokuments fest. Der dritte Header nimmt die Zugangsdaten auf. Diese speichern wir in Form entsprechender Konstanten wieder im Kopf des Moduls <b>mdlDHL<\/b>. Die Konstanten sehen wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const strUserSandbox<span style=\"color:blue;\"> As String<\/span> = \"[EntwicklerID]\"\r\n<span style=\"color:blue;\">Public <\/span>Const strPasswordSandbox<span style=\"color:blue;\"> As String<\/span> = \"[Kennwort]\"<\/pre>\n<p>F&uuml;r <b>strUserSandbox <\/b>geben wir die Entwickler-ID aus dem Entwicklerportal an, die wir unter folgendem Link finden:<\/p>\n<pre>https:\/\/entwickler.dhl.de\/group\/ep\/mein-konto<\/pre>\n<p>F&uuml;r <b>strPasswordSandbox <\/b>hinterlegen wir das Kennwort f&uuml;r die Anmeldung am Entwicklerportal. Die Anmeldedaten werden in einer durch einen Doppelpunkt getrennten Zeichenkette zusammengefasst und Base64-kodiert.<\/p>\n<p>Dann stellen wir diesem Ausdruck den Text <b>Basic <\/b>und ein Leerzeichen voran und &uuml;bergeben dies f&uuml;r den Header <b>Authorization<\/b>. Schlie&szlig;lich ruft die Funktion die <b>send<\/b>-Methode auf und &uuml;bergibt dieser als Parameter die in <b>strRequest <\/b>gespeicherte XML-Anfrage.<\/p>\n<p>Nachdem diese ausgef&uuml;hrt wurde, k&ouml;nnen wir das Ergebnis in Form der Eigenschaft <b>status <\/b>auswerten. Der Wert <b>200 <\/b>entspricht dem Ergebnis <b>OK<\/b>. In diesem Fall stellen wir das Ergebnis der Funktion auf <b>True <\/b>ein und lesen den Inhalt der Eigenschaft <b>responseText<\/b>, die von der API gef&uuml;llt wurde, mit der <b>loadXML<\/b>-Methode in das <b>DOMDocument60<\/b>-Objekt <b>objXMLResponse <\/b>ein. Anderenfalls gibt die Funktion den Statustext mit der Fehlermeldung in einem Meldungsfenster aus.<\/p>\n<h2>Benutzerdaten manuell eingeben<\/h2>\n<p>Wenn Du die Benutzerdaten nicht im Code speichern m&ouml;chtest, kannst Du die &Uuml;bergabe der dritten Header-Zeile auch weglassen. Dann erscheint eine Meldung wie in Bild 5, um die Zugangsdaten abzufragen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_06\/pic_333_014.png\" alt=\"Manuelle Eingabe der Zugangsdaten\" width=\"424,6267\" height=\"384,5852\" \/><\/p>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000\"><a style=\"color: #ff0000\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000333\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000333?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000333\/\"\/>\n\t\t\t\t\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"8c6e41522b\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Beim Versand von Paketen kommt recht oft DHL zum Einsatz. Die einfachste Form der computergest&uuml;tzten Erstellung von Paketlabeln ist dabei das Anmelden bei DHL und das Erstellen eines Labels durch Eingabe der Adressdaten und Bezahlung auf der Webseite. Etwas mehr M&ouml;glichkeiten bietet ein Gesch&auml;ftskundenkonto beim Anbieter DHL. Hier k&ouml;nnen wir einen Schritt weitergehen und die Adressdaten beispielsweise per CSV &uuml;bermitteln. Noch sch&ouml;ner w&auml;re es, wenn wir von der jeweiligen Anwendung aus &#8211; ob es sich nun um eine Access-Datenbank, eine Excel-Tabelle oder sogar Outlook handelt &#8211; direkt per Mausklick ein Paketlabel zur Sendung eines Pakets an den jeweiligen Kontakt erstellen k&ouml;nnten, dass dann beispielsweise als PDF auf unserem Rechner landet. Wie das gelingt, zeigen wir im vorliegenden Artikel.<\/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":[662022,66062022,44000027,44000004,44000023],"tags":[],"yst_prominent_words":[],"class_list":["post-55000333","post","type-post","status-publish","format-standard","hentry","category-662022","category-66062022","category-Excel_programmieren","category-Loesungen","category-PowerApps"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000333"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000333\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000333"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}