18. december 2004 - 11:29Der er
4 kommentarer og 1 løsning
Kopier række i samme tabel
ID NAVN MAIL 1 ABC ABC@ABC.COM 2 DEF DEF@ABC.COM 3 GHI GHI@ABC.COM
Jeg vil gerne duplikere rækken hvor ID=2, så den opretter en ny række med ID=4, NAVN=DEF, MAIL=DEF@ABC.COM
En løsning: SQL = Insert Into My_Table (id,navn,mail) Select (id,navn,mail) From My_Table Where ID=2
Problemet er bare at jeg ikke kender det præcise antal kollonner i tabellen, og at jeg derfor ikke kan sige hvilke felter den skal kopiere... Det ville være let nok hvis man kunne sige:
SQL = Insert Into My_Table * Select * From My_Table where ID=2
...men det kan man ikke da Insert Into Table * ikke duer... :(
Man behøver ikke angive kolonnerne i en insert, så du kan sige:
Insert Into My_Table Select * From My_Table where ID=2
- det samme som du skrev, men med en stjerne mindre. Men får for du id=2 kopieret med og ikke et nyt id=4 som du ønsker.
Der er ingen mulighed for SELECT * EXCEPT ID FROM ..., så du bliver nok nødt til at lave noget kode der indlæser kolonnerne og genererer din insert-sql ud fra det.
Hvis ikke du har frygteligt mange tabeller, er det vel nemmere at lave en insert for hver, såsom:
INSERT INTO My_Table (NAVN, MAIL) SELECT NAVN, MAIL FROM My_Table WHERE ID = @idToCopy
En VBA funktion som den følgende burde kunne klare opgaven:
Public Function DuplicateRow(Table As String, RowID As Long) As Integer On Error GoTo DupRowError
Dim rsFrom As DAO.Recordset Dim rsTo As DAO.Recordset DuplicateRow = False
Set rsFrom = CurrentDb.OpenRecordset("SELECT * FROM " & Table & " WHERE ID =" & RowID) Set rsTo = CurrentDb.OpenRecordset(Table) rsFrom.MoveFirst If rsFrom.RecordCount > 0 Then rsTo.AddNew ' Gennemløb alle felter i tabellen, og hvis feltet i den nye row ' er opdaterbart og ikke et autonum-felt ' så kopier feltet til den nye record (aka. row). For Each Field In rsFrom.Fields If (rsTo.Fields(Field.Name).Attributes And dbUpdatableField) = dbUpdatableField And _ (rsTo.Fields(Field.Name).Attributes And dbAutoIncrField) <> dbAutoIncrField Then rsTo.Fields(Field.Name).Value = rsFrom.Fields(Field.Name).Value End If Next rsTo.Update DuplicateRow = True End If rsFrom.Close rsTo.Close Exit Function DupRowError: MsgBox Error$, vbExclamation + vbOKCancel, "Fejl under duplikering af row"
End Function
Den kaldes sådan (eksempel):
Dim OK as Integer OK = DuplicateRow("tabelnavn", 5) If OK Then Msgbox("Den ønskede row er blevet duplikeret") End If
PS. DAO prefixet i dimensioneringen af Recordset er normalt ikke nødvendig, men af en eller anden grund kræver min Access 2003 dette...
Kan jeg få en begrundelse for din afvisning af mit forslag? Virkede det ikke hos dig? Hos mig gjorde det...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.