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)
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 FunctionTop
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.
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
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:
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 :
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.
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 SubTop
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.
TopEen 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