Cancel y Undo en un textbox de un subformulario

Tengo una duda sobre la cancelación de eventos usado en código de evento BeforeUpdate y el método Undo de un textbox situado en un subformulario.
No sé cual instrucción debe ponerse primero y cual después ¿Cancelo el evento primero con Cancel = True y luego txtKilos.Undo o al revés?
Te pongo el código simplificado a ver si puedes ayudarme.
Private Sub txtKilos_BeforeUpdate(Cancel As Integer)
Set miConexion = CurrentProject.Connection
...
Select Case Kilos_restantes
Case Is > 0
...
Case Is = 0
...
Case Is < 0
...
Cancel = True
txtKilos.Undo
Set miConexion = Nothing
Exit Sub
End Select
miConexion.Execute strSQL
...
Set miConexion = Nothing
End Sub
En el Select Case cuando el valor de Kilos_restantes < 0 necesito cancelar el evento y deshacer la entrada en el txtKilos.
Tal como lo tengo al salir me da el error:
"El valor infringe la regla de validación para el campo o registro.
Por
Ejemplo, es posible que haya cambiado una regla de validación sin
Comprobar si los datos existentes coinciden con la nueva regla de validación.
Haga clic en Deshacer para restaurar el valor anterior o escriba un valor nuevo que cumpla la regla de validación para el campo o registro."
En otros intentos me salido el error "No se encontró la propiedad"
¿Cómo
podría poner el código para que al entrar un dato que no convenga, se
mande a cancelar la actualización del campo y se deshaga lo tecleado en
el textBox?

1 respuesta

Respuesta
1

En el mensaje de error te da una pista de la causa: tienes los campos de la tabla con reglas de validación, y al cancelar los valores de los campos (basta que sea uno de ellos) no cumple las reglas de validación.

Lo mejor es que elimines esas reglas y pongas validaciones en el evento "BeforeUpdate" de cada campo, así puedes cancelar la actualización y presentar un mensaje al usuario, modificar valores o lo que sea.

Muchas gracias, por tu respuesta, perdona por no haberte respondido antes y finalizar la pregunta. Pero quería pedirte una vez más consejo, pues en mi caso no tengo ninguna regla de validación. lo único era que el campo era requerido. Le he quitado el Requerido: Sí, pero ahora para el código que tengo:

Select Case Kilos_restantes
Case Is > 0
...
Case Is = 0
...
Case Is < 0
If MsgBox("Estás entrando " & Kilos_vendidos & " kilos y sólo quedan " & Kilos_en_existencia & "." & Chr$(13) & "¿Deseas proceder?", vbYesNo + vbQuestion, "Aviso para entrada de kilos") = vbYes Then
...
Else
Call txtKilos.Undo
Cancel = True
Set miConexion = Nothing
Exit Sub ' Salimos sin ejecutar ninguna consulta
End If
End Select

Cuando pulso el botón "No", me cancela evento y control, pero me sale el mensaje de Access: "No se pudo encontrar la propiedad". Sabes porqué pasa esto.

Muchas gracias.

Puede ser por el cierre de la conexión.

De todas formas, creo que en vez de tener que ir cancelando actualizaciones, es mejor que prepares las consultas de actualización y que las ejecutes si se cumple la condición, de esa forma no necesitas " deshacer " nada.

Un ejemplo sería el siguiente:

Select Case Kilos_restantes
    Case Is > 0
        ...
    Case Is = 0
        ...
    Case Is < 0
        If MsgBox("Estás entrando " & Kilos_vendidos & " kilos y sólo quedan " & Kilos_en_existencia & "." & Chr$(13) & "¿Deseas proceder?", vbYesNo + vbQuestion, "Aviso para entrada de kilos") = vbYes Then
            MiSQL = "Update Tabla Set Kilos =  ... Where ..."
            Currentdb.execute MiSQL
            ...
            ...
        Else
            Exit Sub ' Salimos sin ejecutar ninguna consulta
        End If
End Select

Muchas gracias, no había pensado en hacerlo así, a pesar de que lo tenía planteado parecido pero esta forma es mucho más segura y operativa.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas