Recordcount werkt niet meer zoals verwacht

Status
Niet open voor verdere reacties.

Peetbeest

Gebruiker
Lid geworden
1 mei 2013
Berichten
44
Beste Accessers,

In het verleden heb ik steeds volgende code gebruikt om voor de navigatie in formulieren en subformulieren:

PHP:
Private Function Navigatie()
    On Error Resume Next
    Dim RSC As Object 'RecordSet Contacts
    Dim AC As Integer 'Aantal Contacts
    
    Set RSC = Me.RecordsetClone
    
    If Not RSC.BOF And Not RSC.EOF Then
        RSC.MoveLast
    End If

    AC = RSC.RecordCount

    If Me.NewRecord Then
        Me.RecordTeller1.Caption = "New Contact"
        Me.RecordTeller2.Caption = "New Contact"
    Else
        Me.RecordTeller1.Caption = "Contact " & Me.CurrentRecord & " from " & AC
        Me.RecordTeller2.Caption = "Contact " & Me.CurrentRecord & " from " & AC
        Me.KnopNieuwRecord.Enabled = True
    End If

    If Me.CurrentRecord = 1 Then
        Me.KnopVorigeRecord.Enabled = False
        Me.KnopEersteRecord.Enabled = False
    Else
        Me.KnopVorigeRecord.Enabled = True
        Me.KnopEersteRecord.Enabled = True
    End If

    If Me.CurrentRecord = AC Then
        Me.KnopLaatsteRecord.Enabled = False
    Else
        Me.KnopLaatsteRecord.Enabled = True
    End If

    If Me.CurrentRecord >= AC Then
        Me.KnopVolgendeRecord.Enabled = False
        Me.KnopLaatsteRecord.Enabled = False
    Else
        Me.KnopVolgendeRecord.Enabled = True
        Me.KnopLaatsteRecord.Enabled = True
    End If
End Function

In het verleden heeft deze code altijd perfect gewerkt maar nu ik een nieuwe db aan het maken ben doet deze het plotseling niet meer. Bij het openen van het formulier worden het aantal records in het main- en subform goed weergegeven. Wanneer ik echter begin te navigeren in het mainform worden het aantal records in het subform niet meer correct weergegeven; geen probleem bij geen of één record, bij meerdere records wordt steeds 1 weergegeven.
Dit euvel doet zich enkel voor bij een enkelvoudig subform, bij een doorlopend form worden wel het juiste aantal records weergegeven. Ook worden het juiste aantal records weergegeven wanneer ik de navigatieknoppen van Access inschakel, maar dat is niet de bedoeling omdat ik met bovenstaande code m'n eigen navigatie wil maken.
Waar ga ik in de fout? Wat zie ik over het hoofd? Wie kan me helpen?

Alvast hartelijk bedankt,
Dirk.
 
Behalve dat ik niet snap waarom je de recordset niet als Recordset definieert maar als object, zie ik niet zo heel veel fouten, al kan het wat slimmer:
PHP:
Dim rsc As DAO.Recordset
    
    Set rsc = Me.RecordsetClone
    With rsc
        If Not .BOF And Not .EOF Then
            .MoveLast
            ac = .RecordCount
            .Close
        End If
    End With
    With Me
        If .NewRecord Then
            .RecordTeller1.Caption = "New Contact"
            .RecordTeller2.Caption = "New Contact"
            .KnopNieuwRecord.Enabled = False
        Else
            .RecordTeller1.Caption = "Contact " & .CurrentRecord & " from " & ac
            .RecordTeller2.Caption = "Contact " & .CurrentRecord & " from " & ac
            .KnopNieuwRecord.Enabled = True
        End If
        .KnopVorigeRecord.Enabled = Not Me.CurrentRecord = 1
        .KnopEersteRecord.Enabled = Not Me.CurrentRecord = 1
        .KnopLaatsteRecord.Enabled = Not Me.CurrentRecord = ac
        .KnopVolgendeRecord.Enabled = Not Me.CurrentRecord >= ac
        .KnopLaatsteRecord.Enabled = Not Me.CurrentRecord >= ac
    End With

Doe er eens een voorbeeldje bij, want ik gebruik zelf ook regelmatig een eigen teller, en ik kan dit probleem niet reproduceren.
 
Beste Michel,
Ik heb m'n db serieus afgeslankt om ze te kunnen posten. Ik heb mijn code vervangen door de jouwe maar het probleem blijft hetzelfde. Als je Companies1 opent zie je 3 contactpersonen in het subform (Contact 1 from 3). Als je naar het volgende bedrijf gaat en terugkeert naar het eerste zie je dat er op het subform "Contact 1 from" komt te staan. De records worden dus niet geteld en de knoppen om te navigeren zijn ook inactief, met uitzondering van "New Record".
Ik hoop dat jij ziet waarom dit gebeurt, ik begin de moed te verliezen.
Alvast hartelijk bedankt Michel,
Dirk.
Bekijk bijlage Test.rar
 
Ik had niet verwacht dat mijn code veel verschil zou uitmaken, want ik heb slechts jouw code een beetje opgeschoond. In essentie is het dezelfde code dus, die overigens voor zover ik het kan bekijken gewoon zou moeten werken. Ik zal er vanavond een blik op werpen!
 
Dat stel ik zeer erg op prijs Michel.
Ik begrijp niet wat er aan de hand is want voor mij heeft die code altijd gewerkt, tot nu.
 
Hij loopt fout op de BOF en EOF. Als je die er uithaalt, werkt het weer prima.
Code:
    Set rsc = Me.RecordsetClone
    With rsc
        On Error Resume Next
        .MoveLast
        ac = .RecordCount
        .Close
    End With
 
THANKS Michel, it works. Ik heb alle formulieren aangepast met jouw oplossingen en nu zijn er geen problemen meer.
Ik heb nog twee vragen:
Ten eerste: Hoe ben je bij die foute regel gekomen (If Not RSC.BOF And Not RSC.EOF Then)? Ik kreeg hier geen foutmelding.
Ten tweede: Ik had m'n vorige code reeds in 2 dbs een 50-tal formulieren) gebruikt zonder problemen, deze werken trouwens nog steeds. In deze database zijn de problemen met m'n oude code begonnen. Hoe is dit te verklaren?
Thanks Michel, you're a great help, as always.:thumb:
 
Lastige vragen.... Ik gebruik zelden of nooit If Not rs.BOF And Not rs.EOF omdat je er nooit zeker van kan zijn dat de recordset op dat moment goed wordt ingelezen. Dat is de eerste keer dat je de code start wellicht nog wel het geval, maar een tweede keer al een stuk lastiger. Blijkbaar is DAO niet goed in staat om de positie van de cursor in de recordset te bepalen. Hoe dan ook: als ik jouw code gebruik, dan skipt hij dus de controle als je na het bladeren vanuit een leeg record teruggaat naar een gevulde recordset, met als gevolg dat hij de teller niet aanpast. Met ADO zou je dat probleem niet hoeven te hebben, omdat je met ADO rechtstreeks het aantal records kunt uitlezen (mits je het goede cursortype instelt).

De techniek die ik hier gebruik is ook niet helemaal netjes, omdat het commando .MoveLast niet werkt (althans: een foutmelding oplevert) bij een lege recordset. Vandaar dat je On Error Resume Next nodig hebt om dat te omzeilen. Omdat je de variabele ac in de procedure declareert, krijgt die standaard de waarde 0, en als de procedure dus over ac = .RecordCount heenspringt, heeft ac automatisch de waarde 0, wat je op dat moment ook wilt. En dan werkt de procedure verder dus normaal.

Op vraag 2 heb ik dus eigenlijk geen antwoord; ik denk dat het antwoord een beetje voortkomt uit vraag 1: een andere manier van de recordset openen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan