Bestellungen mit gelöschten Produkten

In einer Bestellverwaltung verwalten Sie Kunden, Bestellungen und Bestellpositionen mit den jeweiligen Produkten. Gelegentlich werden Produkte aus dem Programm genommen. Das ist für neue Bestellungen kein Problem – die Auswahl des Produkts einer Bestellposition kann auf vorhandene Produkte beschränkt werden. Aber wie gehen wir vor, wenn wir bereits ausgelieferte Bestellungen betrachten wollen, die Bestellpositionen mit Produkten enthalten, die nicht mehr im Programm sind Wie das gelingt, zeigen wir in diesem Beitrag.

Datenmodell der Beispielanwendung

Die Beispielanwendung zu diesem Beitrag enthält die üblichen Tabellen einer Bestellverwaltung mit den mindestens notwendigen Feldern, deren Datenmodell Sie in Bild 1 sehen.

Beziehungsfenster des Datenmodells der Beispieldatenbank

Bild 1: Beziehungsfenster des Datenmodells der Beispieldatenbank

Interessant ist hier vor allem die Tabelle tblProdukte. Die Produkte werden in der Tabelle tblBestellpositionen zu einer Bestellung aus der Tabelle tblBestellungen hinzugefügt. Hinzu kommen in der Tabelle tblBestellpositionen noch andere Felder, um die zum Zeitpunkt der Bestellung gültigen Werte für den Einzelpreis und den Mehrwertsteuersatz festzuhalten.

Beispielformular zur Verwaltung von Bestellungen

Das Zusammenstellen einer Bestellung erledigen wir im Formular frmBestellungDetail, das an die Tabelle tblBestellungen gebunden ist und alle Felder dieser Tabelle im Detailbereich anzeigt.

Außerdem enthält es ein Unterformular namens sfmBestellungDetail. Dieses ist an die Tabelle tblBestellpositionen gebunden und zeigt die Felder ProduktID, Einzelpreis, Mehrwertsteuersatz und Menge in der Datenblattansicht an. Damit es immer die Bestellpositionen zu der im Hauptformular angezeigten Bestellung liefert, erhält die Eigenschaft Verknüpfen von des Unterformular-Steuerelements den Wert BestellungID und die Eigenschaft Verknüpfen nach den Wert ID. Dies sieht im Entwurf wie in Bild 2 aus.

Entwurf des Formulars frmBestellungDetail

Bild 2: Entwurf des Formulars frmBestellungDetail

Wenn Sie in die Formularansicht wechseln, können Sie nach dem Anlegen eines Datensatzes in der Tabelle tblBestellungen über das Hauptformular damit beginnen, die Bestellpositionen hinzuzufügen.

Dazu wählen Sie einfach aus dem Kombinationsfeld ProduktID das gewünschte Produkt aus (siehe Bild 3).

Formularansicht des Formulars frmBestellungDetail

Bild 3: Formularansicht des Formulars frmBestellungDetail

Damit die Werte für die Felder Mehrwertsteuersatz und Einzelpreis aus der Tabelle tblProdukte beziehungsweise tblMehrwertsteuersaetze entnommen und direkt in den neuen Datensatz der Tabelle tblBestellpositionen eingetragen werden, legen wir für das Ereignis Nach Aktualisierung des Kombinationsfeldes eine Ereignisprozedur an. Diese sieht wie in Listing 1 aus. Die Prozedur ermittelt per DLookup-Funktion den Einzelpreis für das hinzugefügte Produkt aus der Tabelle tblProdukte. Danach liest sie, ebenfalls per DLookup, den Wert des Feldes MehrwertsteuersatzID der Tabelle tblProdukte ein. Da wir aber den Mehrwertsteuersatz in der Tabelle tblBestellpositionen nicht als Fremdschlüsselfeld auf einen Eintrag der Tabelle tblMehrwertsteuersaetze anlegen wollen, sondern den Prozentsatz speichern wollen, müssen wir diesen anschließend noch aus der Tabelle tblMehrwertsteuersaetze auslesen.

Private Sub ProduktID_AfterUpdate()
     Dim lngMehrwertsteuersatzID As Long
     Me!Einzelpreis = DLookup("Einzelpreis", "tblProdukte", "ID = " & Me!ProduktID)
     lngMehrwertsteuersatzID = DLookup("MehrwertsteuersatzID", "tblProdukte", "ID = " & Me!ProduktID)
     Me!Mehrwertsteuersatz = DLookup("Mehrwertsteuersatz", "tblMehrwertsteuersaetze", "ID = " & lngMehrwertsteuersatzID)
End Sub

Listing 1: Einfügen von Mehrwertsteuersatz und Einzelpreis nach dem Einfügen einer Bestellposition

Angezeigte Produkte einschränken

Nun wollen wir Produkte, die nicht mehr verfügbar sind, nicht mehr im Kombinationsfeld des Unterformulars sfmBestellungDetail auflisten. Deshalb haben wir vorsorglich schon einmal ein Feld namens Aktiv in den Entwurf der Tabelle tblProdukte eingearbeitet (siehe Bild 4). Dieses stellen standardmäßig auf den Wert Ja ein, damit neu angelegte Produkte direkt als aktiviert markiert sind.

Entwurf der Tabelle tblProdukte mit dem Feld Aktiv

Bild 4: Entwurf der Tabelle tblProdukte mit dem Feld Aktiv

Für Produkte, die nicht mehr aktiv sein sollen, müssen wir dann manuell den Wert des Feldes Aktiv auf Nein einstellen (siehe Bild 5).

Einstellen der Werte des Feldes Aktiv

Bild 5: Einstellen der Werte des Feldes Aktiv

Damit können wir nun die Datensatzherkunft des Kombinationsfeldes anpassen. Der bereits vorhandenen Abfrage, die durch die Übernahme der Konfiguration des Nachschlagefeldes der Tabelle tblBestellpositionen für das Kombinationsfeld angelegt wurde, fügen wir das Feld Aktiv aus der Tabelle tblProdukte hinzu und legen dafür als Kriterium den Vergleichswert Wahr fest (siehe Bild 6).

Neue Datensatzherkunft für das Kombinationsfeld zur Auswahl des Produkts einer Bestellposition

Bild 6: Neue Datensatzherkunft für das Kombinationsfeld zur Auswahl des Produkts einer Bestellposition

Wenn Sie dann im Formular frmBestellungDetail in die Formularansicht wechseln, taucht ein als nicht mehr aktiv markierter Eintrag nicht mehr im Kombinationsfeld auf (siehe Bild 7).

Das als nicht aktiv markierte Produkt taucht nicht mehr in der Liste auf.

Bild 7: Das als nicht aktiv markierte Produkt taucht nicht mehr in der Liste auf.

Wechseln Sie dann allerdings zu einem Datensatz, der das nicht mehr aktive Produkt bereits in einer Bestellposition enthält, wird dieses nicht mehr im Kombinationsfeld im Unterformular angezeigt (siehe Bild 8).

Ist das nicht mehr aktive Produkt bereits in einer Bestellung vorhanden, wird es allerdings nicht mehr im Kombinationsfeld angezeigt.

Bild 8: Ist das nicht mehr aktive Produkt bereits in einer Bestellung vorhanden, wird es allerdings nicht mehr im Kombinationsfeld angezeigt.

Wir müssen uns also überlegen, wie wir erkennen, ob gerade ein Datensatz im Formular frmBestellungDetail angezeigt wird, der bereits versendet ist, und in diesem Fall die Datensatzherkunft des Kombinationsfeldes zur Auswahl der Produkte anpasst.

Das können wir beispielsweise erledigen, indem wir das Lieferdatum abfragen. Ist dieses leer, sollen nicht mehr aktive Produkte noch angezeigt werden.

Anderenfalls ist die Bestellung noch nicht als geliefert markiert und es ist korrekt, wenn das Produkt nicht mehr auswählbar ist. Wir realisieren wir das

Ganz einfach: Wir legen eine Ereignisprozedur an, die beim Wechseln des Datensatzes im Hauptformular ausgelöst wird und die den Wert des Feldes Lieferdatum ermittelt. Wenn das Feld Lieferdatum den Wert Null hat, sollen nur die aktiven Produkte angezeigt werden. Wenn das Feld Lieferdatum nicht Null ist, soll das Kombinationsfeld alle Produkte liefern (siehe Listing 2).

Private Sub Form_Current()
     Dim strSQL As String
     If IsNull(Me!Lieferdatum) Then
         strSQL = "SELECT ID, Bezeichnung, Aktiv FROM tblProdukte WHERE Aktiv=True"
     Else
         strSQL = "SELECT ID, Bezeichnung, Aktiv FROM tblProdukte"
     End If
     Me!sfmBestellDetail.Form.ProduktID.RowSource = strSQL
End Sub

Listing 2: Ein- und Ausblenden der nicht mehr aktiven Artikel aus der Datensatzherkunft des Kombinationsfeldes zur Auswahl der Produkte

Wenn Sie es genau nehmen, müssen Sie auch für das Feld zur Eingabe des Lieferdatums eine Ereignisprozedur vorsehen, die nach der Aktualisierung des enthaltenen Wertes die Datensatzherkunft des Kombinationsfeldes aktualisiert.

Also lagern wir die Anweisungen der Prozedur Form_Current in eine eigene Prozedur namens Produkte-EinAusblenden aus, die wie in Listing 3 aussieht. Die beiden Prozeduren, die durch das Ereignis Beim Anzeigen des Hauptformulars und durch das Ereignis Nach Aktualisierung des Textfeldes Lieferdatum ausgelöst werden, sehen so aus:

Private Sub ProdukteEinAusblenden()
     Dim strSQL As String
     If IsNull(Me!Lieferdatum) Then
         strSQL = "SELECT ID, Bezeichnung, Aktiv FROM tblProdukte WHERE Aktiv=True"
     Else
         strSQL = "SELECT ID, Bezeichnung, Aktiv FROM tblProdukte"
     End If
     Me!sfmBestellDetail.Form.ProduktID.RowSource = strSQL
End Sub

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar