Bestellposition per Datenmakro ergänzen

Bestellpositionen speichern wir in einer eigenen Tabelle beispielsweise namens tblBe-stellpositionen, die als m:n-Verknüpfungstabelle zwischen Tabellen wie tblBestellungen und tblProdukte dient. Diese Tabelle nimmt dann jeweils noch Felder auf wie Einzelpreis, Mehrwertsteuersatz und Einheit, die wir aus der Produkte-Tabelle in die Bestellpositionen-Tabelle kopieren. Damit das automatisch beim Anlegen einer Bestellposition geschieht, fügen wir normalerweise ein Ereignis zum Eingabeformular für die Bestellpositionen hinzu, das diese Daten ausliest und in die Bestellposition einträgt. Es gibt jedoch noch eine Alternative: Dabei verwenden wir ein Datenmakro, das durch das Ereignis “Vor Änderung” des Datensatzes ausgelöst wird und verlegen die Logik damit in die Tabelle selbst. Wie das gelingt, zeigt der vorliegende Beitrag.

Beteiligte Tabellen

Die hier vorgestellte Lösung soll dazu dienen, die Daten aus mehreren Tabellen zum Zwecke der Archivierung direkt in die Tabelle tblBestellpositionen zu schreiben. Der Hintergrund ist, dass sich die Daten von Produkten wie Einzelpreis und Mehrwertsteuersatz sowie die Einheiten immer mal ändern können. Wenn wir diese Informationen dann nicht mit einer Bestellposition gespeichert haben und zu einem späteren Zeitpunkt beispielsweise die Umsätze für einen Zeitraum in der Vergangenheit untersuchen wollen, müssen wir die Daten aus den Tabellen tblBestellpositionen, tblProdukte und tblMehrwertsteuersaetze zusammensuchen. Das Problem dabei ist, dass die Daten in diesen Tabellen sich mittlerweile geändert haben könnten und wir nicht die in diesem Zeitraum tatsächlich gültigen Preise und Mehrwertsteuersätze berücksichtigen können.

Die an dieser Situation beteiligten Tabellen sehen Sie in Bild 1.

Beteiligte Tabellen dieser Lösung

Bild 1: Beteiligte Tabellen dieser Lösung

Damit das geschilderte Problem nicht auftritt und wir zu jedem Zeitpunkt die tatsächlichen Umsätze für die jeweiligen Rechnungspositionen zusammentragen können, müssen wir die zu diesem Zeitpunkt gültigen Preise und Mehrwertsteuersätze irgendwo speichern. Dazu nutzen wir die Verknüpfungstabelle tblBestellpositionen und fügen dieser drei Felder namens Einzelpreis, Mehrwertsteuersatz und EinheitID hinzu, die wir beim Hinzufügen einer Bestellposition aus den verknüpften Tabellen füllen. Zusätzlich finden Sie hier noch das Feld Rabatt, dass auch für jede Bestellposition individuell festgelegt werden kann.

Übliche Vorgehensweise

Normalerweise würden Sie für das Hinzufügen der genannten Daten zu einer Bestellposition ein Ereignis nutzen, das nach dem Auswählen des entsprechenden Produkts ausgelöst wird.

Dies geschieht in einem Formular etwa namens frmBestellungen, das an die Daten der Tabelle tblBestellungen gebunden ist. Dieses enthält wiederum ein Unterformular namens sfmBestellungen, das die Daten der Tabelle tblBestellpositionen anzeigt, und zwar in der Datenblattansicht (siehe Bild 2).

Formular zum Verwalten von Bestellungen und Bestellpositionen

Bild 2: Formular zum Verwalten von Bestellungen und Bestellpositionen

Dieses Unterformular zeigt alle Felder der Tabelle tblBestellpositionen mit Ausnahme des Primärschlüsselfeldes ID und des Fremdschlüsselfeldes BestellungID an. Die Daten des Unterformulars werden über dieses Fremdschlüsselfeld mit dem Feld ID des Datensatzes im übergeordneten Formular frmBestellungen verknüpft, sodass das Unterformular immer nur die zur aktuellen Bestellung gehörenden Bestellpositionen anzeigt. Durch diese Verknüpfung erhalten außerdem neu angelegte Bestellpositionen automatisch den Wert des Feldes ID der Bestellung im Hauptformular als Wert für das Fremdschlüsselfeld BestellungID der Tabelle tblBestellpositionen.

Damit nach der Auswahl eines neuen Produkts aus dem Nachschlagefeld ProduktID im Unterformular direkt die Daten aus den verknüpften Tabellen in den aktuellen Datensatz geschrieben werden, hinterlegen wir eine Ereignisprozedur für das Ereignis Vor Aktualisierung des Nachschlagefeldes. Dieses haben wir zu diesem Zweck in cboProduktID umbenannt.

Die Prozedur finden Sie in Listing 1. Sie deklariert eine Database-Objektvariable, die wir mit einem Verweis auf das aktuelle Database-Objekt füllen sowie eine Variable für ein Recordset-Objekt, das auf die Daten der Tabelle tblProdukte verweisen soll – hier genau auf den Datensatz, den der Benutzer mit dem Kombinationsfeld cboProduktID ausgewählt hat.

Private Sub cboProduktID_BeforeUpdate(Cancel As Integer)
     Dim db As DAO.Database
     Dim rstProdukte As DAO.Recordset
     Dim curMehrwertsteuersatz As Currency
     Set db = CurrentDb
     Set rstProdukte = db.OpenRecordset("SELECT * FROM tblProdukte WHERE ID = " & Me!ProduktID, dbOpenDynaset)
     Me!Einzelpreis = rstProdukte!Einzelpreis
     Me!EinheitID = rstProdukte!EinheitID
     curMehrwertsteuersatz = DLookup("Mehrwertsteuersatzwert", "tblMehrwertsteuersaetze", "ID = " _
         & rstProdukte!MehrwertsteuersatzID)
     Me!Mehrwertsteuersatz = curMehrwertsteuersatz
End Sub

Listing 1: Ereignisprozedur beim Auswählen eines Produkts für eine Bestellposition

Nach dem Ermitteln dieses Datensatzes schreibt die Prozedur die Werte der Felder Einzelpreis und EinheitID dieses Datensatzes in die entsprechenden Felder des aktuell im Unterformular angezeigten Datensatzes der Tabelle tblBestellpositionen. Schließlich ermittelt sie noch mit einer DLookup-Funktion den Mehrwertsteuersatzwert aus der Tabelle tblMehrwertsteuersaetze für die MehrwertsteuersatzID des gewählten Produkts.

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

TestzugangOder bist Du bereits Abonnent? Dann logge Dich gleich hier ein. Die Zugangsdaten findest Du entweder in der aktuellen Print-Ausgabe auf Seite U2 oder beim Online-Abo in der E-Mail, die Du als Abonnent regelmäßig erhältst:

Schreibe einen Kommentar