VBA Tipp: Datensatz duplizieren

Aus DBWiki
Wechseln zu: Navigation, Suche

Aufgabenstellung

Ich möchte einen Datensatz "einfach nur" duplizieren.

Lösung

Ein echtes Duplizieren ist nicht vorgesehen (denn dann müsste ja auch der Primärschlüssel in beiden Datensätzen übereinstimmen), aber meist ja auch gar nicht beabsichtigt. Aber auch sonst führt das Duplizieren von Daten in der Datenbank leicht zu Redundanzen und ist oft eher unerwünscht. Man sollte also immer zu allererst prüfen, ob es nicht andere Wege zum Ziel gibt. Trotzdem gibt es natürlich immer wieder Fälle, wo das Duplizieren von Datensätzen seine Berechtigung oder gar Notwendigkeit hat.

In DAO geht das z.B. so:

 'Die AktID muss vorgegeben werden
 'ID und MeineTabelle an persönliche Verhältnisse anpassen
 
 Dim fld As DAO.Field
 Dim rs As DAO.Recordset
 Dim rsn As DAO.Recordset
 Dim AktID As Long
 Dim strSQL As String
 
 strSQL = "SELECT * FROM MeineTabelle WHERE ID = " & AktID
 Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
 Set rsn = CurrentDb.OpenRecordset("MeineTabelle", dbOpenDynaset)
 
 If Not rs.EOF Then
   rsn.AddNew
   For Each fld In rs.Fields
     If fld.Name <> "ID" Then
       rsn(fld.Name) = fld.Value
     End If
   Next
   rsn.Update
 End If
 
 rs.Close
 rsn.Close
 Set rs = Nothing
 Set rsn = Nothing

oder auch:

Currentdb.Execute "INSERT INTO MeineTabelle " & _
  " SELECT * FROM MeineTabelle WHERE ID = " & AktID

in ADODB:

CurrentProject.Connection.Execute "INSERT INTO MeineTabelle " & _
  " SELECT * FROM MeineTabelle WHERE ID = " & AktID

Dieses Beispiel geht davon aus, dass der zu duplizierende Datensatz über ein Autowert-Primärschlüsselfeld "ID" durch eine Variable namens "AktID" identifiziert wird. Wenn es in der Tabelle einen selbstverwalteten Primärschlüssel gibt, dann muss man ihn natürlich dann an dieser Stelle setzen. (Die zweite Variante funktioniert dann nicht).

Je nachdem, ob man den Datensatz aus einem Formular holt, wie die Schlüssel aussehen, ob es Text- oder Zahlenfelder sind, usw. usw., kann die Angelegenheit auch anders aussehen. Ein Kopieren zwischen verschiedenen Tabellen läßt sich leicht dadurch realisieren, dass man das zweite Recordset auf der entsprechenden Tabelle öffnet. Ggf. kann man auch weitere Felder von dem Kopieren ausnehmen.

Dieser Code ist als Ersatz für den vom Schaltflächenassistenten erstellten Code für "Datensatz duplizieren" gedacht (der das ganze knapp, aber mit unschönen Docmd-Konstrukten löst).

Wiki-Links