Markieren einer Position in einem DAO-Recordset

Ein Lesezeichen ist ein vom System generiertes Bytearray, das jeden Datensatz eindeutig identifiziert. Die DAO Bookmark-Eigenschaft eines Recordset-Objekts ändert sich jedes Mal, wenn Sie zu einem neuen Datensatz wechseln. Um einen Datensatz zu identifizieren, wechseln Sie zu diesem Datensatz, und weisen Sie dann den Wert der DAO Bookmark-Eigenschaft einer Variablen vom Typ Variant zu. Um zum Datensatz zurückzukehren, legen Sie die DAO Bookmark-Eigenschaft auf den Wert der Variablen fest.

Das folgende Codebeispiel zeigt, wie Sie das Produkt finden, das den höchsten und geringsten Umsatz pro Kategorie erzielt, indem Sie ein Lesezeichen zum Speichern der aktuellen Datensatzposition verwenden. Mithilfe eines Lesezeichens können Sie andere Vorgänge für das Recordset-Objekt ausführen und dann zur gespeicherten Datensatzposition zurückkehren.

Sub GetProductStats() 
 
Dim dbsNorthwind As DAO.Database 
Dim rstProducts As DAO.Recordset 
Dim rstCategories As DAO.Recordset 
Dim varFirstMark As Variant 
Dim varHighMark As Variant 
Dim varLowMark As Variant 
Dim curHighRev As Currency 
Dim curLowRev As Currency 
Dim strSQL As String 
Dim strCriteria As String 
Dim strMessage As String 
 
On Error GoTo ErrorHandler 
 
   Set dbsNorthwind = CurrentDb 
 
   strSQL = "SELECT * FROM Products WHERE UnitsOnOrder >= 40 " & _ 
            "ORDER BY CategoryID, UnitsOnOrder DESC" 
   Set rstProducts = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) 
   If rstProducts.EOF Then Exit Sub 
 
   StrSQL = "SELECT CategoryID, CategoryName FROM Categories " & _ 
            "ORDER BY CategoryID" 
   Set rstCategories = dbsNorthwind.OpenRecordset(strSQL, dbOpenSnapshot) 
 
   ' For each category find the product generating the least revenue 
   ' and the product generating the most revenue. 
   Do Until rstCategories.EOF 
 
      strCriteria = "CategoryID = " & rstCategories![CategoryID] 
      rstProducts.FindFirst strCriteria 
      curHighRev = rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] 
 
      If Not rstProducts.NoMatch Then 
 
         ' Set bookmarks at the first record containing the CategoryID. 
         varFirstMark = rstProducts.Bookmark 
         varHighMark = varFirstMark 
         varLowMark = varFirstMark 
 
         ' Find the product generating the most revenue. 
         Do While rstProducts![CategoryID] = rstCategories![CategoryID] 
            If rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] > _ 
            curHighRev Then 
               curHighRev = rstProducts![UnitPrice] * _ 
                            rstProducts![UnitsOnOrder] 
               varHighMark = rstProducts.Bookmark 
            End If 
            rstProducts.MoveNext 
         Loop 
 
         ' Move to the first record containing the CategoryID. 
         rstProducts.Bookmark = varFirstMark 
         curLowRev = rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] 
 
         ' Find the product generating the least revenue. 
         Do While rstProducts![CategoryID] = rstCategories![CategoryID] 
            If rstProducts![UnitPrice] * rstProducts![UnitsOnOrder] < _ 
            curLowRev Then 
               curLowRev = rstProducts![UnitPrice] * _ 
                           rstProducts![UnitsOnOrder] 
               varLowMark = rstProducts.Bookmark 
            End If 
            rstProducts.MoveNext 
         Loop 
 
      End If 
 
      ' Set high and low bookmarks to build the message string. 
      strMessage = "CATEGORY:  " & rstCategories!CategoryName & _ 
                   vbCrLf & vbCrLf 
      rstProducts.Bookmark = varHighMark 
      strMessage = strMessage & "HIGH: $" & curHighRev & "  " & _ 
                   rstProducts!ProductName & vbCrLf 
      rstProducts.Bookmark = varLowMark 
      strMessage = strMessage & "LOW:  $" & curLowRev & "  " & _ 
                   rstProducts!ProductName 
      MsgBox strMessage, , "Product Statistics" 
      rstCategories.MoveNext 
   Loop 
 
   rstProducts.Close 
   rstCategories.Close 
   dbsNorthwind.Close 
 
   Set rstProducts = Nothing 
   Set rstCategories = Nothing 
   Set dbsNorthwind = Nothing 
 
Exit Sub 
 
ErrorHandler: 
   MsgBox "Error #: " & Err.Number & vbCrLf & vbCrLf & Err.Description 
End Sub

Ein Lesezeichen ist nützlich, wenn eine Methode fehlschlägt, da die aktuelle Datensatzposition nicht definiert ist. Die LastModified-Eigenschaft des Recordset-Objekts bietet eine gute Veranschaulichung der Verwendung eines Lesezeichens. Die LastModified-Eigenschaft gibt die Textmarke des letzten Datensatzes im Recordset-Objekt zurück, der hinzugefügt oder geändert werden soll. Um sie zu verwenden, legen Sie die DAO Bookmark-Eigenschaft wie folgt auf die LastModified-Eigenschaft fest.

rstCustomers.Bookmark = rstCustomers.LastModified 

Dadurch wird der zuletzt hinzugefügte oder geänderte Datensatz als aktueller Datensatz angezeigt. Dies ist besonders beim Hinzufügen neuer Datensätze hilfreich, da in diesem Fall der Datensatz, der den Fokus hatte, bevor Sie den neuen Datensatz hinzugefügt haben, als aktueller Datensatz angezeigt wird. Mit der LastModified-Eigenschaft können Sie zum neu hinzugefügten Datensatz wechseln, falls die Anwendung dies erwartet. Wenn Sie ein Recordset-Objekt schließen, werden alle gespeicherten Textmarken ungültig.

Es ist nicht möglich, eine Textmarke aus einem Recordset-Objekt in einem anderen Recordset-Objekt zu verwenden, selbst wenn beide Recordset-Objekte auf derselben Tabelle oder Abfrage basieren. Sie können jedoch ein Lesezeichen für den Klon eines Recordsets verwenden, wie im folgenden Beispiel gezeigt.

Dim dbsNorthwind As DAO.Database 
Dim rstOriginal As DAO.Recordset 
Dim rstDuplicate As DAO.Recordset 
Dim varBookMark As Variant 
 
   Set dbsNorthwind = CurrentDb 
 
   ' Create the first Recordset. 
   Set rstOriginal = dbsNorthwind.OpenRecordset("Orders", dbOpenDynaset) 
 
   ' Save the current record position. 
   varBookMark = rstOriginal.Bookmark 
 
   ' Create a duplicate Recordset. 
   Set rstDuplicate = rstOriginal.Clone() 
 
   ' Go to the same record. 
   rstDuplicate.Bookmark = varBookMark 
 
   rstOriginal.Close 

Sie können auch die Bookmark-DAO-Eigenschaft für das Recordset-Objekt verwenden, das einem Formular zugrunde liegt. Mit dieser Eigenschaft kann im Code markiert werden, welcher Datensatz derzeit auf dem Formular angezeigt wird, bevor zu einem anderen Datensatz gewechselt wird. Sie können beispielsweise auf einem Formular mit Personalangaben eine Schaltfläche einfügen, auf die ein Benutzer klicken kann, um den Datensatz für den Vorgesetzten eines Angestellten anzuzeigen.

Hinweis

Dynasets, die auf bestimmten verknüpften Tabellen basieren, z. B. Paradox-Tabellen ohne Primärschlüssel, unterstützen weder Lesezeichen noch Recordset-Objekte vom Typ Forward-Only. Sie können ermitteln, ob ein bestimmtes Recordset-Objekt Lesezeichen unterstützt, indem Sie den Wert der Bookmarkable-Eigenschaft überprüfen.

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.