Aantal Records tellen

Status
Niet open voor verdere reacties.

Rene71

Gebruiker
Lid geworden
2 aug 2012
Berichten
133
staat er in het SubfrmtblUnit Totaal Unit/ Coli 2 het in het Grotere vette tekst Staat Unit 1 van 1 maar dat moet zijn Unit 1 van 2

als ik op de knop laatste Unit klikt (derde van links) gaat het weer wel goed. maar bij het openen dus niet
onder staande code wordt er voor gebruikt
wat gaat er niet goed ?

Code:
Private Sub Form_Current()
On Error Resume Next

Dim X As Integer
X = DMax("[Unit]", "tblUnit", "[PBID] =" & Forms![frmPakbon]![PBID])

If IsNull(X) Then
    Me!Unit.DefaultValue = 100
Else
    Me!Unit.DefaultValue = X + 100
End If

    If Me.CurrentRecord = 1 Then
        Me.cmdvorige.Enabled = False
           Else
        Me.cmdvorige.Enabled = True
           End If
    If Me.CurrentRecord >= Me.Recordset.RecordCount Then
        Me.cmdvolgende.Enabled = False
        
    Else
        Me.cmdvolgende.Enabled = True
       
    End If
    If Me.NewRecord Then
        Me.cmdnieuw.Enabled = False
    Else
        Me.cmdnieuw.Enabled = True
    End If

    If Me.NewRecord Then
        Me.lblRecordCounter.Caption = _
         "Nieuwe Unit " & Me.CurrentRecord & " van " & Me.Recordset.RecordCount + 1
    Else
        Me.lblRecordCounter.Caption = _
         "Unit " & Me.CurrentRecord & " van " & Me.Recordset.RecordCount
         End If
         
End Sub
http://we.tl/hTkW5kxOD7
 
Logisch dat je 1 krijgt als waarde; een Recordset weet namelijk nooit hoeveel records er in zitten tot je hem doorloopt naar het laatste record. Dus als je op de knop <Laatste record> klikt, ga je naar het eind van de tabel, en weet je hoeveel records er zijn. Bij het openen sta je altijd op het eerste record, en is de counter dus 1.
Overigens snap ik deze constructie ook niet helemaal:
Code:
    X = DMax("[Unit]", "tblUnit", "[PBID] =" & Forms![frmPakbon]![PBID])
    If IsNull(X) Then
        Me.Unit.DefaultValue = 100
    Else
        Me.Unit.DefaultValue = X + 100
    End If
Elke keer als je bladert wordt de DefaultValue met 100 opgehoogd. Ook al doe je verder niks...
 
voor het tellen de records
snap ik niet wat er mis gaat
als ik in de formulier eigenschappen de optie Navigatieknoppen op ja zet
is het "probleem" er niet
moet er dan nog stukje code bij of moet het geheel anders

voor de X = DMax
heb ik een Regelnummer willen maken
en het getal 100 heb ik als test opgegeven
met doet wel hetgeen ik wou
het opslaan van de regel nummer
en om niet eindeloos nummers aan te maken
heb ik de knop volgende op Enabled = false gezet als het bij de laatste record is

Code:
If Me.CurrentRecord >= Me.Recordset.RecordCount Then
        Me.cmdvolgende.Enabled = False
        
    Else
        Me.cmdvolgende.Enabled = True


maar sta altijd open voor ideeën en oplossingen :D
 
als ik in de formulier eigenschappen de optie Navigatieknoppen op ja zet is het "probleem" er niet
Als je een tabel (waar de navigatieknoppen altijd al in zitten) of een formulier mét navigatieknoppen zichtbaar opent, dan zie je (vooral bij grote tabellen) dat je niet gelijk het aantal records in de tabel ziet verschijnen in het navigatievenster. Dat kan er op duiden dat Access in weergaven mét navigatieknoppen wél een telling uitvoert, en in een formulier zónder navigatieknoppen niet. In het laatste geval is het ook niet opportuun, omdat je toch niet kunt zien hoeveel records er zijn.
Voor mij is dit verschijnsel ook één van de redenen om formulieren met behulp van recordsets te openen, en dan liefst ADO omdat je dan kunt opgeven met welk type CursorType je de recordset wilt openen.
Met DAO zit er weinig anders op dan de cursor eerst naar het eind te verplaatsen (rs.Movelast en rs.MoveFirst) voordat je het juiste aantal records kunt opvragen met rs.RecordCount. En dat is (vermoed ik) ook de techniek die Access zelf gebruikt, omdat DAO standaard actief is in een db, en ADO niet. Het aantal records opvragen met ADO is dus ook nog eens sneller.
 
als ik het met ADODB probeer krijg ik een compileer fout
Code:
Dim rst As ADODB.RecordSet
Dim lngCount As Long

rst.Open "tblUnit"

With rst

If .EOF = False Then
    
    .MoveFirst
    .MoveLast
    lngCount = .RecordCount
Else
    
End If

End With

If lngCount = 0 Then
    Me.lblRecordCounter.Caption = "Unit 0 van 0"
    
Else
    Me.lblRecordCounter.Caption = "Unit " & Me.CurrentRecord & " van " & lngCount
    
End If
 
Laatst bewerkt:
zo gaat het wel / ook
Code:
Dim rst As DAO.Recordset
Dim lngCount As Long
Set rst = Me.RecordsetClone
With rst
 .MoveFirst
 .MoveLast
 lngCount = .RecordCount
 End With
    If lngCount = 0 Then
        Me.lblRecordCounter.Caption = "Unit 0 van 0"
   Else
        Me.lblRecordCounter.Caption = "Unit " & Me.CurrentRecord & " van " & lngCount
    End If
 
Als je mijn berichtje goed had gelezen, dan had je geweten dat je met ADO juist niet de Movelast --> MoveFirst hoeft uit te voeren, als je de juiste CursorType gebruikt. Nu kun je net zo goed DAO gebruiken, waarvoor je geen bibliotheek nodig hebt.
 
Je hebt wederom gelijk Michel
ik gooi wel eens meer de dingen door elkaar
ik was al blij dat ik het gewenste resultaat zag met DAO

de lblRecordcounter blijft met onderstaande code steken op Unit 0 van 0
daar ben ik dus nog niet uit, maar blijf het proberen

maar met de DAO optie kreeg ik een antwoord op de vraag

Bedankt voor je uitleg Michel

Code:
Dim rst As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim strSQL As String
Set rst = New ADODB.Recordset
Set cnn = New ADODB.Connection
Set cnn = CurrentProject.Connection
strSQL = "SELECT * from tblUnit"
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic
Debug.Print rst.RecordCount

   If rstSQL = 0 Then
        Me.lblRecordCounter.Caption = "Unit 0 van 0"
   Else
        Me.lblRecordCounter.Caption = "Unit " & Me.CurrentRecord & " van " & rstSQL
    End If
Set cnn = Nothing
Set rst = Nothing
 
OK, om te beginnen: je ADO aanpak is in beginsel prima; hiermee krijg je gelijk zonder rs.MoveLast+rs.MoveFirst het juiste aantal records. Alleen: de manier waarop je denkt dat je het aantal kunt opvragen, is een beetje fout. (ik zeg beetje, maar je snapt waar ik heen wil hoop ik ;) ). Je gebruikt in je voorbeeld een variabel rstSQL die nergens gevuld wordt. Wél heb je een variabele strSQL gebruikt. Ofwel een 'slip of the tongue', of je hebt een stuk code weggelaten.
Als je de variabelenaam per abuis verkeerd hebt getypt, wat kan natuurlijk, dan zou het verbeteren ervan je probleem overigens ook niet oplossen, want in die variabele zit alleen een SQL string. Dat doet op zichzelf helemaal niks. In ieder geval niet een recordset openen en uitlezen. Dat moet je echt doen binnen de recordset. En dan ziet het er zo uit:
Code:
Dim rst As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim strSQL As String
    Set rst = New ADODB.Recordset
    Set cnn = New ADODB.Connection
    Set cnn = CurrentProject.Connection
    strSQL = "SELECT * from tblUnit"
    With rst
        .Open strSQL, cnn, adOpenKeyset, adLockOptimistic
        Debug.Print .RecordCount
        If .RecordCount = 0 Then
             Me.lblRecordCounter.Caption = "Unit 0 van 0"
        Else
             Me.lblRecordCounter.Caption = "Unit " & .AbsolutePosition & " van " & .RecordCount
        End If
    End With
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan