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

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

pic001.png

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

pic003.png

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:

pic002.png

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

Kopieren per DAO

Prinzipiell gibt es zwei Möglichkeiten, Daten per VBA zu kopieren: Mit einer der Datenzugriffsbibliotheken DAO oder ADO (wobei DAO wohl die zukunftssichere Variante sein dürfte) oder durch Absetzen geeigneter SQL-Aktionsabfragen mit der Execute-Methode des Database-Objekts.

Viele greifen zur DAO-Methode, weil es ihnen der einzig sichere Weg scheint, um die ID des neu angelegten Rechnungsdatensatzes zu erfahren und diese anschließend den zu kopierenden Rechnungspositionen zuzuweisen. Dies könnte beispielsweise wie in Listing 1 aussehen. Im ersten Schritt erzeugt diese Routine einen neuen Datensatz in der Tabelle tblRechnungen und schreibt die aktuell im Formular angezeigten Daten dort hinein. Dabei ermittelt sie vor dem Speichern des neuen Datensatzes den neuen Wert von RechnungID. Dies ist wichtig, damit die kopierten Positionen-Datensätze direkt der richtigen Rechnung zugeordnet werden können. Der Rest ist Fleißarbeit – die Routine öffnet eine Datensatzgruppe mit allen Positions-Datensätzen, die zur aktuellen Rechnung gehören, und eine weitere Datensatzgruppe, in die sie die Kopien schreibt – natürlich unter Angabe der ArtikelID des neuen Artikels.

Listing 1: Kopieren verknüpfter Datensätze per DAO

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar