Marcar una posición un objeto Recordset de DAO

Un marcador es una matriz de bytes generada por el sistema que identifica de forma exclusiva cada uno de los registros. La propiedad Bookmark de DAO de un objeto Recordset cambia cada vez que el usuario se mueve a un nuevo registro. Para identificar un registro, desplácese a él y, a continuación, asigne el valor de la propiedad Bookmark de DAO a una variable de tipo Variant. Para regresar al registro, establezca la propiedad Bookmark de DAO en el valor de dicha variable.

En el ejemplo de código siguiente se muestra cómo buscar el producto que más y menos ingresos por categoría usa un marcador para guardar la posición del registro actual. El uso de un marcador permite realizar otras operaciones en el objeto Recordset y regresar a la posición del registro guardada.

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

Un marcador es útil si se produce un error en un método porque la posición del registro actual no está definida. La propiedad LastModified del objeto Recordset proporciona una buena ilustración de cómo usar un marcador. La propiedad LastModified devuelve el marcador del último registro del objeto Recordset que se ha agregado o modificado. Para usarlo, establezca la propiedad Bookmark de DAO igual a la propiedad LastModified , como se indica a continuación.

rstCustomers.Bookmark = rstCustomers.LastModified 

Esta operación mueve la posición del registro actual al último registro que se ha agregado o modificado. Esto es sumamente útil cuando se agregan nuevos registros, ya que, después de hacerlo, el registro actual será el registro en el que se encontraba antes de realizar la adición. La propiedad LastModified le permite desplazarse al registro que acaba de agregar si eso es lo que la aplicación espera que suceda. Cuando se cierra un objeto Recordset, los marcadores guardados dejarán de ser válidos.

No se puede utilizar un marcador de un objeto Recordset en otro objeto Recordset, aun cuando ambos objetos Recordset estén basados en la misma tabla o consulta subyacente. Sin embargo, puede usar un marcador en el clon de un objeto Recordset, como se muestra en el ejemplo siguiente.

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 

También puede utilizar la propiedad Bookmark de DAO en el objeto Recordset subyacente de un formulario. Con esta propiedad, el código que cree podrá marcar el registro que se está viendo actualmente en el formulario y, a continuación, cambiar el registro que se muestra. Por ejemplo, en un formulario que contiene información sobre los empleados, podría incluir un botón que muestre el registro del supervisor de un empleado.

Nota:

Los conjuntos dinámicos basados en determinadas tablas vinculadas, como tablas paradojas que no tienen ninguna clave principal, no admiten marcadores ni objetos Recordset de solo avance. Para determinar si un objeto Recordset determinado admite marcadores, compruebe el valor de la propiedad Bookmarkable.

Soporte técnico y comentarios

¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.