Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2008.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Kopieren Sie per 1:n- oder m:n-Beziehung verknüpfte Daten.

Techniken

VBA, Formulare

Voraussetzungen

Access 2000 und höher

Beispieldateien

VerknuepfteDatenKopieren.mdb

Shortlink

607

Daten aus verknüpften Tabellen kopieren

André Minhorst, Duisburg

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

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

pic003.tif

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

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

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.

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Verwandte Beiträge:

Indizierung mit Access

SQL-Datenbankschema auslesen

DAO: Tabellen, Felder und Co. bearbeiten

m:n-Beziehung per Kontrollkästchen verwalten

Aktionsabfragen mit SQL

Bücherverwaltung

Reihenfolge manuell anpassen

Preise und Mehrwertsteuer verwalten

Tabellen und Felder dokumentieren

© 2003-2015 André Minhorst Alle Rechte vorbehalten.