Daten aus verknüpften Tabellen kopieren

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

Abb. 1 zeigt die beiden Tabellen der 1:n-Beziehung. Die Daten dieser Tabellen werden im Formular aus Abb. 2 bearbeitet.

pic001.png

Abb. 1: Die Daten dieser Tabellen sollen komplett dupliziert werden.

pic003.png

Abb. 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 Abb. 3 an, die folgenden Code erzeugt:

pic002.png

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

Kopieren per DAO

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