Bestellungen mit gelöschten Produkten

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

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

Listing 3: Ausgelagerte Anweisungen zum Anpassen der Datensatzherkunft des Kombinationsfeldes zum Auswählen der Produkte

Private Sub Form_Current()
     ProdukteEinAusblenden
End Sub
Private Sub Lieferdatum_AfterUpdate()
     ProdukteEinAusblenden
End Sub

Zwischenstand

Damit haben wir nun folgendes erreicht: Wenn der Benutzer einen Bestelldatensatz anzeigt, dessen Lieferdatum bereits gesetzt ist, enthält das Kombinationsfeld Produkt-ID noch die nicht aktiven Datensätze, sodass diese noch angezeigt werden können.

Wenn er zu einem Datensatz wechselt, der eine noch nicht gelieferte Bestellung enthält, werden nicht mehr aktive Produkte nicht mehr zur Auswahl im Kombinationsfeld angeboten.

Was aber geschieht, wenn eine Bestellung angelegt wird, die ein Produkt enthält, das vor dem Eintragen des Lieferdatums als inaktiv markiert wird Wenn die Bestellung nicht direkt nach dem Anlegen versendet wird, dann zeigt diese doch eine Bestellposition an, deren Produkte nicht mehr in der Datensatzherkunft des Kombinationsfeldes ProduktID enthalten ist.

Prüfen offener Bestellpositionen beim Deaktivieren von Produkten

Die Annahme ist also, dass es offene Bestellpositionen gibt, die ein Produkt enthalten, dessen Zustand von Aktiv in Inaktiv gesetzt werden soll – beispielsweise, weil dieses Produkt nicht mehr lieferbar ist.

In diesem Fall müssten wir das Einstellen des inaktiven Zustandes mit einer Prüfung verbinden, ob es noch Bestellungen gibt, die dieses Produkt als Bestellposition enthalten.

Dazu erstellen wir ein neues Formular namens frmProdukte, das ein Formular namens sfmProdukte als Unterformular verwendet. Dieses Formular nutzt die Tabelle tblProdukte als Datensatzquelle und zeigt alle Felder dieser Tabelle außer Bild und Beschreibung an (siehe Bild 9).

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