** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - ¿Hace falta MoveLast+If para Do Until rs.EOF?
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

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

 Responder Responder
Autor
Mensaje
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 139
Enlace directo a este mensaje Tema: ¿Hace falta MoveLast+If para Do Until rs.EOF?
    Enviado: 22/Septiembre/2024 a las 15:06

Hola. Me he liado y ahora mismo no soy capaz de continuar. Leyendo este hilo 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,

Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Enlace directo a este mensaje Enviado: 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


Un saludo


Xavi, un minyó de Terrassa

Mi web
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 139
Enlace directo a este mensaje Enviado: 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,
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 139
Enlace directo a este mensaje Enviado: 21/Abril/2025 a las 20:27

Hola, pueden cerrar el hilo plis, gracias.
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 139
Enlace directo a este mensaje Enviado: 12/Agosto/2025 a las 10:59
Hola, este hilo está pendiente de cerrar, gracias,
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable