Imprimir página | Cerrar ventana

¿Hace falta MoveLast+If para Do Until rs.EOF?

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86985
Fecha de impresión: 26/Marzo/2026 a las 15:42


Tema: ¿Hace falta MoveLast+If para Do Until rs.EOF?
Publicado por: paloma
Asunto: ¿Hace falta MoveLast+If para Do Until rs.EOF?
Fecha de publicación: 22/Septiembre/2024 a las 15:06

Hola. Me he liado y ahora mismo no soy capaz de continuar. Leyendo este hilo  http://www.mvp-access.com/foro/como-utilizar-el-bucle-doloop_topic86122.html" rel="nofollow - Como utilizar el bucle Do...Loop - Foro de Access y VBA - Página 1 (mvp-access.com)  tenía entendido que no hacía falta pasar MoveLast a Do Until rs.EOF pero tengo problemas. Además, en algunos hilos he visto que indican pasar primero MoveLast y otro no..

Tengo un formulario padre independiente y dentro un subformulario dependiente de la tabla "tblBienes", vinculado por el campo Id. Si yo meto en el subformulario unos valores erróneos, al pulsar el botón guardar del formulario padre los valida y salta mensaje de error, pero si inmediatamente después, elimino el registro del subformulario (la tabla tblBienes se actualiza automáticamente pues es un subformulario con origen de registros, no obstante le paso un Requery) y vuelvo a pulsar el botón Guardar, me sigue saltando el mensaje de aviso, sigue considerando el registro, no sé de dónde. También me lo hace si antes pongo If rs.EOF=False

Me.Subformulario.Form.Requery
Dim rs As DAO.Recordset
Dim Sumatorio As Long
Set rs = Me.Subformulario.Form.RecordsetClone
Do Until rs.EOF
   Sumatorio = Nz(DSum("Porcentaje", "tblBienes", "Id = " & Me.Id), 0)
   If Sumatorio <> 100 Then
      MsgBox "La suma de los porcentajes debe ser 100", vbCritical, "Aviso al guardar"
      Me.Subformulario.SetFocus
      Exit Sub
   End If
rs.MoveNext
Loop

Ahora bien, si pongo antes rs.MoveLast, al eliminar el registro del subformulario ya no salta el error y
sí funciona pero relativamente porque si vuelvo a pulsar guardar, entonces me da error porque el conjunto de registros está vacío, así que no entiendo nada :(

Me.Subformulario.Form.Requery
Dim rs As DAO.Recordset
Dim Sumatorio As Long
Set rs = Me.Subformulario.Form.RecordsetClone
rs.MoveLast
Do Until rs.EOF
   Sumatorio = Nz(DSum("Porcentaje", "tblBienes", "Id = " & Me.Id), 0)
   If Sumatorio <> 100 Then
      MsgBox "La suma de los porcentajes debe ser 100", vbCritical, "Aviso al guardar"
      Me.Subformulario.SetFocus
      Exit Sub
   End If
rs.MoveNext
Loop

¿Cómo realmente hay que recorrer un recordset y evaluar si tiene o no registros? Ya sé que esto está muy trillado, disculpad. Yo antes pasaba un MoveLast, ignoraba el error si no tenía registros y pasaba If rs.RecordCount>0 y luego ya finalmente el bucle si lo precisaba y así, sí funciona para todas las pruebas:

Me.Subformulario.Form.Requery
Dim rs As DAO.Recordset
Dim Sumatorio As Long
Set rs = Me.Subformulario.Form.RecordsetClone
On Error Resume Next
rs.MoveLast
If rs.RecordCount > 0 Then
Do Until rs.EOF
   Sumatorio = Nz(DSum("Porcentaje", "tblBienes", "Id = " & Me.Id), 0)
   If Sumatorio <> 100 Then
      MsgBox "La suma de los porcentajes debe ser 100", vbCritical, "Aviso al guardar"
      Me.Subformulario.SetFocus
      Exit Sub
   End If
rsp.MoveNext
Loop
End If


Tampoco me gusta utilizar On Error Resume Next porque creo que deshabilita los errores para todo el procedimiento, no solo para esa línea.

¿Qué es lo correcto, dónde estoy fallando, por qué si no paso el If a veces falla? Perdonad si el mensaje es algo confuso..

Muchas gracias

Saludos

Saludos,




Respuestas:
Publicado por: xavi
Fecha de publicación: 22/Septiembre/2024 a las 18:43
Hola,

Lo que yo hago es asignar el recordset y, a continuación, mirar si está vacío:

Set rs = Me!Subformulario.Form.RecordsetClone
If rs.EOF Then
  ' Está vacío

Por otro lado, y como información, te cuento como recuperar el control de errores.
Lo habitual es tener una instrucción On Error al inicio del procedimiento que indique a que etiqueta del procedimiento se enviará el código cuando se produzca un error.

On Error GoTo ErrorHandler

Otra opción es la "patada a seguir"

On Error Resume Next

pero eso tiene el peligro que queda activo.

Para volver a "activar" que, de producirse un error, se pare el código, se utiliza

On Error GoTo 0

Lectura recomendada:  https://learn.microsoft.com/es-es/dotnet/visual-basic/language-reference/statements/on-error-statement" rel="nofollow - Instrucción On Error - Visual Basic | Microsoft Learn

Un saludo




-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web


Publicado por: paloma
Fecha de publicación: 22/Septiembre/2024 a las 19:59

Hola xavi, gracias por contestar. Me sigue sin funcionar bien del todo. Si yo elimino el registro del subformulario, el registro efectivamente se ha borrado de la tabla pero al pulsar guardar, me sigue leyendo como si tuviera registros, entra en el recordset (¿?) y me salta el msgbox de error, aunque el valor de Porcentaje sea cero porque no hay ningún registro. No entiendo nada.

Al final he metido esto, que ataca directamente a la tabla que estoy intentando leer los datos, ¿pero por qué no me sale con el recordset?

If IsNull(DLookup("Id", "tblbienes", "Id = " & Me.Id)) = False Then
   Dim rs As DAO.Recordset
   Dim Sumatorio As Long
   Set rs = Me.Subformulario.Form.RecordsetClone
   Do Until rs.EOF
      Sumatorio = Nz(DSum("Porcentaje", "tblbienes", "Id = " & Me.Id), 0)
      If Sumatorio <> 100 Then
         MsgBox "La suma de los porcentajes debe ser 100", vbCritical, "Aviso al guardar"
         Me.Subformulario.SetFocus
         Exit Sub
      End If


Otra cosa. ¿Not rs.EOF sería lo mismo que rs.RecordCount>0 pero sin la necesidad de pasar un MoveLast para que saque bien el conteo de registros?

Saludos,


Publicado por: paloma
Fecha de publicación: 21/Abril/2025 a las 20:27

Hola, pueden cerrar el hilo plis, gracias.


Publicado por: paloma
Fecha de publicación: 12/Agosto/2025 a las 10:59
Hola, este hilo está pendiente de cerrar, gracias,



Imprimir página | Cerrar ventana