docmd.findrecord

Status
Niet open voor verdere reacties.

Samsung6713

Gebruiker
Lid geworden
24 dec 2019
Berichten
209
Goedemorgen,

ik heb een stukje code waarmee ik naar een specifiek record wil gaan.
De records staan niet op volgorde van id, dus volgens mij is GotoRecord dan geen optie.

Het uitvoerde van de code
Code:
DoCmd.FindRecord IGotoID, , False, , True, , False
duurt 13 seconden.
Dit in een database met nog maar een paar honderd records.

Ik heb geen flauw idee waarom dat het zo lang duurt.
Iemand een idee wat er fout is, of een snellere manier?

helpmij.PNG
 
Is dat de enige manier?

Het is van belang dat de paar honderd records in beeld blijven zodra de actie is uitgevoerd.

13 seconden voor het vinden van een nummer in een paar honderd records is toch mega traag?
 
Is zeker traag. Normaal gesproken zou je er een index op zetten, maar omdat het vermoedelijk een ODBC koppeling is, zal dat niet lukken. Je kan er wellicht een apart subformulier voor maken waarin je dat ene record apart laat zien.
 
Heb je wél een index, dan kun je de Seek methode gebruiken; die is een stuk sneller.
 
Heb het nu zo opgelost
Code:
    DoCmd.ApplyFilter , “ID = ‘iGotoID '”
    DoCmd.FindRecord lGotoID, , False, , True, , False

De verwerkingstijd is nu 3 seconden
 
Ik snap niet helemaal wat je filter doet, want ik kan het niet reproduceren zonder foutmeldingen. Maar alleen al dit stukje ("ID = 'iGotoID '") lijkt mij fout op alle denkbare fronten. Maar als het werkt, dan werkt het :).
 
Het is inderdaad helemaal fout, geen idee waarom maar het leek eerst te werken.

Inmiddels ben ik aan het stoeien met bookmark en recordsetclone maar tot nog toe geen succes.
 
We zien wel een voorbeeldje verschijnen als je écht hulp nodig hebt :).
 
Gebruik je een keuzelijst om het record te vinden? Dan kun je dit proberen bij de gebeurtenis <Bij klikken>:
Code:
Private Sub cboZoekRecord_Click()
' De record zoeken die overeenkomt met het besturingselement
Dim rs As DAO.Recordset
    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Id] = " & Me.cboZoekRecord.Value
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub

Uiteraard even de veldnamen aanpassen.
 
Het record moet gevonden worden nadat er via een knop een record is toegevoegd.
Code:
Public Sub DoKnopVoorRegel(iKnop As Integer)

Dim rstClone As DAO.Recordset
    DoRequery False

    Set rsclone = Me.RecordsetClone

    rsclone.FindFirst "[id] = 'IGotoID'"

    If Not rsclone.EOF Then Me.bookmark = rsclone.bookmark


'    DoCmd.FindRecord lGotoID, , False, , True, , False
    
End Sub

Ik weet niet wat ik nu fout doe, maar nu wordt het eerste record geselecteerd.:confused:
 
Leg eerst eens uit wat [ID]/IGotoID voor veld/variabele is, want het oogt als een numeriek veld, maar je behandelt het als tekst. Lijkt mij dat er dan iets niet klopt.
 
Dan is je filter dus fout, want je behandelt een getal als tekst. Dat kan niet. Ik zou dit verwachten:
Code:
     rsclone.FindFirst "[id] = " & IGotoID
(Zoals ik al zei: in je oorspronkelijke code was zo'n beetje alles fout wat er fout kon zijn :)).
 
Samsung6713,

ID is een numeriek veld, IGotoID is een long, is ook al vragen om problemen, Id zou dan ook Long moeten zijn als je daar op wilt zoeken.

Waar wil je nu op zoeken het Id nummer of IGotoID? Denk op IGotoID.

Minder dan 2 seconde op honderd record dan ging mijn pc het raam uit, mijn C64 was nog sneller.

Probeer deze code eens.



Code:
Dim ts As long

    ts = IGotoID
    Me.Requery
    Me.IGotoID.SetFocus
    DoCmd.FindRecord ts, acEntire


Gr. Cor
 
ID is een numeriek veld, IGotoID is een long, is ook al vragen om problemen, Id zou dan ook Long moeten zijn als je daar op wilt zoeken.
Autonummervelden zijn Lange Integer :). Overigens moet je wel bar veel records hebben als je met een Integer variabele niet uit zou komen. Dus iGotoID zou ook best een Integer mogen zijn. Daar ga je volgens mij niet mee de teil in. Wat een extra variabele zou moeten doen, is mij trouwens ook een raadsel :).
 
Per week komen er tussen de 400 en 600 records bij, het totaal aantal records komt ruim over de 40000 records tot heden. Met een normale integer kom ik er dus niet.
 
Je kan nog zo'n 25.000 vooruit :). Maar sowieso is het handig om een Long te gebruiken voor een Autonummerveld. Met dezelfde gegevenstypes ga je immers niet de bietenbak op.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan