Wer mal eine Rechnungsverwaltung entwickelt und vielleicht auch eingesetzt hat, kennt das: Ach, der Kunde hat doch schon mal bestellt … und sogar fast die gleichen Positionen! Da wäre es doch praktisch, wenn man den alten Rechnungsdatensatz einfach kopieren könnte. Wie das funktioniert, zeigt Ihnen dieser Beitrag für die relevanten Beziehungsarten, also 1:n- und m:n-Beziehungen.
Beziehungsgeflechte
Rechnungen beziehen ihre Daten meist aus Tabellen, die in 1:n- beziehungsweise m:n-Beziehungen zueinander stehen. Der einfachere Fall ist die 1:n-Beziehung: Hier gibt es auf der einen Seite lediglich den Rechnungsdatensatz und auf der anderen Seite eine Tabelle mit den Positionen, wobei man in diesem Fall davon ausgeht, dass die Positionen individuellen Charakter besitzen.
Dies kommt beispielsweise vor, wenn man als Softwareentwickler Anwendungen oder sonstige Dienstleistungen abrechnet – einen Katalog wie bei einem Webshop gibt es hier nicht.
Dies ist aber der Fall, wenn man tatsächlich mit Produkten handelt: Dann gibt es eine Tabelle mit den Bestell- beziehungsweise Rechnungsdaten, eine Artikeltabelle sowie eine Tabelle, die beide in Beziehung bringt und die Bestellpositionen enthält. Diese Tabelle dient als Verknüpfungstabelle und erzeugt eine m:n-Beziehung zwischen der Bestell- und der Artikeltabelle.
Für beides enthält die Beispieldatenbank einfache Beispieltabellen und -formulare. Im richtigen Leben würden diese weit mehr Informationen enthalten, aber zu Beispielzwecken reichen die vorhandenen Felder aus.
Daten aus 1:n-Beziehungen kopieren
Bild 1 zeigt die beiden Tabellen der 1:n-Beziehung. Die Daten dieser Tabellen werden im Formular aus Bild 2 bearbeitet.
Bild 1: Die Daten dieser Tabellen sollen komplett dupliziert werden.
Bild 3: Anlegen einer Schaltfläche zum Duplizieren eines Datensatzes per Assistent
Dieses Formular enthält die Daten der Tabelle tblRechnungen sowie ein Unterformular, das mit der Tabelle tblPositionen als Datenherkunft bestückt ist.
Die beiden Formulare werden über das Feld RechnungID synchronisiert (siehe Eigenschaften Verknüpfen von und Verknüpfen nach des Unterformular-Steuerelements).
Im unteren Bereich des Formulars befinden sich zwei Schaltflächen, eine zum Schließen des Formulars und eine zum Anlegen einer neuen Rechnung basierend auf der aktuell angezeigten Rechnung.
Letztere gilt es nun mit einer Funktion zu belegen, die zwei Aufgaben erledigt:
- das Kopieren des Datensatzes des Hauptformulars und
- das Kopieren der mit dem Datensatz im Hauptformular verknüpften Datensätze im Unterformular.
Es gibt mehrere Ansätze, um dies zu erledigen. Wer gerade in Access einsteigt, probiert möglicherweise, eine passende Funktion über den Schaltflächen-Assistenten zu finden.
Dieser bietet beispielsweise die Option aus Bild 3 an, die folgenden Code erzeugt:
Bild 2: Formular zur Bearbeitung von Rechnungen und Rechnungspositionen
Private Sub Befehl8_Click() ... DoCmd.DoMenuItem acFormBar, acEditMenu, _ 8, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, _ 2, , acMenuVer70 DoCmd.DoMenuItem acFormBar, acEditMenu, _ 5, , acMenuVer70 ... End Sub
Ganz davon abgesehen, dass dieser Code nur den im Hauptformular enthaltenen Datensatz kopiert, ist diese Vorgehensweise natürlich erstens völlig veraltet und zweitens nicht angemessen, denn die DoCmd-Anweisungen sollte man allein aus Performance-Gründen nur einsetzen, wenn es wirklich nicht anders geht – erst recht nicht, wenn damit Menübefehle aufgerufen werden, die in einer seit vielen Jahren überholten Access-Version festgelegt wurden (der obige Code wird mit Access 2003 übrigens unverändert so erzeugt, erst ab Access 2007 gibt es eine neue Variante, die für VBA-Programmierer noch gruseliger anmutet: dort baut der Assistent ein Makro zusammen).