DHL-Versand vorbereiten

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Ende Februar 2018 hat DHL die Unterstützung der Intraship-Schnittstelle beendet. Das heißt, dass wir unsere DHL-Etiketten nun auf eine andere Weise erstellen müssen. Für Datenbank-Experten kein Problem: Wir benötigen nur eine Beschreibung der gewünschten Schnittstelle und liefern dann die Daten in der gewünschten Form.

Abkündigung von Intraship

Wer DHL-Kunde ist und bisher seine Paket-Etiketten mit Intraship erstellt hat, ist von DHL per Mail hinreichend über die anstehende Einstellung dieses Services informiert worden. Wer das lange genug ignoriert hat, hat Anfang März 2018 zwar noch den Link Versenden (Intraship) auf der Startseite des Geschäftskundenportals gesehen (siehe Bild 1), aber hinter dem Link landete man dann auf einer Seite, auf der die Anmeldung nicht mehr funktionierte.

Das Versenden per Intraship funktioniert nicht mehr.

Bild 1: Das Versenden per Intraship funktioniert nicht mehr.

Stattdessen soll man nun die Benutzeroberfläche nutzen, die sich direkt über den Link Versenden öffnen lässt und der die möglichen Dienste in übersichtlicher Form darstellt (siehe Bild 2).

Neue Benutzeroberfläche für den Versand von DHL-Paketen

Bild 2: Neue Benutzeroberfläche für den Versand von DHL-Paketen

Was aber ändert sich nun für uns, wenn wir bis dahin unsere Paket-Etiketten mit Intraship erstellt haben Zunächst einmal können wir das alte Export-Format, das wir im Beitrag Versandetiketten mit DHL-Intraship (www.access-im-unternehmen.de/991) vorgestellt haben, verabschieden. Das Format war nicht gerade übersichtlich, daher ist der Wechsel zu einem neuen Format vielleicht gar nicht schlecht. Dafür programmieren wir den Export nun komplett neu. Wie die Export-Datei aussehen muss, finden wir im Anschluss heraus.

Dazu klicken wir zunächt auf den Link Sendungsdaten importieren, was den Dialog aus Bild 3 öffnet. Hier finden wir bereits die Möglichkeit, eine Vorlage auszuwählen sowie eine Schaltfläche zum Auswählen der zu importierenden CSV-Datei. Wir benötigen allerdings Informationen darüber, wie die CSV-Datei aufgebaut sein soll.

Maske zum Hochladen der CSV-Datei

Bild 3: Maske zum Hochladen der CSV-Datei

Klicken Sie hier im Text auf den Link > Vorlagen, öffnet sich der Dialog aus Bild 4.

Auswahl einer CSV-Vorlage

Bild 4: Auswahl einer CSV-Vorlage

Wenn wir uns nun beispielsweise die Vorlage DHL Vorlage Sendungsdatenimport ansehen, finden wir eine Definition der Vorlage vor, die im oberen Teil zunächst allgemeine Formatierungsvorgaben liefert (siehe Bild 5).

Aussehen einer der vorgefertigten Vorlagen

Bild 5: Aussehen einer der vorgefertigten Vorlagen

Dort legen Sie beispielsweise fest, welches Trennzeichen zwischen den Inhalten der einzelnen Spalten angegeben werden soll, welches Zeichen als Dezimalzeichen zum Einsatz kommt und wie Texte eingefasst werden – hier etwa durch Anführungszeichen. Außerdem legen Sie den Zeichensatz (hier ISO 8859-1) und das Datumsformat (TT.MM.JJ) fest.

Darunter befinden sich alle Felder, die DHL überhaupt für den Versand einer Lieferung verwenden kann

Hier wurde für alle zu verwendenden Eigenschaften die Spaltenüberschrift der zu importierenden CSV-Datei angegeben.

Nach kurzem überfliegen der angegebenen Spaltenüberschriften stellen wir fest, dass wir für unsere Zwecke viel weniger Spalten zur Verfügung stellen wollen. Dazu müssen wir eine neue Vorlage anlegen.

Neue Vorlage anlegen

Eine neue Vorlage legen wir ausgehend von der Seite Vorlagen für Sendungsdatenimport an, indem wir dort auf den Link Neue Import-Vorlage anlegen >> klicken.

Hier finden wir die gleiche Ansicht wie in der zuvor betrachteten Vorlage vor – mit dem Unterschied, dass die rechte Spalte noch nicht mit den Spaltennamen der von uns gelieferten CSV-Datei gefüllt sind.

Das kann auch nicht der Fall sein, da das System unsere CSV-Datei ja noch gar nicht kennt.

Um das zu ändern, müssten wir auch zunächst einmal eine CSV-Datei erstellen, denn diese können wir dann unter dem Punkt 2. Hochladen der Musterdatei zum Auslesen der Inhalte auswählen und mit einem Klick auf den Link Datei analysieren >> untersuchen lassen (siehe Bild 6).

Hochladen der Musterdatei

Bild 6: Hochladen der Musterdatei

Bestehende Lösung erweitern

Im Beitrag Bestellverwaltung mit Versand (www.access-im-unternehmen.de/993) haben wir bereits eine kleine Lösung programmiert, die uns per Mausklick einen CSV-Export für die bis vor kurzem aktive Schnittstelle Intraship erzeugt hat. Diese wollen wir nun aufgreifen und so anpassen, dass wir einen Export erhalten, den wir mit der neuen Schnittstelle nutzen können. In dieser Lösung haben wir mit einigen Klassen gearbeitet, von denen jede zum Zusammenstellen einer Zeile eines Satzes für eine DHL-Lieferung diente.

Unter Intraship bestand die CSV-Datei nämlich nicht nur aus einer Zeile je Datensatz, sondern die Daten wurden auf mehrere Zeilen aufgeteilt. Das ist nun natürlich hinfällig – die neue Schnittstelle nimmt nur noch eine Zeile je Datensatz an. Das heißt, dass wir die in der bestehenden Lösung verwendeten Klassen auch mehr oder weniger aufgeben können.

Jede dieser Klassen stellte einige Eigenschaften zur Verfügung, mit denen die gewünschten Werte etwa aus einem Datensatz der Datenbank gefüllt werden konnten. Außerdem lieferten die Klassen für die Eigenschaft Satz die komplette Zeile mit den Daten dieser Klasse.

Klasse zum Zusammenstellen von Datensätzen für die CSV-Datei

Eine solche Klasse wollen wir nun für die neuen Daten auch erstellen.

Wir arbeiten uns dabei durch die einzelnen Zeilen der Liste aus Bild 7 durch und berücksichtigen dabei zunächst nur die offensichtlich notwendigen Felder.

Freie Felder zum Zuweisen der Spalten der Vorlage

Bild 7: Freie Felder zum Zuweisen der Spalten der Vorlage

Hier stellt sich nun die Frage, wie wir am schnellsten zum Ziel kommen. Die bisherige Lösung bestand aus einer Hauptklasse, welche die unterschiedlichen Kategorien von Informationen wie Sendung, Benachrichtigungen, Absender, Empfänger und so weiter in einzelnen Klassen behandelt hat. Auf diese Weise war das Zusammenstellen leicht zu programmieren.

Wollen wir auf diesen Klassen aufsetzen und diese so ändern, dass diese die Daten nun so zurückliefern, wie wir sie für den Import benötigen Oder legen wir eine komplett neue Klasse an Wir entscheiden uns, die einmal gemachte Arbeit als Grundlage für den neuen Export zu nutzen und passen die bestehenden Klassen an.

Für die Hauptklasse clsDPEEMain, welche die Daten aus den Unterklassen clsDPEEShipment, clsDPEESender, clsDPEEReceiver, clsDPEEItem und clsDPEENotification zusammenstellt, brauchen wir den Code zunächst nur so zu ändern, dass die Daten, die zuvor in jeweils einer neuen Zeile aneinandergehängt wurden, nun in einer Zeile landen. Die neue Version der Eigenschaft Satz, welche die Ergebnisse der übrigen Klassen zusammensetzt, sieht nun wie folgt aus:

Public Property Get Satz() As String
     Dim strSatz As String
     strSatz = strSatz & m_DPEEShipment.Satz
     strSatz = strSatz & m_DPEESender.Satz
     strSatz = strSatz & m_DPEEReceiver.Satz
     strSatz = strSatz & m_DPEEItem.Satz
     strSatz = strSatz & m_DPEENotification.Satz
     Satz = strSatz
End Property

Geändert hat sich hier im Wesentlichen, dass wir die von der Satz-Eigenschaft der verschiedenen Klassen gelieferten Daten nicht mehr durch das Steuerzeichen vbCrLf jeweils in eine neue Zeile schreiben, sondern diese einfach aneinanderhängen. Wenn wir nun nichts weiter ändern und die Schaltfläche Versand vorbereiten im Formular frmBestellungsdetails aufrufen (siehe Bild 8), legen wir eine CSV-Datei mit der folgenden Zeichenfolge an:

Das Formular frmBestellungsdetails

Bild 8: Das Formular frmBestellungsdetails

|DPEE-SHIPMENT|EPN|20180306|||||1||||||||||||||||||EUR|||||||01||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||DPEE-SENDER|6275498028|André Minhorst Verlag||AndréMinhorst|Borkhofer Str.|17||47137|Duisburg|DE||andre@minhorst.com|0203/12121212||||||||||||||||||||||DPEE-RECEIVER|Herr André Minhorst|André Minhorst Verlag|||Herr André Minhorst|Borkhofer Str.|17||47137|Duisburg|DE||andre@minhorst.com|||||||||||||||||||DPEE-ITEM||||||PK|||DPEE-NOTIFICATION||andre@minhorst.com|||

Hier fällt zunächst auf, dass wir als Trennzeichen das Pipe-Zeichen (|) und nicht das Semikolon verwenden. Müssen wir das im Code ändern Nein, wir können auch einfach die Einstellung der noch anzulegenden Vorlage auf der DHL-Webseite auf dieses Zeichen ändern. Außerdem finden wir hier noch die Schlüsselwörter vor, die in der ursprünglichen Version jeweils den Inhalt einer Zeile markiert haben, also DPEE-SHIPMENT, DPEE-SENDER und so weiter. Diese können wir auch noch entfernen. Außerdem müssen wir, damit wir die Spalten über ihren Eigenschaftsnamen zur Vorlage zuweisen können, noch eine Zeile mit den Spaltenüberschriften vorbereiten – auch diese durch das Pipe-Zeichen voneinander getrennt.

Als Erstes wollen wir die Schlüsselwörter entfernen. Dies erledigen wir jeweils in den Public Property Satz-Eigenschaften der fünf Klassen clsDBEEItem, clsDBEE-Notification, clsDBEESender, clsDBEEReceiver und clsDBEEShipment.

In der Methode Satz der Klasse clsDPEEItem müssen wir dazu nur die Zeile entfernen, die den Text DPEE-ITEM| zur Variablen strSatz hinzufügt und die wir nachfolgend vorerst auskommentiert haben. Gleiches erledigen wir mit der Zeile, welche den Wert der Variablen m_Ordnungsnummer hinzufügt. Diese haben wir in der Methode Satz der Klasse clsDPEEMain zwar schon nicht mehr an die einzelnen Klassen übergeben, weshalb diese im obigen Beispiel für die Ausgabe nicht mehr auftauchte, aber wir wollen auch noch die leere Stelle in der Ausgabe entfernen:

Public Property Get Satz() As String
     Dim strSatz As String
     ''''strSatz = strSatz & m_Ordnungsnummer & "|"
     ''''strSatz = strSatz & "DPEE-ITEM|"
     strSatz = strSatz & m_GewichtDesPackstueckesInKg & "|"
     strSatz = strSatz & m_LaengeDesPackstueckesInCm & "|"
     strSatz = strSatz & m_BreiteDesPackstueckesInCm & "|"
     strSatz = strSatz & m_HoeheDesPackstueckesInCm & "|"
     strSatz = strSatz & m_PackstueckBeschreibung & "|"
     strSatz = strSatz & m_PackartKollitraeger & "|"
     strSatz = strSatz & m_Packstueckreferenz & "|"
     strSatz = strSatz & m_Referenznummer & "|"
''''    strSatz = Left(strSatz, Len(strSatz) - 1)
     Satz = strSatz
End Property

Schließlich entfernen wir auch noch die Zeile, die das abschließende Pipe-Zeichen entfernt – immerhin wollen wir später alle fünf Sätze in eine Zeile schreiben, wo wir auch das Trennzeichen zwischen dem letzten Element des vorhergehenden und dem ersten Element des folgenden Satzes ein Trennzeichen benötigen.

Auf die gleiche Art und Weise bearbeiten wir die Methode Satz der übrigen Klassen. Damit sieht die Ausgabe schon etwas schlanker aus:

EPN|20180306|||||1||||||||||||||||||EUR|||||||01|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
6275498028|André Minhorst Verlag||AndréMinhorst|Borkhofer Str.|17||47137|Duisburg|DE||andre@minhorst.com|
0203/12121212|||||||||||||||||||||Herr André Minhorst|André Minhorst Verlag|||Herr André Minhorst|Borkhofer
 Str.|17||47137|Duisburg|DE||andre@minhorst.com|||||||||||||||||||||||PK|||andre@minhorst.com|||

Spaltenüberschrift erstellen

Nun wollen wir die Spaltenüberschriften hinzufügen. Das ist eine reine Fleißarbeit. Wir schnappen uns dazu zum Beispiel die folgenden Anweisungen der Satz-Methode der Klasse clsDPEEItem:

strSatz = strSatz & m_GewichtDesPackstueckesInKg & "|"
strSatz = strSatz & m_LaengeDesPackstueckesInCm & "|"
strSatz = strSatz & m_BreiteDesPackstueckesInCm & "|"
strSatz = strSatz & m_HoeheDesPackstueckesInCm & "|"
strSatz = strSatz & m_PackstueckBeschreibung & "|"
strSatz = strSatz & m_PackartKollitraeger & "|"
strSatz = strSatz & m_Packstueckreferenz & "|"
strSatz = strSatz & m_Referenznummer & "|"

Dann entfernen wir die Zeilenumbrüche, den vorderen Teil bis zum Unterstrich (strSatz = strSatz & m_) lassen hinten auch nur das Pipe-Zeichen über. Das Ergebnis sieht dann für die erste Klasse wie folgt aus:

GewichtDesPackstueckesInKg|LaengeDesPackstueckesIn-Cm|Breite-DesPackstueckesInCm|HoeheDesPackstueckesIn--Cm|
Packstueck-Beschreibung|PackartKollitraeger|Packstueck-referenz|Referenznummer|

Statt dieses Zeichenkette zu speichern und bei Bedarf bereitzustellen, können wir auch den Klassen jeweils eine Eigenschaft namens Kopfzeile hinzufügen, welche am Beispiel der Klasse clsDPEEItem wie folgt aussieht:

Public Property Get Kopfzeile() As String
     Dim strKopf As String
     strKopf = strKopf & "GewichtDesPackstueckesInKg|"
     strKopf = strKopf & "LaengeDesPackstueckesInCm|"
     strKopf = strKopf & "BreiteDesPackstueckesInCm|"
     strKopf = strKopf & "HoeheDesPackstueckesInCm|"
     strKopf = strKopf & "PackstueckBeschreibung|"
     strKopf = strKopf & "PackartKollitraeger|"
     strKopf = strKopf & "Packstueckreferenz|"
     strKopf = strKopf & "Referenznummer|"
     Satz = strKopf
End Property

Diese ist dann genauso aufgebaut wie die Eigenschaft Satz. Wenn einmal eine Zeile hinzukommt oder wegfällt, können wir auch die Spaltenköpfe viel leichter anpassen. Für die beiden Klassen clsDPEESender und clsDPEEReceiver, die teilweise gleich bezeichnete Eigenschaften enthalten, stellen wir den Spaltenüberschriften noch jeweils die Zeichenkette Sender_ beziehungsweise Receiver_ voran:

Public Property Get Kopfzeile() As String
     Dim strKopf As String
     strKopf = strKopf & "Sender_Kundennummer|"
     strKopf = strKopf & "Sender_Firmenname1|"
     strKopf = strKopf & "Sender_Firmenname2|"
     strKopf = strKopf & "Sender_Kontaktperson|"
     strKopf = strKopf & "Sender_Strasse|"
     strKopf = strKopf & "Sender_Hausnummer|"
     strKopf = strKopf & "Sender_ZusaetzlicheAdressinformation|"
     strKopf = strKopf & "Sender_PLZ|"
     strKopf = strKopf & "Sender_Stadt|"
     strKopf = strKopf & "Sender_Laendercode|"
     strKopf = strKopf & "Sender_Bemerkung|"
     strKopf = strKopf & "Sender_Emailadresse|"
     ...
     Kopf = strKopf
End Property

In der Klasse clsDPEEMain fügen wir ebenfalls eine neue Methode hinzu, welche die Kopfzeilen-Anteile der einzelnen Klassen zusammenführt:

Public Property Get Kopfzeile() As String
     Dim strKopf As String
     strKopf = strKopf & m_DPEEShipment.Kopfzeile
     strKopf = strKopf & m_DPEESender.Kopfzeile
     strKopf = strKopf & m_DPEEReceiver.Kopfzeile
     strKopf = strKopf & m_DPEEItem.Kopfzeile
     strKopf = strKopf & m_DPEENotification.Kopfzeile
     Kopfzeile = strKopf
End Property

Wichtig ist hier, dass die Kopfzeilen der einzelnen Abschnitte in der gleichen Reihenfolge zusammengefügt werden wie die Inhalte der Abschnitte selbst.

Weitere änderungen

Die neue Vorlage erlaubt wohl sowohl nur ein einzelnes Packstück und auch nur eine Notification. Daher müssen wir in der Klasse clsDPEEMain ein paar Anpassungen vornehmen. Als Erstes fliegen die nachfolgend auskommentierten Zeilen aus der Methode Initialize heraus. Dafür kommen die beiden Anweisungen zur Methode hinzu, welche jeweils ein Objekt auf Basis der Klasse clsDPEEItem und eines der Klasse clsDPEENotification initialisieren:

Private Sub Class_Initialize()
     Set m_DPEEShipment = New clsDPEEShipment
     Set m_DPEESender = New clsDPEESender
     Set m_DPEEReceiver = New clsDPEEReceiver
''''    Set m_DPEEItems = New Collection
''''    Set m_DPEENotifications = New Collection
     Set m_DPEEItem = New clsDPEEItem
     Set m_DPEENotification = New clsDPEENotification
End Sub

Damit wir von außen auf die entsprechenden Elemente zugreifen können, fügen wir die beiden öffentlichen Eigenschaften hinzu:

Public Property Get DPEEItem() As clsDPEEItem
     Set DPEEItem = m_DPEEItem
End Property
Public Property Get DPEENotification() As clsDPEENotification
     Set DPEENotification = m_DPEENotification
End Property

Damit funktioniert nun auch die Methode Kopfzeile einwandfrei.

Kopfzeile abrufen

Um die Kopfzeile abrufen zu können, legen wir im Modul mdlDPEE die folgende Prozedur an:

Public Function KopfzeileErstellen()
     Dim objDPEEMain As clsDPEEMain
     Dim strKopfzeile As String
     Set objDPEEMain = New clsDPEEMain
     With objDPEEMain
         strKopfzeile = strKopfzeile _
             & .DPEEShipment.Kopfzeile
         strKopfzeile = strKopfzeile _
             & .DPEESender.Kopfzeile
         strKopfzeile = strKopfzeile _
             & .DPEEReceiver.Kopfzeile
         strKopfzeile = strKopfzeile & .DPEEItem.Kopfzeile
         strKopfzeile = strKopfzeile _
             & .DPEENotification.Kopfzeile
     End With
     KopfzeileErstellen = strKopfzeile
End Function

Funktion mit Kopfzeile testen

Wir passen nun die Methode cmdVersandVorbereiten_Click, die durch die Schaltfläche Versand vorbereiten des oben dargestellten Formulars ausgelöst wird, wie folgt an:

Private Sub cmdVersandVorbereiten_Click()
     Dim strSatz As String
     Dim strKopfzeile As String
     Dim strDateiname As String
     strKopfzeile = KopfzeileErstellen
     strSatz = SatzErstellen(Me!BestellungID)
     strDateiname = CurrentProject.Path & "\DHL_" _
         & Format(Date, "yyyymmdd") & ".csv"
     Open strDateiname For Output As #1
     Print #1, strKopfzeile
     Print #1, strSatz
     Close #1
     Call ShellExecute(Me.hWnd, "open", strDateiname, "", _
         "", SW_NORMAL)
End Sub

Wir fügen also eine Variable namens strKopfzeile hinzu und füllen diese durch einen Aufruf der Funktion KopfzeileErstellen. Die so ermittelte Zeile fügen wir dann als erste Zeile in die zu erstellende .csv-Datei ein.

Wenn wir diese nun ausführen, wird das Ergebnis aus Bild 9 in einem neuen Excel-Dokument angezeigt.

Export der Daten für den Versand eines DHL-Pakets

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar