VBA DoCmd.GoToRecord

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo. Ik gebruik twee formulieren, Werkorder en Verzamelstaat. Als ik in form Werkorder een bepaalde werkorder selecteer, bv. nummer 1063, dan wil ik, als ik omschakel naar de Verzamelstaat, dat dit formulier opent op nr. 1063 en niet op 1. Allebei de formulieren starten altijd met ID=1. Ik heb in form Werkorder het unieke ID nummer (bv. 1063) bepaalt en deze naar het tweede formulier Verzamelstaat met TempVars overgebracht en dat werkt.
Mijn idee is om in de Verzamelstaat dmv. Form_Load en de instructie DoCmd.GoToRecord en een offset (bv. 1063) te gaan naar het betreffende record en vervolgens de gegevens van dit record in het formulier te laden. Helaas dit werkt niet. Van alles getest, maar geen resultaat, geen foumeldingen.
Code:
Private Sub Form_Load()
Dim RecordNum As String
RecordNum = TempVars![sIDnummer] 
DoCmd.GoToRecord acDataForm, "Verzamelstaat", acGoTo, RecordNum
Forms![Verzamelstaat PvO].Form.Refresh
End Sub
Ik heb ook nog testen gedaan met acDataTable en de tabelnaam of acDataQurey en de naam van de Query maar geen resultaat. Wordt er bij Form_Load met één of andere standaard instelling misschien standaard naar ID 1 gesprongen en dit niet kan worden overruled met de GoTo offset?
 
Als je vanuit een geopend formulier een ander formulier wil openen met bepaalde data, lijkt het mij niet nuttig om de complete dataset te openen. Veel handiger en sneller is het om alleen het geselecteerde record te openen. En dat gaat veel simpeler dan jij doet.
Code:
    DoCmd.OpenForm "[Verzamelstaat_PvO]", , , "[RecordNum]=" & Me.IDnummer
En probeer spaties in objectnamen te vermijden, tenzij je het leuk vind om Access extra moeilijk te maken :)
 
Had ik bekeken maar de app maakt gebruik van een navigatieformulier waarbij ik met twee knoppen schakel tussen het ene en het andere formulier. Boven aan het navigatieformulier heb ik dus meerdere knoppen staan waarbij je rechtstreeks tussen formulieren kan schakelen. Op zich werkt het snel, overzichtelijk en is gemakkelijk. Waarschijnlijk zou je dat nu anders doen maar het is niet anders. Volgens mij kun je niet in het navigatieformulier programmeren, ik kan de code hiervan niet vinden.
 
Maak eens een voorbeeldje, want ik ben niet zo thuis in die navigatieformulieren. Ben er ook geen liefhebber van dus de lust om zelf iets na te maken is niet zo heel groot :).
 
Denk dat TS een hoofdmenu formulier bedoeld waarin hij naar d.m.v knoppen andere formulieren kan openen.
Veel beter dan het schakelformulier van access, veel meer vrijheid in een eigen gemaakt formulier, waarin men andere formulieren kan openen.

Blijft het feit dat je beter van het ene formulier naar een ander formulier gaat als je bepaald filter wilt meegeven, zonder dat je terug gaat naar het hoofd menu.
Kan wel maar is een onnodige tussen stap.
 
Ik denk dat TS wel degelijk het ingebouwde Navigatieformulier bedoelt, dat is gekomen als vervanger van het Schakelformulier. Dat was al helemaal naatje :). Maar het navigatieformulier vind ik eerlijk gezegd óók een gedrocht. Je zit altijd met formulieren die binnen een ander formulier worden geopend, dus verwijzingen zijn altijd tricky.
 
Navigatie of schakelformulier is volgens mij hetzelfde en is een standaard Access onderdeel. Bij het ontwerp heb je verschillende keuzes in de vormgeving, erg handig en werkt als een speer. Op het sjabloon in de indelingsweergave schuif je de formulieren in en wordt automatisch een knop aan de horizontale of verticale zijde van het navigatieformulier toegewezen. Het punt is dat door de druk op de knop het formulier al automatisch wordt geopend. Als ik dan het commando DoCmd. Open .... ga geven, wordt het formulier twee maal geopend en dat is niet de bedoeling. Ik dacht met "ga naar record" en dan het formulier verversen dat dat de oplossing was. Wat is nog een idee? Voorbeeld Helpmij.jpg
 
Navigatie of schakelformulier is volgens mij hetzelfde en is een standaard Access onderdeel.
Nee, dat is het niet. Het 'oude' schakelbord was heel iets anders dan het huidige Navigatieformulier. Neemt niet weg dat het lastig is om te programmeren, en het echt wel laat afweten tegenover een goed ontworpen eigen startformulier :).
 
Bedoel je eigenlijk te zeggen dat er geen oplossing is. Hoewel alles perfect en naar wens werkt, zou ik het nu ook anders doen. Het is niet anders.

Ik zie het formulier ingevuld staan en kan de records wijzingen etc.. Wanneer ik de instructies geef zoals in item #1 (DoCmd.GoToRecord) dan verschijnt de foutmelding: " Het object Verzamelstaat is niet geopend" en worden de gegevens van het formulier niet aangepast conform het ingestelde record. Het formulier blijft met de gegevens van record 1 staan.
Er is toch te programmeren in het navigatieformulier. De knoppen zijn genummerd en er kan code achtergelaten worden. Het navigatieformulier blijft echter het formulier tonen conform record 1 en kan dit tot nu toe niet aanpassen.. DoCmd.Openform toont een ongewenst tweede formulier.

Ik heb met een extra testknop de instructie DoCmd.OpenForm gegeven. In dat geval opent een extra formulier met de juiste gegevens, wat logisch is maar niet gewenst.

Hoe kun je ongezien (zonder extra/dubbel formulier) toch het getoonde formulier Verzamelstaat voor het programma als "geopend" laten beschouwen zodat de getoonde gegevens alsnog dwingend kunnen worden veranderd?
 
Laatst bewerkt:
Zet eens een voorbeeld op het Forum.

Private Sub Form_Load()
Dim RecordNum As String
RecordNum = TempVars![sIDnummer]
Zo krijg je altijd het eerste idnummer in TempVars.
 
Laatst bewerkt:
Ik gebruik meestal een RecordsetClone om een specifiek record te activeren, i.c.m. Bookmark. Werkt doorgaans prima. Dat nummer haal je dan uit je actieve formulier.
 
Als ik voor het eerst een database maakt en met een probleem zit en men vraagt om een voorbeeld te plaatsen, zou ik dat gelijk doen.

Schrik niet af wanneer je denkt dat we je zullen uitlachen, wij zijn ooit ook zo eens begonnen.

Je mag niet verwachten van beginners dat ze alles maar begrijpen wat er door gevorderde Access gebruikers als antwoord wordt gegeven, zelf zou ik dan weer afhaken.

Helpmij, hoort die mensen ook te helpen en dan niet te onbegrijpelijke programma taal voor te schotelen.

Willen wij een TS helpen, dan moet Zij/Hem wel meewerken door een voorbeeld te plaatsen als we daar om vragen.
Dit helpt ons dan weer om beter naar een oplossing te kunnen zoeken.
 
Dank je wel Pletter. Ik ben wel wat voorzichtig. Ik ben door jullie heel veel geholpen en ben ik daar dankbaar voor en heb daarmee al heel wat bereikt.
Ik heb een voorbeeldje van het navigatiemenu bij item #7 zoals gevraagd meegestuurd. N.av. het voorbeeld was er in #8 een uitleg in verschil navigatie en schakelbord. In #10 krijg ik met de programmaregels TempVars het juiste ID nummer. Het is stabiel gebleken en geeft steeds het juiste ID nummer weer.
Nu blijkt dat het formulier in het navigatieformulier met de juiste gegevens wel te zien is, maar het formulier op één of andere manier is gesloten (zie foutmelding). Als ik een andere record toewijs, dan worden de gegevens van dat record niet ingevuld.
Ik zie het formulier ingevuld staan en kan de records wijzingen etc.. Wanneer ik de instructies geef zoals in item #1 (DoCmd.GoToRecord) dan verschijnt de foutmelding: " Het object Verzamelstaat is niet geopend" en worden de gegevens van het formulier niet aangepast conform het ingestelde record. Het formulier blijft met de gegevens van record 1 staan.
Hoe kun je de gegevens van de velden aanpassen aan het record als het zichtbare formulier is gesloten? Overruled op één of andere manier het navigatieformulier de gegevens en toont deze altijd van record 1?
 
Ik dacht dat dat de bedoeling was. Een voorbeeld db is een hele lastige. Dan moet ik namaken wat ik heb gemaakt. Moet ik bekijken.
 
Zou mooi zijn als het lukt, want dat kijkt toch wat makkelijker. D'r hoeven ook niet veel records in te zitten; genoeg om te zien wat de bedoeling is.
 
Even tijd gemaakt om naar het schakelbord access 2010 te kijken.

Het blijft een gedrocht, ook dat je een formulier niet zo groot kan maken als het scherm, maar dit terzijde.
Je kan schakelen tussen formulieren met DoCmd.OpenForm "Jouw formulier" zonder dat je dubbele formulieren open maakt. Zou dit ook al vreemd vinden.
Ook het meegeven van een filter is geen probleem.

Wil wel even een waarschuwing geven (hoewel niet uitgetest) dat het schakelmenu ook tempvars gebruikt.

Beter om voor de zekerheid zelf een Public user aanmaken om als filter toe te passen.

Vergeet nog een detail: wanneer je in form1 staat kan je direct naar form2 met een filter, zonder dat dat een probleem geeft en zo hoort dat eigenlijk ook.
 
Laatst bewerkt:
Fijn dat je mee blijft denken. Met het navigatie formulier/schakelbord gebruik ik geen DoCmd.Openform. Als ik dat doe, dan opent er een tweede formulier Verzamelstaat. Met de grote schermen van tegenwoordig is het hele formulier zichtbaar. Je suggestie Public user is en filter mij niet duidelijk. Wat bedoel je?
Als ik een aparte knop maak op forumier 1 of zelfs 2, kan ik met DoCmd.Openform en een filter naar het juiste formulier. In dat geval zie ik twee dezelfde formulieren, één met ID 1 en met het gewenste ID. Maar dat is niet mijn doel.
IK heb zelf nog het één en ander getest. Ik heb code toegevoegd aan het formulier Verzamelstaat PvO bij Load_form. De code begint te werken maar er treedt een vreemd verschijnsel op.
Code:
 Private Sub Form_Load()
Dim RecordNum As Integer
RecordNum = TempVars![sIDnummer]                  'Haal uit form Werkorders (Knop Bijlagen) het actuele werknummer
  
Me![Verzamelstaat PvO].SetFocus
DoCmd.GoToRecord Record:=acNext, Offset:=300                '[RecordNum]
End Sub
Als ik als Offset het getal 10 invul, dan gaat het formulier Verzamelstaat naar record 11. Dat is goed. Als ik 300 invul, gaat het naar record 311. Het loopt nu uit de pas. Als ipv een getal de variabele RecordNum plaats, dan zou naar record 900 moeten zijn gegaan, maar gaat naar 913. 1100 wordt 1115. Uit de pas dus. (RecordNum (Integer) geeft het ID nummer weer)
Ik heb ook geprobeerd om te dwingen naar de eerste record te gaan en dan de offset, maar dat helpt niet.
Het lijkt wat te doen maar niet goed. Heb je een voorstel, ik ben benieuwd.
 
Voorbeeld hoe het zou kunnen.

Klik op de macro of open het navigatieformulier, beide zorgen dat het formulier werkorder en verzamelstaat geopend worden. Zelfs het navigatieformulier wordt als ware dubbel geopend, maar je zal zien dat er maar 1 formulier staat.

In de Module kan je zien hoe je Public user (s) aanmaakt.

Bekijk bijlage Verzamelstaat.rar
 
Bedacht mij nog even of het aantal records in form werkorder en verzamelstaat overeen komen, wanneer dit niet het geval is kan er een verschil optreden met goto.record.

Dan kan je beter het formulier openen met een filter.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan