vba record kopieëren

Status
Niet open voor verdere reacties.

RDIE

Gebruiker
Lid geworden
25 aug 2013
Berichten
80
Hoi,
Ik probeer een knop op een invoerformulier te maken waarmee ik een record, (althans de gegevens die hetzelfde blijven) kan kopieëren naar een volgende record. Op het forum heb ik een stukje code gevonden waarmee ik op de juiste weg lijk te zijn maar ik stuit toch op een probleem.
Mijn redenering: als ik het RelatieNr (F_RelatieNrID) kopieer naar het volgende record dan zal access de bijbehorende gegevens (NAW ed) uit de Relatietabel halen en direkt op het invoerformulier invullen. Dat gebeurt echter niet. Er wordt wel een nieuw record gemaakt, het relatienr wordt keurig ingevuld, maar dat is het dan.
Probeer ik het nieuwe record te bewaren dan lukt dat ook niet.

Wat doe ik fout / welke denkfout maak ik ?

Hieronder het stukje code dat ik heb gevonden waarmee het relatienr wordt gekopieerd waarna de cursor naar het eerste variabel in te vullen veld gaat. (Onderdeel volgnr)

Code:
Private Sub kopieer_record_Click(
Const cQ = """"
Me!F_RelatieNrID.DefaultValue = cQ & Me.F_RelatieNrID & cQ
F_VolgnrOnd.SetFocus
DoCmd.GoToRecord , , acNewRec
End Sub
 
Wat doe ik fout / welke denkfout maak ik ?
Je doet beide :). Dus een technische fout, als een denkfout. Laten we met de denkfout beginnen, dan hoeft hopelijk de technische fout niet meer te worden opgelost ;).

Blijkbaar heeft een relatie NAW gegevens (is uiteraard niet meer dan logisch). En zo te zien heb je een tabel + invoerformulier waarin je records vastlegt waar je de RelatieID bij nodig hebt. Kan ik me alles bij voorstellen: facturen, bestellingen, werkopdrachten.... En in die tabel heb je blijkbaar de behoefte om meerdere records te maken op basis van dezelfde relatie. Tot zover duidelijk. De denkfout is echter: waar heb je in dat formulier/tabel dan die (herhalende, identieke dus redundante) NAW gegevens voor nodig? NAW gegevens zijn afhankelijk van de RelatieID, en die sla je dus in beginsel nooit op in andere tabellen; simpel ophalen uit de Relatietabel (via een query) als dat nodig is, is meer dan genoeg.
Er is wel een reden te bedenken overigens, wellicht is die voor jou van toepassing. Dat hoor ik dan graag :).
Je maakt nóg een denkfout: je denkt namelijk dat als je één veld aanpast, je alle velden aanpast. Dat werkt natuurlijk niet zo. Op zijn minst moet je alle formuliervelden die je mee wilt nemen, opnemen in de code. Dus ook de andere NAW velden.
Of, veel betere oplossing, zet die NAW velden in de onderliggende query; dan worden ze automatisch ingevuld als je een nieuw record maakt. En dan heb je gelijk het eerste probleem opgelost: NAW gegevens wél tonen, maar niet opslaan.
 
Beste Octafish,

Het formulier is gebaseerd op een query waarmee ik de variabele gegevens in de tabel zet. Dus ik geef het relatienr. in op het formulier en daar zie ik dan de bijbehorende NAW gegevens, tel.nr. emailadres etc. Puur voor het gemak dus bij invoeren en als je door de formulieren bladert.
In de tabel daarentegen worden enkel de variabele gegevens weggeschreven zoals lev.nr., geoffreerd artikelnr. offertedatum offerteprijs en nog enkele andere gegevens. Ook hier worden bijbehorende informatie zoals bijvoorbeeld artikelomschrijving weliswaar op het formulier getoond maar op basis van de onderliggende query. Dus op het formulier zie ik relatienummer plus NAW gegevens en geoffreerd artikelnummer plus bijbehorende gegevens maar in de tabel wordt enkel het relatienummer en het artikelnummer, prijs en datum ingevoerd. (Overigens wordt bijvoorbeeld het artikelnummer ingevoerd via een keuzelijst met invoervak)
Ik ging er dus vanuit dat als ik via een kopieerknop op het formulier het relatienr. naar een nieuw record kopieer dat ik dan direkt ook daar de bijbehorende gegevens zou zien. Op basis van de onderliggende query. Evenzo voor de artikelgegevens die bij het in te voeren artikelnummer horen.
Maar kennelijk is dat dus toch een verkeerd uitgangspunt?
 
Volgens mij is je uitgangspunt wel OK; je gebruikt een query met daarin de velden die je op wilt slaan in je tabel (de sleutelvelden) en die query vul je aan met velden die je ook wilt zien op je formulier. Dat werkt doorgaans perfect, zeker als je de sleutels opzoekt met keuzelijsten met invoervak, zoals je zo te zien wél doet met ArtikelID, maar dan weer niet met RelatieID? Want wat is daar dan de reden voor? Ik zou voor alle sleutelvelden (waarbij je aanvullende gegevens gebruikt) keuzelijsten gebruiken.
Je 'kopieert' overigens niet het RelatieID naar een nieuw record, je past de Standaardwaarde van het veld F_RelatieNrID aan. Met DefaultValue krijg je, als je een nieuw record aanmaakt, die waarde standaard te zien in het nieuwe record. Let wel: te zien. Het record wordt pas daadwerkelijk aangemaakt als je een ander veld muteert. Dus zolang je nog niet iets anders invult in het formulier, heb je ook nog geen record, en worden er dus ook geen aanvullende gegevens getoond. Bij je keuzelijst ArtikelID werkt dat principe wél, omdat je actief iets verandert in de recordset (namelijk: artikelID invullen).

Wellicht loopt het formulier wél goed als je dus ook gelijk een ander veld invult. Bijvoorbeeld zo:
Code:
Private Sub kopieer_record_Click(
     Const cQ = """"
     Me.F_RelatieNrID.DefaultValue = cQ & Me.F_RelatieNrID & cQ
     DoCmd.GoToRecord , , acNewRec
     Me.offertedatum.Value = Date
     F_VolgnrOnd.SetFocus
End Sub

Jouw .SetFocus had geen enkel effect, omdat je nog niet in een nieuw record zit op dat moment. Het aanmaken van een nieuw record overrulet het SetFocus commando. Door een ander veld te vullen in het nieuwe record (Offertedatum in het voorbeeld) wordt het nieuwe record daadwerkelijk aangemaakt, en dus ook je RelatieID gevuld.
Let ook op het verdwenen uitroepteken :)
 
VBA record kopieeren

Beste Octafish,

De aanpassing die je hebt gegeven werkt inderdaad prima. Dank!
Eén onderdeel krijg ik echter nog niet voor elkaar, namelijk het kopieëren van een keuzelijst met invoervak. Hierbij krijg ik steeds de melding: "compileerfout, kan de methode of het gegevenslid niet vinden".

ter info: een te offreren artikel valt in een (hoofd)categorie. De categorie heeft een nummer. Dit nummer wordt via het formulier in de offertetabel gezet bij de desbetreffende relatie.
Op het formulier wordt dat nummer ingevoerd via de keuzelijst waarbij de bijbehorende categoriebenaming op basis van de onderliggende query wordt getoond. (zoals reeds vermeld is dat laatste voor het gemak bij invoeren en/of 'bladeren')

Ik heb de code ook geprobeerd bij een andere keuzelijst zoals subcategorie maar krijg daar dezelfde melding.
Voor wat betreft de overige velden, waar er dus geen sprake is van een keuzelijst, werkt de code perfect.

Waar zou dit probleem / deze fout kunnen zitten?
 
Je geeft een beetje weinig informatie, want ik kan zo natuurlijk nooit zeggen wat er aan je methode mankeert. Normaal gesproken lees je de Afhankelijke kolom uit van een keuzelijst, en die waarde neem je dan mee naar het volgende record. Dat werkt op exact dezelfde manier als bij een tekstvak. Mits uiteraard de waarde wel geldig is in het nieuwe record. Dus ik moet op zijn minst de gebruikte code zien, en de query die onder de keuzelijst hangt.
 
Ik geef hieronder 2 stukjes code. (Ik heb nog niet alle velden er in staan, het leek me handiger om eerst het probleem te proberen op te lossen)
de eerste code loopt goed
de 2e waarin ik 1 regel heb toegevoegd geeft de foutmelding
Zoals je ziet heb ik daar de regel toegevoegd:
Code:
Me.F_FacHfdCat.DefaultValue = cQ & Me.F_FacHfdCat & cQ

Code:
Private Sub kopieer_record_Click()
Const cQ = """"
Me.F_RelatieNrID.DefaultValue = cQ & Me.F_RelatieNrID & cQ
Me.F_LeverPC.DefaultValue = cQ & Me.F_LeverPC & cQ
Me.F_AantalOnd.DefaultValue = cQ & Me.F_AantalOnd & cQ
Me.Fac_HfdCat.DefaultValue = cQ & Me.Fac_HfdCat & cQ
DoCmd.GoToRecord , , acNewRec
Me.F_DatumOfferte.Value = Date
F_VolgnrOnd.SetFocus
End Sub


Code:
Private Sub kopieer_record_Click()
Const cQ = """"
Me.F_RelatieNrID.DefaultValue = cQ & Me.F_RelatieNrID & cQ
Me.F_LeverPC.DefaultValue = cQ & Me.F_LeverPC & cQ
Me.F_AantalOnd.DefaultValue = cQ & Me.F_AantalOnd & cQ
Me.Fac_HfdCat.DefaultValue = cQ & Me.Fac_HfdCat & cQ
Me.F_FacHfdCat.DefaultValue = cQ & Me.F_FacHfdCat & cQ
DoCmd.GoToRecord , , acNewRec
Me.F_DatumOfferte.Value = Date
F_VolgnrOnd.SetFocus
End Sub

F_FacHfdCat is het veld waarin het nummer van de Hoofdcategorie wordt geplaatst
Fac_HfdCat is de omschrijving van de dienst zoals die in de tabel Hoofdcategorie is vastgelegd

Hieronder geef ik een de query weer. (in de vorm van een stukje schermprint aangezien ik niet weet hoe dat op de 'formele' wijze te doen)
Hoop dat dit goed is gegaan...

Qry_Facilitair.jpg
 
Zo te zien koppel je aan de numerieke sleutelvelden uit de brontabellen, wat correct zou zijn. Numerieke velden mag je echter nooit koppelen als tekstvelden, dan krijg je fouten. Dus bij elke getalwaarde moet je dit gebruiken:
Code:
Me.F_FacHfdCat.DefaultValue = Me.F_FacHfdCat

En niet dit:
Code:
Me.F_FacHfdCat.DefaultValue = cQ & Me.F_FacHfdCat & cQ
 
Hoi,
In eerste instantie werkte het met deze code regel ook niet. Het had dus te maken met het feit dat het om een keuzelijst ging.
Bij het bekijken van de eigenschappen zag ik dat de naam niet hetzelfde was als het besturingselement. Dus bijvoorbeeld "keuzelijst 22" ipv F_FacHdfCat
Na de naam te hebben gewijzigd werkt de code perfect.
Dank voor de hulp.
 
En daarom vragen we dus altijd om een voorbeeldbestand, want dat is zo’n beetje het eerste dat ik controleer :). Het heeft dan dus niks te maken met het feit dat het om een keuzelijst ging, maar alles met het feit dat de objectnamen niet overeenkomen :D.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan