Avatar billede kronsj Nybegynder
02. oktober 2007 - 12:22 Der er 17 kommentarer og
2 løsninger

Kopi af record

Jeg skal bruge en funktion, der laver en kopi af en record og tilføjer den i databasen. Hvad gør jeg galt ?

Dim db As Database
Dim rst As DAO.Recordset
Dim r() As DAO.Field
Dim i As Integer
Dim iFieldsCount As Integer

Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM Personer")

rst.movefirst
rst.move 5 'har blot tilføjet dette, som eksempel

ReDim Preserve r(1 To rst.Fields.Count)
For i = 1 To iFieldsCount - 1
    Set r(i) = rst.Fields(i)
    r(i).Value = rst.Fields(i).Value
Next

rst.AddNew
For i = 1 To iFieldsCount - 1
    rst.Fields(i).Value = r(i).Value
Next
rst.Update

rst.Close

Felterne i r() arrayet bliver sat til null.
Hvad gør jeg galt ?
Jeg ved Esperten.dk har et eksempel med kopi af records, men det tager vidst kun kopien af den sidste recordet i recordsettet, og bruger som default-værdier
Avatar billede schoesler Nybegynder
02. oktober 2007 - 13:03 #1
Nedestående er en kode fra ACCESS egen wizard og virker

Private Sub Command169_Click()
On Error GoTo Err_Command169_Click


    DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70 'Paste Append

Exit_Command169_Click:
    Exit Sub

Err_Command169_Click:
    MsgBox Err.Description
    Resume Exit_Command169_Click
   
End Sub
Avatar billede schoesler Nybegynder
02. oktober 2007 - 13:07 #2
Den tager en kopi af den record som du står på og lægger den sidst
Avatar billede terry Ekspert
02. oktober 2007 - 17:28 #3
if you know which record you want to copy what is wrong with using a simple INSERT into ... SELECT --- FROM syntax?
Avatar billede kronsj Nybegynder
02. oktober 2007 - 20:34 #4
Terry: Oh .. my good old SQL... I forgot. But 62 (!) fields....
Avatar billede terry Ekspert
02. oktober 2007 - 21:06 #5
Lets say we have a table with a number of fields and one is an autonumber.

Make an append query where you append the records you want WITHOUT the ID, this gets generated automatically.

Add a paramater to the query by right clicking in the area where teh table is and choose parameters. Give it a name (ID) and choose longer integer as type.

Now you query will look something like this.

PARAMETERS ID Long;
INSERT INTO tbl1 ( Dato, Lonnummer, afdeling )
SELECT tbl1.Dato, tbl1.Lonnummer, tbl1.afdeling
FROM tbl1
WHERE (((tbl1.ID)=[ID]));


If you run th equery you will get prompted for the ID, but if you do it in code you can set the parameter to what ever you want.

EG:


PARAMETERS ID Long;
INSERT INTO tbl1 ( Dato, Lonnummer, afdeling )
SELECT tbl1.Dato, tbl1.Lonnummer, tbl1.afdeling
FROM tbl1
WHERE (((tbl1.ID)=[ID]));
Avatar billede terry Ekspert
02. oktober 2007 - 21:06 #6
So you only need to make the query once with all 62 fields :o)
Avatar billede terry Ekspert
02. oktober 2007 - 21:07 #7
Sorry Example here:

Dim qdf As QueryDef

Set qdf = CurrentDb.QueryDefs("QryAppend")

qdf.Parameters("ID") = 2

qdf.Execute
Avatar billede terry Ekspert
02. oktober 2007 - 21:08 #8
obviously the query is saved with the name "QryAppend"
Avatar billede kronsj Nybegynder
02. oktober 2007 - 21:29 #9
schoesler: Det var næsten for nemt til at være sandt. Og det bar for nemt... umiddelbart.
I den form der skal kopieres er der også et felt som skal udfyldes manuelt, men som ikke må indeholde dubletter.

I formen er der nogle subforms - der lader til at blive opdateret / relinked.

Og i nogle tilfælde får jeg også meddelelse om at poster vil blive lagt i tabellen "Indsætningsfejl".
Avatar billede kronsj Nybegynder
02. oktober 2007 - 22:51 #10
Terry: Good work. But Schoesler's example moves the record-browser to the last record in the forms recordset. Further more, I tested your first tip, using docmd.runsql when click-event on a simple button. But Nothings happend.
After having tested schoesler's hook, I found that your SQL maybee is the best. Plz remark that the form has some subforms, including som datasheets, but using SQL this may be a smaller prob.
So: How navigate to the newest record using VBA and update a bound datasheet are the final issues.
Avatar billede kronsj Nybegynder
03. oktober 2007 - 00:30 #11
Terry, It works. Plz make a svar, and you got your deserved ponts. But I have two more qeustions
Avatar billede kronsj Nybegynder
03. oktober 2007 - 00:42 #12
Terry last comment:
The table Personer has a autonumber as primary key. How can I get the new generated ID ?

eg.:
form.recordset.movelast
ID = form.recordset("PID")
... or something like this ?
Avatar billede terry Ekspert
03. oktober 2007 - 11:56 #13
I wasnt aware that you were trying to copy a record on a form only from a table, at least thats what your code is doing.

You could use something like

Dmax("ID", "Personer")
Avatar billede kronsj Nybegynder
03. oktober 2007 - 23:39 #14
Every day I get new features of Access.... :o)
Now Terry, when I got the dmax-value, I want view the new record.
How do I move the form to the new record ?
Avatar billede kronsj Nybegynder
04. oktober 2007 - 01:46 #15
I think I fixed last comment:

Set rs = [Forms]![Personer].Recordset.Clone
rs.FindFirst "[Personkonto] = " & CStr(lPersonkonto)
If Not rs.EOF Then [Forms]![Personer].Recordset.Bookmark = rs.Bookmark

All right, but could I use the docmd.gotorecord instead of setting a bookmark ?
Avatar billede terry Ekspert
04. oktober 2007 - 08:18 #16
I'm very puzzled.
What is wrong with the code schoesler gave originally, doesnt that do what you want and move the cursor to the record?

If you can give an explanation of all of waht your trying to do then maybe its possible to give the correct solution first time
Avatar billede terry Ekspert
06. oktober 2007 - 10:42 #17
status?
Avatar billede kronsj Nybegynder
08. oktober 2007 - 21:55 #18
Thaks for splended help Terry. Well I used the hard-way/hard-code as we discussed. Soory being late to give the points.
Avatar billede terry Ekspert
09. oktober 2007 - 08:00 #19
as they say, better late than never :o)
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