Los 12 errores más comunes al trabajar con el objeto Recordset en Access

Índice de Contenido
  1. #1: Eliminar objetos ambiguos
  2. #2: Establecer referencias explícitas
  3. #3: Evitar violaciones de movimiento
  4. Tipo:
  5. #4: Exponer un recuento de registros erróneo
  6. Tipo:
  7. #5: No puedes moverte más allá del primer o último registro
  8. #6: Evitar bucles infinitos
  9. Tipo:
  10. #7: Acomodar objetos Recordset anidados
  11. #8: Evitar errores cuando no hay coincidencia en una búsqueda
  12. #9: Forzar que el registro más nuevo sea el registro actual
  13. #10: Evitar incompatibilidad en ADO con el operador IS
  14. #11: ADO no reconoce el operador And
  15. Tipo:
  16. #12: Cerrar objetos Recordset
  17. Pregunta adicional: DAO vs ADO
  18. Tipo:

#1: Eliminar objetos ambiguos

El objeto ADO es la biblioteca de objetos predeterminada en Access, pero DAO aún está disponible. Si utilizas un Recordset de DAO, debes hacer referencia explícitamente a él. Referenciar ambas bibliotecas es probable que genere un error de objeto ambiguo. Para evitar este tipo de error, prioriza la biblioteca a la que tu código hace referencia con más frecuencia.

En el Editor de Visual Basic, elige Referencias en el menú Herramientas, selecciona la biblioteca principal y haz clic en el botón de subir para colocarla por encima de la otra biblioteca de objetos.

#2: Establecer referencias explícitas

Darle prioridad a la biblioteca principal es bueno (#1). Referenciar explícitamente la biblioteca de cada objeto al declararlos es mejor:

Dim rst As DAO.Recordset
Dim rst As ADODB.Recordset

Combina la regla #1 con la #2 para obtener los mejores resultados.

#3: Evitar violaciones de movimiento

Moverse por los registros de un Recordset es una tarea común, pero hacerlo tiene algunos riesgos. Usar cualquier método de movimiento generará un error si el objeto Recordset está vacío. La forma más confiable de hacer una comprobación es mediante una simple instrucción If antes de ejecutar un método de movimiento:

If Not(rst.BOF And rst.EOF) Then

La propiedad BOF devuelve True cuando la posición actual está antes del primer registro. De manera similar, EOF devuelve True cuando la posición actual está justo después del último registro. Si ambas propiedades son True simultáneamente, el Recordset está vacío.

Vale la pena invertir en minería de datos

Tipo:

Incluir el operador Not es una cuestión de eficiencia. Si esperas que el Recordset contenga registros la mayor parte del tiempo, es más eficiente incluir Not en la comprobación.

#4: Exponer un recuento de registros erróneo

La técnica anterior utiliza las propiedades BOF y EOF para exponer un Recordset vacío antes de que el código pueda generar un error. Otra forma de evitar este tipo de error es utilizar la propiedad RecordCount para contar los registros de la siguiente manera:

If rst.RecordCount <> 0 Then

Esta declaración es un poco impredecible con ADO porque algunos objetos Recordset de ADO devuelven -1 como recuento. Utiliza un cursor estático o de conjunto de claves para obtener un recuento de registros verdadero en un objeto Recordset de ADO.

Cuando uses DAO, debes recordar poblar (completamente) el Recordset antes de contar, de la siguiente manera:

rst.MoveFirst


Fase de análisis: Entendiendo lo que el cliente quiere


rst.MoveLast

If rst.RecordCount <> 0 Then

DAO pobla los registros a medida que se necesitan y, consecuentemente, su propiedad RecordCount considera solo los registros a los que se ha accedido. ADO, por otro lado, define la propiedad RecordCount como el número total de registros, punto. Por eso, esta segunda comprobación de un Recordset vacío es menos flexible y puede resultar problemática.

Tanto si usas RecordCount para comprobar si existen registros como para contarlos, debes recordar las diferencias entre DAO y ADO:

  • Cuando usas DAO, pobla (completamente) el Recordset antes de comprobar si está vacío o contar el número total.
  • Cuando usas ADO, utiliza un cursor estático o de conjunto de claves para obtener el recuento de registros actual.

Tipo:

No uses MoveLast con un Recordset grande para comprobar si está vacío. En su lugar, utiliza MoveNext. Si RecordCount devuelve 1, sabrás que el Recordset no está vacío.

#5: No puedes moverte más allá del primer o último registro

En el consejo #3, te dije que uses las propiedades BOF y EOF para comprobar si un Recordset está vacío. También las usarás individualmente al moverte a través de los registros. Moverte más allá del primer o último registro genera un error. Por ejemplo, el siguiente código genera un error cuando el método MoveNext se mueve más allá del último registro:

Las mejores herramientas de inteligencia empresarial para tomar decisiones basadas en datos
If rst![nombre de campo] = valor Then

...hacer algo...

rst.MoveNext

Si te estás moviendo hacia adelante, usa EOF para evitar el error que se produce al moverte más allá del último registro, de la siguiente manera:

Do While Not rst.EOF

If rst![nombre de campo] = valor Then

...hacer algo...

End If

rst.MoveNext

Cómo agregar una barra de desplazamiento a un gráfico en Excel
Loop

Mientras EOF sea False, lo que significa que la posición actual es un registro válido, este bucle ejecutará la instrucción If. Una vez que la propiedad EOF sea True, la comprobación elimina el error que de lo contrario se produciría al omitir el método MoveNext en el bucle.

#6: Evitar bucles infinitos

En el consejo anterior, un bucle Do se mueve a través de los registros. Si omites el método MoveNext, el bucle quedará atrapado en un bucle infinito. La condición para finalizar el bucle nunca se cumple y la posición dentro del bucle nunca se mueve. Asegúrate siempre de incluir un método MoveNext cuando quieras recorrer un conjunto de registros. No moverse en cualquier tipo de estructura de bucle puede tener el mismo resultado, esto no solo se aplica a los bucles Do.

Tipo:

Si te sucede esto (y le sucede a todos), presiona Ctrl + Break para detener manualmente el código.

#7: Acomodar objetos Recordset anidados

Access 2007 introduce el campo multivalor. Esto significa que, a pesar de lo que todos nos han enseñado, ahora puedes almacenar múltiples valores en un solo campo. Si decides utilizar esta mejora, debes ser capaz de manejar múltiples valores en un campo que realmente podría ser otro objeto Recordset. Al encontrarte con un campo multivalor, debes agregar un bucle para recorrer los valores.

#8: Evitar errores cuando no hay coincidencia en una búsqueda

Puedes aplicar criterios para encontrar registros específicos utilizando los métodos Find o Seek. Sin embargo, cuando el método no encuentra un registro coincidente, devuelve un error. Debes asegurarte de que exista una coincidencia antes de intentar moverte al registro coincidente, utilizando la propiedad NoMatch de la siguiente manera:

rst.Find criterio de búsqueda

If Not rst.NoMatch Then

Migración de RDBMS a NoSQL: Cómo prepararse para el cambio en la gestión de datos

...hacer algo...

End If

(DAO utiliza los métodos FindFirst, FindNext y FindLast). Si no hay un registro coincidente, el código omite la instrucción If y continúa, sin generar un error.

#9: Forzar que el registro más nuevo sea el registro actual

Cuando agregas un registro a un Recordset, podrías esperar que ese registro se convierta en el registro actual. Si esa es tu expectativa, tu código no devolverá los resultados esperados porque eso no es lo que sucede. Si deseas trabajar con el nuevo registro, debes forzar que el registro recién agregado se convierta en el registro actual mediante el establecimiento de un marcador (bookmark) inmediatamente después del método Update, de la siguiente manera:

rst.Update
rst.Bookmark = rst.LastModified

#10: Evitar incompatibilidad en ADO con el operador IS

El método Find de ADO no admite el operador IS. Esto significa que cuando buscas o excluyes NULL, no debes utilizar IS de la siguiente manera:

rst.Find "Apellido Null"

Es exactamente lo contrario en DAO, que requiere IS:

rst.Find "Apellido IS Null"

Esta diferencia puede causar problemas si no la conoces. Debido a que es tan sutil, puede llevar mucho tiempo descubrirlo.

Tecnología para el agua: cómo solucionar los problemas de escasez y contaminación

#11: ADO no reconoce el operador And

DAO te permite buscar registros utilizando una cadena de criterios complejos. Por ejemplo, la siguiente instrucción funciona perfectamente en un Recordset de DAO:

rst.FindNext "IDProveedor = 10 And IDCategoría = 4"

Para mejor o peor, la instrucción ejecutada en un Recordset de ADO (utilizando Find en lugar de FindNext) devolverá un error porque ADO no admite el operador And de esta manera.

Para aplicar varios criterios a una tarea de búsqueda en ADO, utiliza en su lugar la propiedad Filter:

rst.Filter = "IDProveedor = 10 AND IDCategoría = 4"

DAO también tiene una propiedad Filter, pero funciona de manera diferente. DAO trabaja con conjuntos de Recordset posteriores, mientras que ADO trabaja en el Recordset actual.

Tipo:

Utiliza la propiedad RecordCount para contar el número de registros en un Recordset filtrado.

#12: Cerrar objetos Recordset

Cuando el código ha terminado con un objeto Recordset, ciérralo de la siguiente manera:

10 formas creativas en que la tecnología está luchando contra el cambio climático
rst.Close

Un Recordset abierto, especialmente en versiones antiguas de Access, puede causar problemas. En resumen, es posible que no puedas cerrar la aplicación.

Pregunta adicional: DAO vs ADO

Dentro del mundo de Visual Basic, hay dos objetos Recordset: Recordset y Recordset1 (nuevo en 2007). Es importante recordar que las versiones DAO y ADO de estos objetos no son intercambiables, ya que admiten distintos métodos, propiedades y eventos. Esto puede ser confuso si piensas que ADO es solo una mejora o una actualización posterior de DAO. De hecho, las dos bibliotecas resuelven problemas diferentes. DAO fue diseñado específicamente para el motor de base de datos Microsoft Jet. ADO fue diseñado para proveedores OLE DB y puede ser mucho más simple y flexible que DAO. Sin embargo, DAO casi siempre es más eficiente cuando se trabaja directamente con Jet.

Saber cómo planeas utilizar un Recordset y luego utilizar la biblioteca más adecuada. Mi mejor consejo es elegir una biblioteca y utilizarla exclusivamente siempre que sea posible. Las similitudes y diferencias son demasiado numerosas para enumerarlas aquí, pero puedes encontrar información en línea.

Tipo:

  • Propiedades, métodos y eventos del objeto Recordset
  • Referencia a DAO
  • Apéndice A: Referencia rápida de DAO a ADO

En Newsmatic nos especializamos en tecnología de vanguardia, contamos con los artículos mas novedosos sobre Big Data, allí encontraras muchos artículos similares a Los 12 errores más comunes al trabajar con el objeto Recordset en Access , tenemos lo ultimo en tecnología 2023.

Artículos Relacionados

Subir

Utilizamos cookies para mejorar su experiencia de navegación, mostrarle anuncios o contenidos personalizados y analizar nuestro tráfico. Al hacer clic en “Aceptar todo” usted da su consentimiento a nuestro uso de las cookies.