Recordset .Movelast

Status
Niet open voor verdere reacties.

Nico84

Gebruiker
Lid geworden
21 jul 2011
Berichten
191
Nog een vraag:

Code:
Dim strSQL As String
Dim rs As Recordset               

strSQL1 = "SELECT tbl_Debiteuren.DebiteurID, tbl_Order.OrderID, tbl_Order.Orderdatum, tbl_Order.Goedgekeurd " _
& "FROM tbl_Debiteuren INNER JOIN tbl_Order ON tbl_Debiteuren.DebiteurID = tbl_Order.DebiteurId " _
& "WHERE (((tbl_Debiteuren.DebiteurID)= " & Me.txtDebiteurnr & " ) AND ((tbl_Order.Goedgekeurd)=No))"



Set rs = CurrentDb.OpenRecordset(strSQL)
rs.MoveLast
                
If rs.RecordCount = 0 Then
      MsgBox "Alle orders zijn goedgekeurd"
ElseIf rs.RecordCount = 1 Then
      MsgBox "Er is 1 niet goedgekeurde order"
Else
      MsgBox "Er zijn meerdere niet goedgekeurde orders gevonden"                    
End If

Dit werkt, alleen als er in de recordset geen records voorkomen krijg ik de foutmelding:
Fout 3021 tijdens uitvoering: Geen huidige record. En in de vba editor wordt de regel rs.movelast geel.

Movelast heb je volgens mij wel nodig anders doet recordcount geen zuivere telling.
 
Je moet eerst checken of er records zijn, voordat je kunt gaan tellen. Overigens heb je de variabele rs niet nodig:

Code:
With CurrentDb.OpenRecordset(strSQL)
    If Not .BOF And Not .EOF Then
        .MoveLast
        .MoveFirst
        If .RecordCount = 1 Then
              MsgBox "Er is 1 niet goedgekeurde order"
        Else
            MsgBox "Er zijn " & .RecordCount & " niet goedgekeurde orders gevonden"
        End If
    Else
        MsgBox "Alle orders zijn goedgekeurd"
    End If
    .Close
End With
 
Laatst bewerkt:
Waar gebruik je dan wel een recordset voor?

Onderstaand voorbeeldje gaat toch wel met een recordset?
En hoe kan je dit dan het beste declareren als DAO of ADO of maak niet uit?

Wil altijd alles graag weten. :(
Code:
Dim intVeldnr As Integer
Dim rs As Recordset
Dim strSQL As String
    
strSQL = "SELECT tbl_Artikel.ArtikelID, tbl_Artikel.Actief, tbl_Artikel.ArtikelOmschrijving, tbl_Artikel.Prijs " _
& "FROM tbl_Artikel " _
& "WHERE (((tbl_Artikel.Actief)=Yes)) " _
& "ORDER BY tbl_Artikel.ArtikelID;

        
    intVeldnr = 0

    Set rs = CurrentDb.OpenRecordset(strSQL)
    With rs
        Do While Not .EOF
            intVeldnr = intVeldnr + 1
            Me("txtArtnr" & intVeldnr) = .Fields("ArtikelID")
            Me("txtArtnaam" & intVeldnr) = .Fields("ArtikelOmschrijving")
            .MoveNext
        Loop
        Close
    End With
    
    Set rs = Nothing
 
Dit is genoeg:

Code:
Dim intVeldnr As Integer
Dim strSQL As String
    
    strSQL = "SELECT ArtikelID, Actief, ArtikelOmschrijving, Prijs " _
    & "FROM tbl_Artikel WHERE (Actief=Yes) ORDER BY ArtikelID;"
    intVeldnr = 0
    With CurrentDb.OpenRecordset(strSQL)
        If Not .BOF And Not .EOF Then
            Do While Not .EOF
                intVeldnr = intVeldnr + 1
                Me("txtArtnr" & intVeldnr) = .Fields("ArtikelID")
                Me("txtArtnaam" & intVeldnr) = .Fields("ArtikelOmschrijving")
                .MoveNext
            Loop
        End If
        Close
    End With
Overigens wel weer met een extra check op het aanwezig zijn van records.
 
Durf het bijna niet te vragen, maar waar gebruik je dan wel een recordset voor?
 
Ik gebruik Recordsets meestal bij ADO connecties. DAO zit standaard in Access (om het even simpel te houden) en je hoeft een DAO recordset dan ook niet als zodanig te benoemen (wat je dan ook niet gedaan had). Ooit komt er een moment dat Microsof DAO niet meer ondersteunt, al lees ik die geluiden al jaren, dus ik zie ons nog wel een decennium met DAO werken. Maar als je de DAO versie bekijkt, (al eeuwen 3.6) dan weet je dat DAO al heel lang niet meer ontwikkeld wordt. ADO daarentegen zit ondertussen op versie 6.1 in Access 2010. In elke nieuwe Access versie zit wel een nieuwere ADO variant.

Wat zijn de verschillen? Voor normaal gebruik niet eens zo heel veel; de syntax lijkt ook erg op elkaar. Maar een verschil is bijvoorbeeld dat je bij DAO de database moet benoemen, bij ADO hoeft dat niet, en dat je met ADO een virtuele tabel kunt maken, wat met DAO niet kan. ADO wordt ook wat vaker gebruikt denk ik bij database connecties via web pagina's. Hier vind je wat meer informatie.
Overigens is het niet verkeerd om een recordset te definiëren, maar je neemt daarmee wat geheugenruimte weg terwijl dat niet hoeft. En ik probeer dus overbodige handelingen zoveel mogelijk te vermijden.
 
Als ik het goed begrijp gaat access bij de onderstaande regels er vanzelf uit dat het een DAO recordset is/gedeclareerd.
Code:
Dim rs As Recordset
With CurrentDb.OpenRecordset(strSQL)

Onderstaande regel in mijn voorbeeld is overbodig want,
Code:
Set rs =  CurrentDb.OpenRecordset(strSQL)
doet het zelfde met
Code:
With CurrentDb.OpenRecordset(strSQL)

Wat gebeurt er als DAO toch niet meer ondersteunt gaat worden?
Moet alles dan omgezet worden ADO?
 
Laatst bewerkt:
Jij definieert expliciet een recordset, in principe is dat inderdaad niet nodig.
Kwaad kan het niet, als jij jouw aanpak prettiger vind, gewoon doen.

Wat octaFish nog opmerkt over geheugenruimte is onjuist.
Geheugenruimte wordt niet gereserveerd als een recordset gedefinieerd wordt maar pas als de recordset daadwerkelijk wordt aangemaakt (= als er daadwerkelijk gegevens zijn om vanuit de recordset opgehaald te worden).

DAO is springlevend en dat zal nog wel even zo blijven.
Sterker nog, DAO is aangepast voor Access 2007 en daarna voor Access 2010, ook al zie je dat niet in de benaming van de DAO object library terug.

Tardis
 
Aanvulling: ik hield het simpel in mijn uitleg, omdat ik ervan uitga dat iemand die een recordset definieert (declareert dus) dat doet om hem ook te gebruiken. En dan wordt de geheugenruimte dus inderdaad gereserveerd. Maar de opmerking van Tardis is uiteraard wel correct.
Een opdracht als Set rs = Nothing is ook overbodig, want als de procedure wordt gesloten, wordt de recordset ook verwijderd.
 
Laatst bewerkt:
Bedankt voor de hulp en de uitleg. Weer een stapje wijzer geworden.:thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan