Laatste record kopiëren in form

Status
Niet open voor verdere reacties.

Carloj

Gebruiker
Lid geworden
9 feb 2015
Berichten
115
Ik ben opzoek naar knop waarmee ik de laatst ingevulde record kan kopiëren en weer kan gegeven in een form.
De knop zal dus alle gegevens moeten kopiëren alleen voor het ID zal hij een nieuw nummer moeten maken.
Ik heb het een en ander geprobeerd met macro's alleen zijn mijn functies daar beperkt dus zal het met VBA moeten.
 
Er bestaat niet zoiets als een record kopiëren, en dat is ook wel logisch als je er goed over nadenkt, want een kopie van een record wil je helemaal niet; dat haalt de data integriteit van je database onderuit. Want wie zit er nu te wachten op dubbele identieke records? Wat nog wel eens handig kan zijn is dat je bepaalde waarden uit het laatste record hergebruikt, en dat kun je simpel oplossen door bij die velden na het invullen ervan de standaardwaarde te veranderen. In dummycode: Me.Tekstveld1.DefaultValue = Me.Tekstveld1.Value. Als je dan een nieuw record maakt, heeft het veld de laatst ingevoerde waarde.
 
Want wie zit er nu te wachten op dubbele identieke records?
Daarom moet het Id een nieuwe nummer krijgen.

Ik snap je standaard waarde, maar deze functie komt misschien 1x per week voor. De rest van de week worden er andere gegevens ingevuld.

Voorbeeldje :
ID:1
Naam: project1
Tijd: 8uur
Datum: 14-4-15

Nu is deze record opgeslagen. Er moet nu een knop komen die het record kopieert of hergebruikt en weergeeft als:

ID:2
Naam: project1
Tijd: 8uur
Datum: 14-4-15

Dit komt als er meerdere mensen aan 1 project werken dan zoude ze elke keer alle gegevens opnieuw moeten invullen. Als de mogelijkheid er is om de gegevens te kopiëren of hergebruiken dan hoeft alleen de eerste persoon de gegevens in te vullen en kunnen de andere het kopieëren/hergebruiken en alleen hun naam veranderen.
 
Daarom moet het Id een nieuwe nummer krijgen.
Je snapt het geloof ik niet helemaal; een autonummerveld is natuurlijk helemaal niks; een onnozel nummertje dat uniek is. Als de rest van de velden identiek is aan het vorige record, heb je dus echt een duplicaat. En dat moet je niet willen in een database. Records moeten intrinsiek uniek zijn van zichzelf, en daar moet je het autonummer niet bij betrekken.

Laten we eens naar je voorbeeldje kijken:
Projectnaam: is blijkbaar voor elke medewerker anders. Dus daar een kopie inzetten van het vorige record lijkt mij een beetje zinloos. Bovendien: op je formulier heb je daar vast een keuzelijst voor gemaakt waarin ze met één of twee letters typen het project al kunnen selecteren. Maar goed, zoals ik al eerder aangaf: met de optie DefaultValue kun je een gekozen waarde standaard instellen op zo'n veld.
Tijd: als iedereen ongeveer dezelfde tijd aan een project besteed (standaard doe je 1 project per dag) dan vul je toch zelf 8 in als Standaardwaarde voor dat veld? (wat mijn code overigens dus ook doet)
Datum: als je de huidige datum wilt hebben, dan zet je in het datumveld de standaardwaarde op de formule =Date().
 
Records moeten intrinsiek uniek zijn van zichzelf, en daar moet je het autonummer niet bij betrekken.
Elke werknemer heeft zijn eigen werknemerID deze verschilt dus altijd.

Laten we eens naar je voorbeeldje kijken:
Projectnaam: is blijkbaar voor elke medewerker anders. Dus daar een kopie inzetten van het vorige record lijkt mij een beetje zinloos. Bovendien: op je formulier heb je daar vast een keuzelijst voor gemaakt waarin ze met één of twee letters typen het project al kunnen selecteren. Maar goed, zoals ik al eerder aangaf: met de optie DefaultValue kun je een gekozen waarde standaard instellen op zo'n veld.
Tijd: als iedereen ongeveer dezelfde tijd aan een project besteed (standaard doe je 1 project per dag) dan vul je toch zelf 8 in als Standaardwaarde voor dat veld? (wat mijn code overigens dus ook doet)
Datum: als je de huidige datum wilt hebben, dan zet je in het datumveld de standaardwaarde op de formule =Date().
Het voorbeeldje was snel gemaakt en heeft 3 invul mogelijkheden. Het formulier dat ingevuld wordt door de werknemers heeft 22 invul opties.
Als er een project gedaan wordt is dit vaak met meerdere personen en duurt 9/10 langer dan 1 dag.
Het systeem wordt niet alleen gebruikt voor projecten. Dit komt zoals al eerder gezegd misschien 1x per week voor. De rest van de week worden er andere gegevens ingevuld. Dus een standaard waarde is geen optie(of het moet zijn dat je deze met 1 klik kunt aan zetten en uit).

Het probleem is nu:
Als werknemer 1 de invul opties heeft ingevuld en opslaat onder zijn naam dan zou werknemer 2 weer alle 22 invul opties moeten invullen. Alleen zijn de gegevens voor 98% hetzelfde. Als de gegevens die werknemer 1 gekopieerd of hergebruikt kunnen worden dan scheelt dit enorm veel tijd.
 
Oplossing:

Code:
Private Sub Knop1_Click()

    Dim ID As Long
    
        ID = DMax("ID", "Tabel")
        
            DoCmd.GoToRecord , , acNewRec
            
                Report_name = DLookup("txtnaam", "tabel", "tabelID=" & ID)
             
End Sub
 
Dus een standaard waarde is geen optie(of het moet zijn dat je deze met 1 klik kunt aan zetten en uit).
Ik vraag me af of je mijn antwoorden wel gelezen hebt.... Sowieso is de code die je als 'oplossing' hebt gegeven veel te omslachtig; dit is nog maar voor één veld, maar je zegt zelf dat het om zo'n 22 velden gaat. Dus nogmaals: mijn oplossing doet helemaal niks met knoppen, dus er hoeft helemaal niks geklikt te worden. Je laat de standaardwaarde van het veld veranderen op basis van wat de laatste gebruiker gedaan heeft. Het volgende record heeft dus, zonder dat er ook maar iemand iets hoeft aan te klikken, gelijk de door jou gevraagde waarden. Maar je mag uiteraard best je eigen oplossing gebruiken. Maar dan weet ik dat ik de volgende keer niet zoveel tijd in een oplossing hoef te steken...
 
Het is juist de bedoeling dat de laatste record niet gebruikt wordt, alleen als dit gewenst is(daarom juist een knop). Als ik jou oplossing zou gebruiken dan neemt hij altijd het laatste record over(dit is niet de bedoeling). Zoals al eerder gezegd komt dit misschien maar 1x per week voor dat komt neer op 1/50 meldingen die worden ingevuld.

Dit is de basis code voor 1 veld, al wil je meer velden dan kopieer je ze gewoon.
Code:
Private Sub Knop1_Click()

    Dim ID As Long
    
        ID = DMax("ID", "Tabel")
        
            DoCmd.GoToRecord , , acNewRec
            
                Report_name = DLookup("txtnaam", "tabel", "tabelID=" & ID)
                Report_name1 = DLookup("txtnaam1", "tabel", "tabelID=" & ID)
                Report_name2 = DLookup("txtnaam2", "tabel", "tabelID=" & ID)
             
End Sub
 
Laatst bewerkt:
Gruwelijke methode met DLookup :).
 
Dat denk jij.... Er is uiteraard verschil tussen een oud dieseltje en een TGV :)
 
De Dlookup als expressie loopt inderdaad als een oud dieseltje, maar als vba is die zo snel als een ferrari :P
 
Pak er maar eens een grote tabel bij, en je praat wel anders :). Maar afgezien daarvan: je gooit nu willens en wetens de eigenschappen van je velden overboord, want je 'vertaalt' nu alles naar tekst. Lijkt mij niet handig. Ik zou de oorspronkelijke veldeigenschappen beter willen bewaken.
 
Maar afgezien daarvan: je gooit nu willens en wetens de eigenschappen van je velden overboord, want je 'vertaalt' nu alles naar tekst. Lijkt mij niet handig. Ik zou de oorspronkelijke veldeigenschappen beter willen bewaken.

Hij slaat alles op als ID, al mijn keuze mogelijkheden kolombreedte staan op 0cm;2cm. :thumb:

En wat zou jij dan voorstellen om te doen in plaats van dlookup. Standaard waarde is geen optie.
 
Public variabelen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan