DAO Recordset

Begin

Recordset, Types, Opties.

Het object DAO.Recordset is waarschijnlijk het meeste gebruikte object van DAO. Vooral wanneer men toegang wil hebben tot de data van een database voor bewerkingsdoeleinden, en in het bijzonder op één rij. Indien meerdere rijen moeten verwerkt worden maakt men beter gebruik van Syntax :

Set rst = db.OpenRecordset(Bron,Type,Opties,LockEdits)
  • De Bron is ofwel de naam van een tabel, een query of een SQLExpressie.
  • In MS Access gebruik ik 3 Types van DAO.Recordset's
    1. dbOpenTable of een set van records in een lokale Access-database gebaseerd op een tabel, kan gebruik maken van indexen (snel zoeken) en de data kan bewerkt worden. Kan niet toegepast worden op gelinkte tabellen.
    2. dbOpenDynaset een set van records van zowel een tabel of een query of een SQL expressie, kan ook meestal bijgewerkt worden. Kan wel toegepast worden op gelinkte tabellen. Bij een dbDynaset kan niet snel gezocht worden (Seek- methode).
    3. dbOpenSnapShot data kan niet bijgewerkt worden, en ook snel zoeken (Seek-methode) is niet mogelijk.
    Wanneer men bij het creëren van een recordset geen type opgeeft, zal Access afhankelijk van de bron, een tabel of een query, zelf het type kiezen.
  • De Opties zijn bepalend voor meer-gebruikers toegang en bewerkingsmogelijkheden van de recordset.
    1. dbAppendOnly enkel rijen toevoegen en ook enkel bij dbDynaset recordsets.
    2. dbDenyWrite in meer-gebruikers toepassingen, andere gebruikers kunnen geen wijzigingen aanbrengen.
    3. dbForwardOnly, wanneer gebruikt met het dbOpenSnapShot type kan men snel voorwaarts doorheen de recordset bewegen.
    4. dbReadOnly, men kan de data enkel bekijken, terwijl andere gebruikers wijzigingen kunnen aanbrengen.
  • LockEdits zijn van toepassing in meer-gebruikers toepassingen.
    1. dbPessimistic, van zodra de Edit-methode wordt toegepast kan de andere gebruiker geen wijzigingen meer aanbrengen, is Standaard in Jet.
    2. dbOptimistic, enkel wanneer de Update-methode toegepast wordt kunnen andere gebruikers geen wijzigingen aanbrengen.
Top

Een Recordset creëren.

'recordset op basis van een tabel
            Function fOpenTabel() As Long
            Dim dbLokaal As DAO.Database
            Dim rstTabel As DAO.Recordset
            Set dbLokaal = CurrentDb
            Set rstTabel = dbLokaal.OpenRecordset("tblOrders", dbOpenTable)
                If rstTabel.RecordCount < > 0 Then
                    rstTabel.MoveLast
                    fOpenTabel = rstTabel.RecordCount
                Else
                    fOpenTabel = 0
                End If
            rstTabel.Close
            Set rstTabel = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Function

            'Recordset op basis van een query
            Function fOpen_Query() As Long
            Dim dbLokaal As DAO.Database
            Dim rstQuery As DAO.Recordset
            Set dbLokaal = CurrentDb
            Set rstQuery = dbLokaal.OpenRecordset("qselOrdersVerkoper1", dbOpenDynaset)
                If rstQuery.RecordCount < > 0 Then
                    rstQuery.MoveLast
                    fOpen_Query = rstQuery.RecordCount
                Else
                    fOpen_Query = 0
                End If
            rstQuery.Close
            Set rstQuery = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Function

            'recordset op basis van een SQL-Expressie
            
            Function fOpenSQL() As Long
            Dim dbLokaal As DAO.Database
            Dim rstSQL As DAO.Recordset
            Dim strSQL As String
            Set dbLokaal = CurrentDb
            strSQL = "SELECT IDKlant, VerkoperNaam, VerkoperVNaam, Product" _
            & " FROM tblOrders INNER JOIN tblVerkoper ON tblOrders.IDVerkoper = tblVerkoper.IDVerkoper" _
            & " WHERE Product= " & Chr(39) & "Ajuinen" & Chr(39) & ";"

            Set rstSQL = dbLokaal.OpenRecordset(strSQL, dbOpenDynaset)
                If rstSQL.RecordCount < > 0 Then
                    rstSQL.MoveLast
                    fOpenSQL = rstSQL.RecordCount
                Else
                    fOpenSQL = 0
                End If
            rstSQL.Close
            Set rstSQL = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Function

            'andere gebruikers kunnen geen wijzingen aanbrengen aan de tabel
            Function fOpenTabelDW() As Long
            Dim dbLokaal As DAO.Database
            Dim rstTabel As DAO.Recordset
            'andere gebruikers kunnen geen wijzingen aanbrengen aan de tabel
            Set dbLokaal = CurrentDb
            Set rstTabel = dbLokaal.OpenRecordset("tblOrders", dbOpenTable, dbDenyWrite)
                If rstTabel.RecordCount < > 0 Then
                    rstTabel.MoveLast
                    fOpenTabel = rstTabel.RecordCount
                Else
                    fOpenTabel = 0
                End If
            rstTabel.Close
            Set rstTabel = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Function
            
Top

Bewegen doorheen een Recordset.

Vooraf enkele Eigenschappen: als men door een Recordset wil bewegen moet men vooral controleren indien er wel degelijk rijen (records) aanwezig zijn.

  • BOF betekent dat men op het eerste record zit (BOF = True)
  • EOF betekent dat men op het laatste record zit (EOF = True)

Beide eigenschappen laten toe om te controleren indien men geen 'lege' Recordset heeft

If Not rst.BOF And Not rst.EOF Then
                'er zijn wel degelijk rijen in de Recordset
            'End If
            
  • RecordCount is een eigenschap die het aantal rijen in een Recordset geeft, en laat ook toe te controleren indien men geen 'lege' Recordset heeft.
If rst.RecordCount > 0 Then
                'er zijn wel degelijk rijen in de Recordset
            End If
            

Er zijn 5 methoden waarmee men door een Recordset kan bewegen:

  1. MoveFirst -> ga naar de eerste rij
  2. MoveLast -> ga naar de laatste rij
  3. MovePrevious -> ga naar de voorgaande rij
  4. MoveNext -> ga naar de volgende rij
  5. Move -> doorloopt opgegeven rijen, zowel voorwaarts (positief) als achterwaarts (negatief), en dit vanaf de huidige rij of vanaf een bewaarde Bookmark.
    rst.Move aantalrijen, Bookmark(optioneel)

Belangrijke opmerking over de Recordcount eigenschap : Om het juiste aantal rijen te krijgen is het noodzakelijk om eerst tot het laatste record te gaan.

	rst.MoveLast
                lngAantal = rst.RecordCount
            

Alle rijen van een Recordset doorlopen kan met volgende code

Public Sub sDoorheenRST()
            Dim dbLokaal As DAO.Database
            Dim rstTabel As DAO.Recordset
            Dim lngDummy As Long
            Set dbLokaal = CurrentDb
            Set rstTabel = dbLokaal.OpenRecordset("tblOrders", dbOpenTable)
                If rstTabel.RecordCount <> 0 Then
                    rstTabel.MoveLast
            
                        Do Until rstTabel.BOF
                            lngDummy = lngDummy + 1
                     'of doe hier een zinvollere bewerking
                            rstTabel.MovePrevious
                        Loop
                End If
            Debug.Print lngDummy
            rstTabel.Close
            Set rstTabel = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Sub
            
Top

Data vinden in een dbOpenTable Recordset.

Men kan zoeken via de snelle SeekMethode. Seek impliceert echter dat men op een index zoekt en die moet ook opgegeven worden. Is vooral interessant indien men op een numerieke unieke index moet zoeken bijvoorbeeld klantnummer. De Seek methode start met zoeken vanaf het begin van de recordset, dit betekent dat de methode niet in een 'Loop' kan toegepast worden, men zal steeds op hetzelfde record uitkomen.
Mogelijke operatoren "=", "<", "<=", >=", ">".

Public Sub sZoekenSeek()
            Dim dbLokaal As DAO.Database
            Dim rstTabel As DAO.Recordset

            Set dbLokaal = CurrentDb
            Set rstTabel = dbLokaal.OpenRecordset("tblPersoon", dbOpenTable)
            rstTabel.Index = "PrimaryKey"
                rstTabel.Seek "=", 5203
                If rstTabel.NoMatch Then
                    Debug.Print "niet gevonden"
                Else
                    Debug.Print rstTabel("PersNaam")
                End If
            rstTabel.Close
            Set rstTabel = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Sub
            
Top

Data vinden in een dbOpenDynaset of dbOpenSnapShot Recordset.

Niettegenstaande de 'Seek' methode hier niet kan toegepast worden, is het zoeken veel flexibeler, en hier kan men wel 'Loops' gebruiken. Er zijn 4 verschillende methodes :

  1. FindFirst
  2. FindNext
  3. FindPrevious
  4. FindLast

Syntax voor alle vier :

	rst.FindFirst criteria
            

Waar criteria een WHERE SQL-expressie is, echter zonder het woord WHERE

Public Sub sZoekenDynaset()
            Dim dbLokaal As DAO.Database
            Dim rstDynaset As DAO.Recordset
            Dim strResultaat As String
            Set dbLokaal = CurrentDb
            Set rstDynaset = dbLokaal.OpenRecordset("SELECT * FROM tblPersoon", dbOpenDynaset)
                rstDynaset.MoveFirst
                rstDynaset.FindFirst "PersNaam = " & Chr(39) & "Depauw & Chr(39) & """
                strResultaat = rstDynaset("IDPersoon") & "|"
                Do While Not rstDynaset.NoMatch
                    rstDynaset.FindNext "PersNaam = " & Chr(39) & "Depauw" & Chr(39) & ""
                    strResultaat = strResultaat & rstDynaset("IDPersoon") & "|"
                Loop
                Debug.Print strResultaat
            rstDynaset.Close
            Set rstDynaset = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Sub
            
Top

Recordset Bookmark.

Een Bookmark functioneert in zekere zin als een bladwijzer, het laat toe snel naar een bezochte rij terug te keren. Men kan een Bookmark instellen door de waarde van een Bookmark(getal) toe te wijzen aan een variabele.
Om opniuew naar de rij te gaan kent men de waarde van de variabele toe aan Recordset bookmark.

Function fBladwijzer()
            Dim dbLokaal As DAO.Database
            Dim rst As DAO.Recordset
            Dim varBookmark As Variant
            Dim str1 As String
            Dim str2 As String
            Set dbLokaal = CurrentDb
            Set rst = dbLokaal.OpenRecordset("SELECT * FROM tblPersoon ORDER BY PersNaam", dbOpenSnapshot)
                rst.MoveFirst
                    rst.Move 120
                    varBookmark = rst.Bookmark
                    str1 = rst("PersNaam") & "|" & rst("IDPersoon")
                rst.MoveLast
                    rst.Bookmark = varBookmark
                    str2 = rst("PersNaam") & "|" & rst("IDPersoon")
            fBladwijzer = (str1 = str2)
            End Function
            
Top

Data bewerken in een Recordset.

dbOpenTable en dbOpenDynaset Recordsets kunnen in principe bewerkt worden, tenzij een andere gebruiker dit belet. Zie Open opties en LockEdits.

  • Data wijzigen :
    1. Ga naar de gewenste rij
    2. Gebruik de Edit methode van de recordset
    3. Breng de wijzigingen aan
    4. Gebruik de Update methode van de recordset.
  • Een nieuwe rij toevoegen :
    1. Gebruik de AddNew methode van de recordset
    2. Voeg de data toe
    3. Gebruik de Update methode van de recordset
  • Een rij verwijderen
    1. Ga naar de gewenste rij
    2. Gebruik de Delete methode van de recordset
Een rij bewerken
            Public Sub sWijzigRST()
            Dim dbLokaal As DAO.Database
            Dim rst As DAO.Recordset
            
            Set dbLokaal = CurrentDb
            Set rst = dbLokaal.OpenRecordset("SELECT * FROM tblPersonen WHERE IDPersoon = " & 5)
            If Not rst.BOF And Not rst.EOF Then
                rst.Edit
                    rst("PersoonNaam") = "Verstraeten"
                rst.Update
            End If
            rst.Close
            Set rst = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Sub
            
            Een rij toevoegen
            Public Sub sToevoegenRij()
            Dim dbLokaal As DAO.Database
            Dim rst As DAO.Recordset
            
            Set dbLokaal = CurrentDb
            Set rst = dbLokaal.OpenRecordset("SELECT * FROM tblPersonen;")
                With rst
                    .AddNew
                    ![PersoonNaam] = "Merlevede"
                    ![PersoonVNaam] = "Michel"
                    ![PersoonGeslacht] = "M"
                    ![PersoonGebDat] = #4/21/1967#
                    .Update
                End With
            rst.Close
            Set rst = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Sub
            
            Een rij verwijderen.
            Public Sub sVerwijderenRij()
            Dim dbLokaal As DAO.Database
            Dim rst As DAO.Recordset
            'Opgepast men krijgt geen verwitting dat men een record zal verwijderen.
            Set dbLokaal = CurrentDb
            Set rst = dbLokaal.OpenRecordset("SELECT * FROM tblPersonen WHERE IDPersoon = " & 9 & ";")
                If Not rst.BOF And Not rst.EOF Then
                    rst.Delete
                End If
            rst.Close
            Set rst = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Sub
            
Top

Clone van een Recordset, en RecordsetClone eigenschap van een formulier.

Een Clone van een recordset is als het ware een copie van de recordset. Het is mogelijk om een andere actieve rij te bekijken tov de basis recordset, en is dus handig om waarden binnen dezelfde recordset te vergelijken.

 Public Sub sClone()
            Dim dbLokaal As DAO.Database
            Dim rstEen As DAO.Recordset
            Dim rstCloneEen As DAO.Recordset

            Set dbLokaal = CurrentDb
            Set rstEen = dbLokaal.OpenRecordset("tblOrders", dbOpenTable)
            Set rstCloneEen = rstEen.Clone
            rstEen.Index = "PrimaryKey"
            rstCloneEen.Index = "PrimaryKey"
                rstEen.Seek "=", 15174
                Debug.Print rstEen("OrderDatum")
                rstCloneEen.Seek "=", 15174
                Debug.Print rstCloneEen("OrderDatum")
                rstCloneEen.Seek "=", 15195
                Debug.Print rstCloneEen("OrderDatum")
            rstEen.Close
            Set rstEen = Nothing
            rstCloneEen.Close
            Set rstCloneEen = Nothing
            dbLokaal.Close
            Set dbLokaal = Nothing
            End Sub
            

Met de RecordsetClone eigenschap van een formulier kan men een clone verwezenlijken van de recordset van het formulier. Zie navigeren naar een record.

Top

Een record aan een tabel toevoegen.

            Private Sub cmdBewaar_Click()
                Dim dbLokaal As DAO.Database
                Dim rstWand As DAO.Recordset
                    Set dbLokaal = CurrentDb
                    Set rstWand = dbLokaal.OpenRecordset("tblWan", dbOpenTable, dbAppendOnly)
                    rstWand.AddNew
                    rstWand("DatWan") = Me.txtDatWan
                    rstWand("AfsWan") = Me.txtAfsWan
                    rstWand("MinWan") = Me.txtMinWan
                    rstWand("SecWan") = Me.txtSecWan
                    rstWand("HarWan") = Me.txtHarWan
                    rstWand("InfWan") = Me.txtInfWan
                    rstWand.Update
                rstWand.Close
                Set rstWand = Nothing
                dbLokaal.Close
                Set dbLokaal = Nothing
            End Sub
            
Top
Begin