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.
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.
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).
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.
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).
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).
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).
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).
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