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.
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de