Copy record

test1000

Gebruiker
Lid geworden
7 jul 2017
Berichten
261
Hoi,
Een formulier met 30 velden die een gebruiker kan invullen.
Hij kan willekeurig velden zelf kiezen en invullen.
Het formulier bestaat dropdown als invulvelden.
Nu wil ik een knop voorzien om het record dat hij al heeft ingevuld kan kopiëren.
Maw hij heeft een formulier ingevuld met vb 20 velden.
Er moet een nieuw record worden ingevuld met dezelfde 20 velden en dezelfde waarden maar met 1 extra ander veld.
Dus het is zonde dat de gebruiker de knop "Nieuw formulier" gebruikt en dezelfde 20 velden moet invullen/selecteren en dan enkel nog 1 extra veld.
Daarom wil ik een knop maken "Dupliceer record" maken dat het huidig record kopieert.
De tabel heeft geen veld autonummering.
En een veld volgnummer dat met 1 moet opgehoogd worden.

Op welke kan ik het record kopiëren ?
Bestaat er een eenvoudige code ?

Want deze code werkt bij mij niet :

DoCmd.RunCommand acCmdSelectRecord
DoCmd.RunCommand acCmdCopy
DoCmd.RunCommand acCmdPasteAppend
 
Waarom zet je de default waarden van die 20 velden niet op de waarden van de vorige velden? Dan worden deze automatisch ingevuld bij het nieuwe record, maar kunnen door de gebruiker nog overschreven worden
 
Klopt, maar het blijft een hele klus en je moet met verschillende factoren rekening houden. Mede geholpen door dit draadje kom ik tot:
Code:
Private Sub dupliceer_Click()
    If IsNull(Me.Volgnummer) Then Exit Sub
    
    Dim ltst_nr As Long
        
    Me.Refresh
    ltst_nr = DMax("Volgnummer", "T1")
    
    'numeriek veld
    If IsNull(Me.A) Then
        Me.A.DefaultValue = ""
    Else
        Me.A.DefaultValue = Me.A
    End If
    
    'tekstveld
    If IsNull(Me.B) Then
        Me.B.DefaultValue = ""
    Else
        Me.B.DefaultValue = """" & Me.B & """"
    End If
    
    'datumveld
    If IsNull(Me.C) Then
        Me.C.DefaultValue = ""
    Else
        'raar maar waar
        Me.C.DefaultValue = "#" & DateSerial(Year(Me.C), Day(Me.C), Month(Me.C)) & "#"
    End If
    
    'boolean
    Me.D.DefaultValue = Me.D
    
    DoCmd.GoToRecord , , acNewRec
    Me.Volgnummer = ltst_nr + 1

End Sub
 
blijft natuurlijk de vraag waarom het nodig is zoveel waarden te kopiëren, volgens mij riekt dit naar een foutieve structuur.
 
Terechte vraag. Ben ik ook benieuwd naar.
 
Of de structuur in orde is of niet, boeit natuurlijk niet voor het antwoord. Als je een veld Volgnummer hebt, kun je een code hangen achter de knop die een nieuw record aanmaakt, en dan een Recordset gebruiken die het laatste record inleest, en met een For 1 To 30 lus (er vanuitgaande dat Field(0) het volgnummer is) de volgende 30 velden vult met het laatste record. Is vrij simpel te doen.
 
Hoi,

Deze code gevonden op internet en werkt.

Code:
  Dim rstSource   As DAO.Recordset
  Dim rstInsert   As DAO.Recordset
  Dim fld         As DAO.Field

  If Me.NewRecord = True Then Exit Sub

  Set rstInsert = Me.RecordsetClone
  Set rstSource = rstInsert.clone
  With rstSource
    If .RecordCount > 0 Then
      ' Go to the current record.
      .Bookmark = Me.Bookmark
      With rstInsert
        .AddNew
          For Each fld In rstSource.Fields
            With fld
              If .Attributes And dbAutoIncrField Then
                ' Skip Autonumber or GUID field.
              ElseIf .Name = "SomeFieldToPreset" Then
                rstInsert.Fields(.Name).Value = SomeValue
              ElseIf .Name = "SomeFieldToExclude" Then
                ' Leave blank
              Else
                ' All other fields.
                ' Copy field content.
                rstInsert.Fields(.Name).Value = .Value
              End If
            End With
          Next
        .Update
        ' Go to the new record and sync form.
        .MoveLast
        Me.Bookmark = .Bookmark
        .Close
      End With
    End If
    .Close
  End With

  Set rstInsert = Nothing
  Set rstSource = Nothing
 
Er zit volgens mij wat onzinnigs in de code, maar als je er tevreden mee bent (omdat het voor jou werkt), dan moet je er vooral niks aan verbeteren :). Al zijn de laatste twee regels nutteloos. Die kun je dus gewoon weghalen. En met de door mij aangedragen techniek kan het in de helft van de code. Maar je bent tevreden, dus wie ben kimmo daar over te klagen? ;)
 
In een vorig leven heb ik nog geprogrammeerd en ook les gegeven in programmatie technieken. Die twee laatste regels, het vernietigen van aangemaakte objecten, zijn gewoon good programming practices. Alhoewel ik moet toegeven dat dit steeds minder toegepast wordt.
 
Die twee laatste regels, het vernietigen van aangemaakte objecten, zijn gewoon good programming practices.
Nope. Een béétje programmeur weet dat alle objecten automatisch worden gesloten als de procedure wordt beëindigd. Het is dus nutteloos om dat zelf te doen. Je zet toch ook geen portier bij automatische deuren? Alhoewel: dat is in België wellicht een methode om de werkloosheid wat naar beneden te krijgen :D.
 
en een goede programmeur weet dat er een wereld van verschil is tussen het sluiten van een object en het vernietigen van dat object, maar ja daarvoor moet je misschien een cursus volgen :p
 
Muggenziften? Je weet precies wat ik bedoelde. Maar omdat je het dus letterlijk wilt horen: bij het beëindigen van de procedure worden de objecten vernietigd. Zo goed? (Kan je ook lezen in dezelfde cursus die jij blijkbaar óók niet gevolgd hebt.) En verder zeg ik er niks meer over; heeft allemaal niets meer met de vraag te maken…
 
Terug
Bovenaan Onderaan