|
Responder
|
| Autor | |
paloma
Habitual
Unido: 24/Junio/2010 Estado: Sin conexión Puntos: 139 |
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, |
|
![]() |
|
xavi
Ver perfil usuario
Enviar mensaje privado
Ver los mensajes del usuario
Visite la página de los usuarios
Añadir a la lista de amigos
Administrador
Terrassa-BCN Unido: 10/Mayo/2005 Localización: Catalunya |||| Estado: Sin conexión Puntos: 14926 |
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 Lectura recomendada: Instrucción On Error - Visual Basic | Microsoft Learn Un saludo |
|
![]() |
|
paloma
Habitual
Unido: 24/Junio/2010 Estado: Sin conexión Puntos: 139 |
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,
|
|
![]() |
|
paloma
Habitual
Unido: 24/Junio/2010 Estado: Sin conexión Puntos: 139 |
Enviado: 21/Abril/2025 a las 20:27 |
|
Hola, pueden cerrar el hilo plis, gracias.
|
|
![]() |
|
paloma
Habitual
Unido: 24/Junio/2010 Estado: Sin conexión Puntos: 139 |
Enviado: 12/Agosto/2025 a las 10:59 |
|
Hola, este hilo está pendiente de cerrar, gracias,
|
|
![]() |
|
Responder
|
|
|
Tweet
|
| Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |