Evitar el error de fin de registros en la lectura de un formulario

Tengo un formulario que he de leer y por cada una de las líneas he de realizar un proceso pero en la ultima línea me da un error:

utilizo estas instrucciones:

Dim bucle As Integer
Dim i As Integer
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount

....... Ejecución de instrucciones 

DoCmd.GoToRecord , , acNext
Next

He probado utilizar:

For i = 1 To Me.Recordset.RecordCount -1

pero no me lee el ultima línea del Form.

¿

¿Habría otra forma de poderlo realizar?

1 Respuesta

Respuesta
1

Tal como yo lo veo, tienes dos opciones para recorrer los registros de un formulario cargado:

La mejor (en mi opinión) es usar un recordset, clonando el origen de datos del formulario, algo que es más rápido, y no te dará ese problema que mencionas:

Dim rst As DAO.Recordset
Set rst=Me.RecordsetClone
rst.moveFirst
Do Until rst.EOF
'Aquí las operaciones
rst.movenext
Loop

La segunda opción, usando ese código, es controlar el error, ya que no lo puedes evitar:

On error goto sol_err
'aquí tu código anterior
Salida:
Exit Sub
sol_err:
If Err.Number=2105 Then
Resume next
Else
Msgbox "Se ha prducido el erroro " & err.number & ": " & Err.descripcion
End If

He tomado como referencia la primera opción que me indicas con estas instrucciones que realizo por cada una de las líneas del Formulario Principal:

Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
rst.MoveFirst
Do Until rst.EOF

DoCmd.OpenForm "ARTICULOSUNIDADES"
Forms!ARTICULOSUNIDADES!Nombre = Me.Nombre
Forms!ARTICULOSUNIDADES!IdFamilia = Me.IdFamilia
Forms!ARTICULOSUNIDADES!TPedido = Me.TPedido
Forms!ARTICULOSUNIDADES!Unidades = Me.Unidades

rst.MoveNext
Loop

Me pasa por cada una de las líneas sin darme ningún error al finalizar las lecturas pero solo extrae los datos de la primera línea del Form.

Dentro del Formulario ARTICULOSUNIDADES es donde se realizan los cálculos por cada una de las líneas del Formulario Principal.

A ver, yo sé de tu BD lo que pones en tu pregunta, ergo, mi respuesta es un tanto general, porque no sé las operaciones que haces por el medio (porque no las indicaste).

Ahora, obviamente el apaño no te funciona por varios motivos: primero, tendrías que usar el propio recordset para gestionar los datos de los registros, y segundo, me parece que el recordset lo abres sobre el formulario equivocado...

Para no complicarnos excesivamente a preguntas y respuestas, te sugiero que optes por añadir el control de errores al código inicial, solucionarás más rápido tu problema.

Revisando tu código, creo que así te funcionará, aunque habría otra formas, en mi opinión mejores, de hacerlo:

Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
rst.MoveFirst
Do Until rst.EOF
DoCmd.OpenForm "ARTICULOSUNIDADES"
Forms!ARTICULOSUNIDADES!Nombre = rst("Nombre")
Forms!ARTICULOSUNIDADES!IdFamilia = rst("IdFamilia")
Forms!ARTICULOSUNIDADES!TPedido = rst("TPedido")
Forms!ARTICULOSUNIDADES!Unidades = rst("Unidades")
DoCmd. Close acForm, "ARTICULOSUNIDADES"
Rst. MoveNext
Loop

Entiendo que desde el formulario en que tienes el código abres el formulario ARTICULOSUNIDADES y le insertas los datos de cada registro de ese formulario en registros nuevos de ARTICULOSUNIDADES . Supongo también que ARTICULOSUNIDADES se te abrirá en un registro nuevo, si no estarás sobreescribiendo datos en un mismo registro...

Me esta dando en esta primera instrucción:

Forms!ARTICULOSUNIDADES!Nombre = rst("Nombre")

El Formulario ARTICULOSUNIDADES es un Formulario de Calculo, no inserta ningún dato.

El proceso es el siguiente:

En el primer Form ARTICULOSLOTES existen los productos correspondientes a un Lote de Productos.

Por cada uno de los Productos he de calcular el PVP que viene recogido del segundo Form ARTICULOSUNIDADES que es donde se calcula el precio de venta.

Traspaso los datos desde el primer Form al segundo y desde allí a través del evento ejecuto los cálculos correspoendientes

He de recorrer cada uno de los productos del Lote y acceder al segundo formulario donde se recalcula el precio de venta para cada una de las líneas y ese precio he de devolverlo al formulario ARTICULOSLOTES al Campo PVPLOTE.

Y no se si es esta la mejor manera de hacerlo.

A ver, en tu código tienes:

Forms!ARTICULOSUNIDADES!Nombre = Me.Nombre

Que significa:

En el campo Nombre del formulario ARTICULOSUNIDADES ponme lo que está en el registro activo del formulario que corre el código en el campo Nombre.

Si abres un clon del recordset del formulario activo, tendría que existir un campo "Nombre", y por tanto no tendría que darte ese error. Esa es la teoría. Ahora, si el formulario activo tiene campos que no existen en el recordset (campos independientes), pues el planteamiento de mi solución se va al traste...

Insisto, no te compliques más de la cuenta con lo del recordset, y opta por gestionar el error (segunda opción de mi primera respuesta), pues solo has de añadir unas pocas lineas de código l que ya tenías inicialmente

De esta forma que me has indicado me hace perfectamente las lecturas.

Muchas gracias por toda tu ayuda

Jose, aprender a manejar los errores de Access es algo básico, y en casos como este, te ahorrará mucho tiempo (no tienes que hacer un pregunta en un foro y esperar que alguien te la solucione), y con algo tan simple como añadir un control de errores a tus procedimientos, puedes hacer virguerías.

Te dejo un enlace al capítulo del curso de VBA de mi compañero Neckkito en el que trata el tema: https://drive.google.com/file/d/0B91iZhlpwhqycEF2XzM2Z3lHX1E/view

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas