Bestellverwaltung mit Versand

Zu einer ordentlichen Bestellverwaltung gehört die Möglichkeit, den Versand der bestellten Artikel vorzubereiten. In diesem Beitrag stellen wir das Grundgerüste einer einfachen Bestellverwaltung vor, deren Daten wir dann nutzen, um Versendungen über das DHL-Geschäftskundenportal vorzubereiten. Dazu müssen wir aus den eingegebenen Bestelldaten die Daten zu einer CSV-Datei zusammenführen, die wir dann an über das Internetportal von DHL einreichen und als Ergebnis die benötigten Versandetiketten erhalten.

Im Beitrag Versandetiketten mit DHL-IntraShip (www.access-im-unternehmen.de/991) erhalten Sie die grundlegenden Informationen über den Einsatz des Geschäftskundenportals von DHL, der Beitrag Klasse für DHL-Intraship-CSV-Dateien (www.access-im-unternehmen.de/992) liefert eine Bauanleitung für eine Klasse, mit der Sie die für die CSV-Datei benötigten Daten auf einfache Weise eingeben können.

Die Informationen dieser beiden Beiträge fließen in unsere Lösung ein, wobei wir die Daten aus Tabellen wie tblKunden, tblBestellungen, tblBestellpositionen und tblArtikel zusammensuchen.

Datenmodell

Das Datenmodell der Beispieldatenbank sieht wie in Bild 1 aus. Die enthaltenen Tabellen weisen lediglich die notwendigsten Felder auf, um Bestellungen aufzunehmen und die für den Versand notwendigen Dateien zusammenzustellen.

Datenmodell der Beispielanwendung

Bild 1: Datenmodell der Beispielanwendung

Dabei ist die Tabelle tblKunden, welche die üblichen Kundendaten enthält, per 1:n-Beziehung mit der Lookuptabelle tblAnreden verknüpft, welche die verschiedenen Anreden speichert. Auf die Kundentabelle wiederum verweist die Tabelle tblBestellung per Fremdschlüsselfeld. Auf diese Weise wird einer Bestellung der Kunde zugeordnet. Die Tabelle tblArtikel speichert ein paar grundlegende Artikeldaten wie den Artikelnamen oder den Einzelpreis. Für die Erstellung der Versanddatei ist es wichtig, das Gewicht der einzelnen Artikel zu kennen, daher finden Sie dort auch das Feld Gewicht. Schließlich nimmt das Feld Kurzbezeichnung eine Abkürzung für den Artikelnamen auf. Wozu wir dies benötigten, erfahren Sie weiter unten.

Die Bestellungen und die Artikel führt die Tabelle tblBestellpositionen zusammen. Sie ordnet die einzelnen Artikel aus der Tabelle tblArtikel den Bestellungen zu. Dabei sollen der aktuelle Preis und das aktuelle Gewicht des Artikels in zwei entsprechenden Feldern dieser Tabelle gespeichert werden. Damit sichern wir die zum Zeitpunkt der Bestellung gültigen Daten, falls sich Preis oder Gewicht eines Artikels einmal ändern sollten.

Die Tabelle tblBestellpositionen nimmt aber auch noch ein Feld namens Versanddatum auf, welches bei Erstellung des Versandetiketts mit dem entsprechenden Datum gefüllt wird. Auf diese Weise erkennen wir, dass ein Artikel bereits versendet wurde. Schließlich finden Sie in dieser Tabelle das Feld Sendungsverfolgung. Wenn wir schon mit DHL-Paketen arbeiten, die sich ja online verfolgen lassen, wollen wir auch die dazugehörige Trackingnummer in der Tabelle speichern. Diese erhalten wir bei der Verwendung der nachfolgenden Technik zwar nur auf einem kleinen Umweg, aber immer noch schneller, als wenn wir diese von Hand eintragen.

Formulare der Lösung

Das erste Formular heißt frmBestellungsdetails und soll die einfache Eingabe von Bestellungen ermöglichen (s. Bild 2). Dazu geben Sie das Bestelldatum im Feld Bestelldatum ein und wählen einen der bereits angelegten Kunden aus dem Kombinationsfeld cboKundeID aus. Gegebenenfalls handelt es sich um einen neuen Kunden – diesen können Sie dann über einen Klick auf die Schaltfläche mit den drei Punkten neben dem Kombinationsfeld in einem weiteren Formular hinzufügen.

Das Formular frmBestellungsdetails in der Formularansicht

Bild 2: Das Formular frmBestellungsdetails in der Formularansicht

Mit dieser Schaltfläche können Sie das gleiche Formular nach der Auswahl eines Kunden öffnen, um dessen Kundendaten zu bearbeiten (s. Bild 3).

Bearbeiten der Kundendetails

Bild 3: Bearbeiten der Kundendetails

Unten finden Sie ein Unterformular in der Datenblattansicht vor, mit dem Sie die Bestellpositionen zu der aktuellen Bestellung hinzufügen können. Dazu wählen Sie den gewünschten Artikel mit dem Kombinationsfeld aus.

Dadurch stellt das Unterformular automatisch die Inhalte der Felder Einzelpreis und Gewicht auf die in der zugrunde liegenden Tabelle tblArtikel ein und legt für das Feld Menge den Standardwert 1 fest. Ein Klick auf die Schaltfläche cmdVersandVorbereiten soll schließlich die CSV-Datei genau für diese eine Bestellung anlegen.

Das zweite Formular namens frmBestellungsdetails_Versand ist etwas anders aufgebaut (s. Bild 4). Es soll zunächst alle Bestellpositionen, deren Gewicht größer als 0 ist, anzeigen – egal, ob diese bereits versendet wurden oder nicht. Oben bietet eine Optionsgruppe die Möglichkeit, alternativ alle Bestellpositionen anzuzeigen, die bereits versendet wurden, oder diejenigen, die noch nicht versendet wurden.

Das Formular frmBestellungsdetails_Versand in der Formularansicht

Bild 4: Das Formular frmBestellungsdetails_Versand in der Formularansicht

Auch hier gibt es eine Schaltfläche namens cmdVersandVorbereiten. Diese berücksichtigt aber direkt alle noch offenen Bestellpositionen, also diejenigen, deren Feld Versanddatum noch leer ist.

Formular frmBestellungsdetails erstellen

Das Formular frmBestellungsdetails sieht im Entwurf wie in Bild 5 aus. Es verwendet die Tabelle tblBestellungen als Datenherkunft. Das Kombinationsfeld cboKun-deID bezieht seine Daten aus der folgenden Abfrage:

Das Formular frmBestellungsdetails in der Entwurfsansicht

Bild 5: Das Formular frmBestellungsdetails in der Entwurfsansicht

SELECT [KundeID], [Firma] FROM tblKunden;

Wenn der Benutzer auf die Schaltfläche cmdKundendetails klickt, löst dies die Prozedur aus Listing 1 aus. Dies öffnet das Formular frmKundendetails. Wenn für das Kombinationsfeld cboKundeID noch kein Eintrag ausgewählt wurde, soll das Formular frmKundendetails einen neuen, leeren Datensatz anzeigen, anderenfalls den aktuell im Kombinationsfeld ausgewählten. Zu diesem Zweck wird der Primärschlüsselwert für diesen Datensatz per öffnungsargument an das Formular frmKundendetails übergeben.

Private Sub cmdKundendetails_Click()
     If IsNull(Me!cboKundeID) Then
         DoCmd.OpenForm "frmKundendetails", DataMode:=acFormAdd
     Else
         DoCmd.OpenForm "frmKundendetails", DataMode:=acFormEdit, OpenArgs:=Me!cboKundeID
     End If
     Set frmKundendetails = Forms!frmKundendetails
     With frmKundendetails
         .Modal = True
         .OnUnload = "[Event Procedure]"
     End With
End Sub

Listing 1: öffnen des Formulars zum Bearbeiten der Kundendetails oder zum Erstellen eines neuen Kunden

In beiden Fällen speichert die Prozedur nun einen Verweis auf das Formular in der Variablen frmKundendetails, welches im Kopf des Klassenmoduls des Formulars frmBestellungsdetails wie folgt deklariert wurde:

Dim WithEvents frmKundendetails As Form

Dadurch können wir in diesem Klassenmodul auch Ereignisprozeduren für dieses Formular implementieren. In diesem Fall möchten wir auf das Ereignis Beim Entladen reagieren, indem wir den aktuell im Formular frmKundendetails angezeigten Datensatz einlesen und im Kombinationsfeld cboKundeID auswählen. Dazu stellen wir zunächst die Eigenschaft OnUnload von frmKundendetails auf den Wert [Event Procedure] ein. Dieses Ereignis programmieren wir dann wie folgt:

Private Sub frmKundendetails_Unload(Cancel As Integer)
     If Not IsNull(frmKundendetails!KundeID) Then
         Me!cboKundeID.Requery
         Me!cboKundeID = frmKundendetails!KundeID
     End If
End Sub

Dies sorgt dafür, dass wenn der Benutzer das Formular frmKundendetails schließt, vorher noch das Ereignis frmKundendetails_Unload im Klassenmodul des Formulars frmBestellungsdetails ausgeführt wird und zweierlei erledigt: die Datensatzherkunft des Kombinationsfeldes cboKundeID zu aktualisieren und den aktuell im Formular angezeigten Datensatz dort auszuwählen.

Kundendetails bearbeiten

Damit das Formular frmKundendetails gleich beim öffnen den richtigen Datensatz anzeigt, legen Sie die folgende Prozedur für das Ereignis Beim öffnen des Formulars an:

Private Sub Form_Open(Cancel As Integer)
     If Not IsNull(Me.OpenArgs) Then
         Me.Recordset.FindFirst "KundeID = " & Me.OpenArgs
     End If
End Sub

Diese prüft, ob das öffnungsargument einen Wert enthält, und stellt das Formular in diesem Fall auf den betroffenen Datensatz ein.

Versand vorbereiten

Die Schaltfläche cmdVersandVorbereiten im unteren Bereich löst die folgende Prozedur aus:

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

Diese ruft zunächst die Funktion SatzErstellen auf und übergibt dabei den Primärschlüsselwert der aktuell angezeigten Bestellung als Parameter. Diese Funktion erstellt die CSV-Datei auf Basis der Daten zu den Bestellpositionen dieser Bestellung und liefert den Inhalt im String-Format an die Variable strSatz zurück (siehe weiter unten). Die folgende Anweisung stellt einen Dateinamen zusammen, der aus dem Verzeichnis der aktuellen Datenbank, der Zeichenfolge DHL_, dem Datum im Format yyyymmdd und der Dateiendung .csv besteht, also etwa DHL_20150630.csv. Dann öffnet sie eine neue Textdatei unter diesem Namen, schreibt den Inhalt der Variablen strSatz hinein und schließt die Datei wieder. Schließlich öffnet die Prozedur die neu erstellte Datei noch mit der dafür vorgesehenen Anwendung – in diesem Fall mit Excel. Das Ergebnis sieht dann beispielsweise wie in Bild 6 aus.

Frisch erstellte Versanddatei in Excel

Bild 6: Frisch erstellte Versanddatei in Excel

Unterformular

Damit das Unterformular gleich den Einzelpreis, das Gewicht und die Menge für die Bestellposition einstellt, legen wir für das Ereignis Vor Aktualisierung des Kombinationsfeldes cboArtikelID noch die folgende Ereignisprozedur an:

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar