Avatar billede sortsnak.dk Nybegynder
18. december 2004 - 11:29 Der 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... :(

Hvad gør jeg?! Håber I kan hjælpe...
Avatar billede mugs Novice
18. december 2004 - 11:35 #1
I VBA kan du bruge flg.:

DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.GoToRecord acForm, "Form1", acNewRec
DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdPaste

som kopierer fiormularens aktuelle post og indsætter den som en ny post. Et evt. id (autonummereringsfelt) PK, vil blive indsat som et fortløbende nr.
Avatar billede atke Nybegynder
18. december 2004 - 15:53 #2
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

Der er vel auto-incement på din ID...
Avatar billede kjulius Novice
27. december 2004 - 00:42 #3
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...
Avatar billede sortsnak.dk Nybegynder
03. april 2011 - 22:52 #4
Lukker den.
Avatar billede kjulius Novice
04. april 2011 - 22:14 #5
Kan jeg få en begrundelse for din afvisning af mit forslag? Virkede det ikke hos dig? Hos mig gjorde det...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester