VBA DoCmd.GoToRecord

Status
Niet open voor verdere reacties.
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.
Offset heeft niks met ID nummers te maken; een tabel heeft een ingebouwde counter, en met Offset ga je naar het zoveelste record, meer niet. Ongeacht welk ID (of Autonummer) daar bij hoort. Is dus zeer onbetrouwbaar om te gebruiken, want de sortering van je tabel kan de hele volgorde al veranderen, terwijl Offset dan nog steeds naar datzelfde record gaat. Niet gebruiken, is mijn advies.
 
Ik gebruik automatische nummering en tot nu (afgelopen 3 jaar) toe is alles op volgorde. Maar kan ik dan wel doen?
 
Wat al eerder aangegeven is:

Dim stLinkCriteria As String
user.Nummerid = Me.Id
'DoCmd.OpenForm "Verzamelstaat"
'DoCmd.GoToRecord , , acGoTo, user.Nummerid
stLinkCriteria = "[id]=" & user.Nummerid
DoCmd.OpenForm "Verzamelstaat", , , stLinkCriteria
Dit kan je dan ook in het navigatieformulier toepassen.
 
Laatst bewerkt:
Of gebruik RecordSetClone en een Bookmark. Werkt feilloos.
 
Het is voor elkaar, de code werkt. Omdat er steeds bij het wisselen van formulier een kopie wordt gemaakt van de database, vraag ik mij af hoeveel netwerkverkeer er steeds plaatsvind tussen de FE en BE? Kan dit wel goed gaan als vier personen (4x FE) steeds van formulier wisselen? Worden alle gegevens van de tabel met duizenden records steeds opgehaald en als kopie bewaard op de FE pc?
Code:
Private Sub Form_Load()
Dim RecordNum As Integer
Dim strCriteria As String
Dim rsClone As DAO.Recordset
RecordNum = TempVars![sIDnummer] 
    Set rsClone = Me.RecordsetClone
    rsClone.MoveFirst
    strCriteria = "[o_Opdracht ID]=" & RecordNum
    rsClone.FindFirst strCriteria
    Me.Bookmark = rsClone.Bookmark
    Forms![Verzamelstaat PvO].Bookmark = rsClone.Bookmark
    Forms![Verzamelstaat PvO].Form.Refresh
    rsClone.Close
End Sub
 
Omdat er steeds bij het wisselen van formulier een kopie wordt gemaakt van de database, vraag ik mij af hoeveel netwerkverkeer er steeds plaatsvind tussen de FE en BE?
Prima dat het gelukt is, maar wat bedoel je hier mee? De grap van een FE-BE is nou juist dat er geen complete kopieën van database heen en weer worden geslingerd. Al was het maar om de continuïteit en integriteit van de data te borgen. Iedereen werkt in dezelfde backend, en niet in een (eigen) kopie daarvan.
 
Er wordt gebruik gemaakt van een clone (rsClone), dus een kopie van de tabel ga ik van uit. Dit zou betekenen dat alle datagegevens van de tabel uit de backend naar de frontend wordt gekopieerd. Dat is nogal wat data heen en weer. Ik vraag mij of het zo werkt en of het geen consequenties heeft voor het vele dataverkeer bij het wisselen van formulieren door meerdere personen. Is dit zo?
 
Dat zie je (gelukkig) verkeerd. Een Recordsetclone is géén fysieke kopie van je tabel. Een clone is slechts een verwijzing naar de originele tabel. Dus alle pointers in de clone zijn identiek aan de pointers in de originele tabel. Daarom kun je met een RecordSetClone veel sneller navigeren.
 
Dank voor jullie bijdrage, weer veel geleerd. VBA programmeren is langzamerhand een verslaving geworden.
 
Een RecordsetClone is niet hetzelfde als een Clone; noella heeft zich niet helemaal juist ingelezen. Een RecordsetClone is een kopie (in het geheugen) van de recordset die onder het formulier hangt, dat al is ingelezen. Er wordt dus geen extra leesactie op de backend gedaan, want de recordset is al ingelezen. Ik vind het ook een beetje overbodig om gelijk over overflow te praten; niet iedereen werkt bij een multinational met megagrote tabellen. Ik heb bijvoorbeeld nog nooit in mijn carrière last gehad van een overflow met een RecordsetClone. Maar nu ik dit lees, sta ik toch de volgende keer dat ik het toepas al bij voorbaat te trillen op mijn benen....
 
Moet ik mij zorgen gaan maken? Hoewel alles goed werkt, constateer ik een niet verwacht verloop van de VBA code. In het formulier zijn Private Sub Form_Load() en Private Sub Form_Current() te vinden. Als ik de code van item #26 in Private Sub Form_Load() stap voor stap doorloop zie ik dat de procedure wordt doorlopen tot en met de regel Me.Bookmark = rsClone.Bookmark, dan niet doorloopt maar doorgaat naar Private Sub Form_Current() en vervolgens terugkeert naar de volgende coderegel Forms![Verzamelstaat PvO].Bookmark = rsClone.Bookmark enz.. Waarom wordt onderweg een uitstapje naar Private Sub Form_Current() gemaakt, is dit goed?
 
Bij elke wijziging in de onderliggende tabel, wordt Form_Current opnieuw doorlopen. Het is zaak je functies zó te maken, dat dat zo weinig mogelijk gebeurt. Dat werkt namelijk nogal vertragend in je formulier, als je steeds dezelfde procedure uit laat voeren. Het is dus belangrijk dat je de acties scheidt en ze neerzet bij de juiste plek. Wanneer moet Current draaien, en wat hoort bij Load?
 
VBA Access Dao Recordset Bookmark wijst verkeerde record aan

Het schakelen tussen twee formulieren Werkorder en Verzamelstaat werkt. In principe worden in beide formulieren de gegevens van de record met hetzelfde ID nummer getoond. Toch is er iets merkwaardigs. Als ik een werkorder formulier met een willekeurige ID selecteer en schakel naar de Verzamelstaat, dan gaat het goed. De Verzamelstaat met hetzelfde ID nummer wordt getoond. Selecteer ik in de Werkorder het formulier met het hoogste ID, laatste record van de tabel Opdrachten (ID=1213), dan wordt Verzamelstaat met nummer 1 (ID=1) weergegeven. Dit is niet goed, het moet het hoogste ID nummer hebben.
In de code heb ik op drie plaatsen een Msgbox geplaatst om de ID nummers te controleren.
Code:
Private Sub Form_Load()
Dim RecordNum As Integer
Dim strCriteria As String
Dim rsClone As DAO.Recordset

'Routine Bepaalt record huidige werkordernummer
    RecordNum = TempVars![sIDnummer]                                'Haal uit form Werkorders het actuele werknummer

    Set rsClone = Me.RecordsetClone
    rsClone.MoveFirst
MsgBox "Huidige positie: " & rsClone.AbsolutePosition                     'Box 1

    strCriteria = "[o_Opdracht ID]=" & RecordNum
MsgBox strCriteria                                                         'Box 2

    rsClone.FindFirst strCriteria.
    Me.Bookmark = rsClone.Bookmark
MsgBox "Huidige positie: " & rsClone.AbsolutePosition                     'Box 3

    Forms![Verzamelstaat PvO].Bookmark = rsClone.Bookmark
    Forms![Verzamelstaat PvO].Form.Refresh
    rsClone.Close
End Sub

Resultaten:
Bij het selecteren van een willekeurige werkorder = Box 1 - 0, Box 2 - [o_Opdracht ID]=1210 (willekeurig formulier met ID=1210 en is goed), Box 3 - 1175 (Dit is altijd 1175 en niet goed)
Bij het selecteren van het laatste werkorder formulier = Box 1 - 0, Box 2 - [o_Opdracht ID]=1213 (hoogste ID en is goed), Box 3 - 0.


Mogelijk gebruik ik AbsolutePosition verkeerd en kun je een record aanwijzen ipv. de positie opvragen.
Waarom wordt altijd in Box 3 ID=1175 weergegeven? Ook als ik de database herstart. Waarom wordt bij de hoogste ID van de tabel in Box 3 de waarde 0 gegeven en het eerste formulier getoond?
 
Laatst bewerkt:
Allemaal vragen waar ik zonder db geen antwoord op kan geven :).
 
Begrijpelijk. Het werkt allemaal en ik was in de veronderstelling dat de Clone code goed werkt. Wat vreemd is: Ik heb vanwege een test de laatste twee regels Forms! . . . uitgeschakeld. Nog steeds wordt het formulier getoond met het juiste ID nummer, behalve de laatste ID. Als ik ook de coderegel Me.Bookmark = rsClone.Bookmark uitschakel, dan wordt het formulier getoond met ID=1. Dus de laatste twee regels om het goede formulier te tonen, doen niets.
 
Waarom wordt bij de hoogste ID van de tabel in Box 3 de waarde 0 gegeven en het eerste formulier getoond?

Zou op het internet even kijken naar Access AbsolutePosition
Daar kan je de uitleg vinden.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan