|
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,
|