Datensatz duplizieren

Manchmal möchten Sie einen neuen Datensatz auf Basis eines bereits vorhandenen Datensatzes anlegen – beispielsweise um diesen anschließend anzupassen. Dazu gibt es unter Access verschiedene Möglichkeiten – per Benutzeroberfläche oder auch per VBA. Wir schauen uns die Varianten an.

Beispieldatenbank

Für die Beispiele haben wir eine kleine Beispieldatenbank mit den Tabellen der Südsturm-Datenbank erstellt. Diese enthält ein Haupt- und ein Unterformular, wobei das Unterformular die Datensätze der Tabelle tblArtikel in der Datenblattansicht anzeigt. Damit und mit verschiedenen Schaltflächen im Hauptformular wollen wir die Möglichkeiten zum Duplizieren vorstellen (s. Bild 1).

Beispielformular dieses Beitrags

Bild 1: Beispielformular dieses Beitrags

Datensatz von Hand in der Datenblattansicht kopieren

Die einfachste Variante, einen Datensatz zu duplizieren, erfordert ein paar Mausklicks. Dazu markieren Sie den zu duplizierenden Datensatz per Mausklick auf den grauen Kasten links vom Datensatz, kopieren diesen per Strg + C oder Kontextmenübefehl, klicken dann auf den gleichen Bereich in der Zeile für einen neuen, leeren Datensatz und fügen den zu duplizierenden Datensatz dann per Strg + V oder den entsprechenden Kontextmenübefehl an dieser Stelle ein (s. Bild 2).

Datensatz von Hand in der Datenblattansicht kopieren

Bild 2: Datensatz von Hand in der Datenblattansicht kopieren

Diese Variante funktioniert einwandfrei (solange keine eindeutig indizierten Felder enthalten sind). Das einzige eindeutig indizierte Feld ist das Primärschüsselfeld, und dieses wird bei dieser Methode ganz einfach durch die Autowert-Funktion mit einem neuen Wert belegt.

Duplizieren mit Tastaturbefehlen

Die Aktionen der Benutzeroberfläche lassen sich in der Regel durch VBA-Befehle der Klasse DoCmd abbilden – oder durch den Aufruf der RunCommand-Methode mit einem ihrer zahlreichen Parameter. Die RunCommand-Methode ist dabei wiederum eine Methode der DoCmd-Klasse, aber auch des Application-Objekts. Sie können diese Anweisung daher auch ohne Voranstellen des entsprechenden Objekts einsetzen. Also legen wir eine Schaltfläche im Hauptformular an, welche den aktuell markierten Datensatz im Unterformular duplizieren soll. Den kompletten Ablauf steuern wir fast ausschließlich mit der RunCommand-Anweisung:

Private Sub cmdDuplizierenMitDoCmd_Click()
     Me!sfmArtikel.SetFocus
     RunCommand acCmdSelectRecord
     RunCommand acCmdCopy
     RunCommand acCmdRecordsGoToNew
     RunCommand acCmdSelectRecord
     RunCommand acCmdPaste
End Sub

Die einzige Ausnahme ist das Setzen des Fokus auf das Unterformular, denn sonst würde beispielsweise die Anweisung RunCommand acCmdSelectRecord auf das aktuelle Formular angewendet werden – und da wir soeben auf eine Schaltfläche im Hauptformular geklickt haben, wäre dies das Hauptformular.

Nach dem Verschieben des Fokus auf das Unterformular rufen wir nacheinander mehrmals die RunCommand-Anweisung auf und bilden damit genau die Schritte ab, die wir zuvor von Hand durchgeführt haben: Die Konstante acCmdSelectRecord markiert den kompletten Datensatz, acCmdCopy kopiert diesen, acCmdRecordsGoToNew verschiebt den Datensatzzeiger auf den leeren, neuen Datensatz, acCmdSelectRecord markiert diesen und acCmdPaste fügt den Datensatz aus der Zwischenablage dort ein. Die Lösung funktioniert grundsätzlich, aber vielleicht möchte Sie etwas mehr Kontrolle, indem Sie den Artikel unabhängig von der aktuell angezeigten Benutzeroberfläche duplizieren.

Datensatz kopieren ohne Formular

Wenn Sie den Datensatz per VBA kopieren wollen, können Sie theoretisch also beispielsweise eine INSERT INTO…SELECT-Anweisung verwenden (s. Listing 1). Zu Beispielzwecken integrieren wir diese wieder in das Formular, so kann der Benutzer den zu kopierenden Datensatz auswählen und der Datensatzzeiger soll anschließend direkt auf den neuen Datensatz verschoben werden. Die Prozedur liest zuerst den Primärschlüsselwert des aktuell im Unterformular markierten Datensatzes ein. Ist kein Datensatz markiert, erhält lngArtikelID den Wert 0. Ist lngArtikelID nicht 0, führt die Prozedur die in der If…Then-Bedingung enthaltenen Anweisungen aus. Hier ruft sie eine SQL-Anweisung auf, die den kompletten Datensatz selektiert und als neuen Datensatz in die Tabelle tblArtikel einfügt. Danach ermittelt sie den Primärschlüsselwert des zuletzt eingefügten Datensatzes und schreibt diesen wieder in die Variable lngArtikelID. Nach dem Aktualisieren des Unterformulars soll der Datensatzzeiger auf den neuen Datensatz verschoben werden.

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