Salir o cancelar sin que se guarde el registro en Access

En mi BD cuando se carga un NUEVO registro hay datos que son obligatorios y que bloquean la continuación hasta que sean completados. Pero hay usuarios que, o porque se equivocaron o porque no conocen los datos a completar y al ver que se quedan bloqueados en esa etapa cierran la base o apagan el Pc para "desbloquearse". Esto genera un registro con faltante de datos que si uno pasa por encima de ellos se vuelve a generar el bloqueo.

La idea sería que en los cuadros de diálogo (msg box) que se abren hubiera además del botón aceptar otro que dijera anular registro, volviendo al formulario para poder continuar usando la BD normalmente y evitando esos registros incompletos.

La función que se está usando es esta:

Public Function ControlesNulosEnForm(Frm As Form, Cancel As Integer) As Boolean
On Error GoTo ControlesNulosEnForm_TratamientoErrores
For Each Ctrl In Frm.Controls
If TypeOf Ctrl Is TextBox Or TypeOf Ctrl Is ComboBox Then
If Left(Ctrl.Name, 4) = "TBox" Or Left(Ctrl.Name, 4) = "CBox" Then
If Not IsNull(Ctrl.Value) Then
Ctrl.BackColor = RGB(225, 250, 225)
ControlesNulosEnForm = False
Else
ControlesNulosEnForm = True
Ctrl.BackColor = RGB(255, 255, 0)
Ctrl.SetFocus
Ctrl.Locked = False
MsgBox "Campo Vacío, Debe " & vbCrLf & "Rellenar Campo: " & Ctrl.Name, vbExclamation, "NO CONTINÚE"
Cancel = True
End
Exit Function
End If
End If
End If
Next Ctrl
ControlesNulosEnForm_Salir:
On Error GoTo 0
Exit Function
ControlesNulosEnForm_TratamientoErrores:
MsgBox "Error " & Err & " en Function.: ControlesNulosEnForm de Documento VBA: MdlControles (" & Err.Description & ")", vbCritical + vbOKOnly, "ATENCION"
Resume ControlesNulosEnForm_Salir
End Function

2 respuestas

Respuesta
2

Cambia el Cancel=True de la función por esta otra:

Frm. Undo

A ver si así te resulta.

Un saludo.


Hola, gracias por la rápida respuesta. 

No funcionó, no hace cambio alguno. Siguen apareciendo los msgbox y se queda bloqueado hasta completar.

A mi lo que me interesaría es que los msgBox que se abren tengan además del botón aceptar otro que diga Cancelar o Anular, y con ese salga de la carga de ese nuevo registro

Partiendo de que la función no me gusta cómo está construida, mira ar si así te sirve:

Public Function ControlesNulosEnForm(Frm As Form, Cancel As Integer) As Boolean
On Error GoTo ControlesNulosEnForm_TratamientoErrores
For Each Ctrl In Frm.Controls
    If TypeOf Ctrl Is TextBox Or TypeOf Ctrl Is ComboBox Then
        If Left(Ctrl.Name, 4) = "TBox" Or Left(Ctrl.Name, 4) = "CBox" Then
            If Not IsNull(Ctrl.Value) Then
                Ctrl.BackColor = RGB(225, 250, 225)
                ControlesNulosEnForm = False
            Else
                ControlesNulosEnForm = True
                Ctrl.BackColor = RGB(255, 255, 0)
                Ctrl.SetFocus
                Ctrl.Locked = False
                If MsgBox("Campo Vacío, Debe " & vbCrLf & "Rellenar Campo: " & Ctrl.Name, vbExclamation + vbOKCancel, "NO CONTINÚE") = vbCancel Then
                    Frm.Undo
                    Exit Function
                End If
            End If
        End If
    End If
Next Ctrl
ControlesNulosEnForm_Salir:
On Error GoTo 0
Exit Function
ControlesNulosEnForm_TratamientoErrores:
MsgBox "Error " & Err & " en Function.: ControlesNulosEnForm de Documento VBA: MdlControles (" & Err.Description & ")", vbCritical + vbOKOnly, "ATENCION"
Resume ControlesNulosEnForm_Salir
End Function

De esta manera con el botón aceptar me va saltando de campo y con el Cancelar queda el foco en el campo faltante. 

Por las dudas te aclaro que son siete campos obligatorios (los que se ven en la imagen).

Como funciona el botón Cancelar está bien ya que sería por si el operario se olvidó de cargar ese dato entonces lo devuelve a ese foco.

Con el botón aceptar (que debería llamarse Anular) debería salir de la carga de un nuevo registro, volviendo a la pantalla de vista del formulario por donde uno busca o ve registros ya cargados, sin quedar nada a medio cargar.

Los MsgBox los puedes "personalizar" hasta un límite, y ese límite es el que te deja Microsoft. Esto quiere decir que los botones tienen los nombres que programó Microsoft (Sí, No, Aceptar, Cancelar, Reintentar y alguno más que puedes consultar en la ayuda del propio Msgbox). Si quieres botones con los nombres que tu quieras, tendrás que construir tu un formulario que haga las veces de msgbox (en la web de Neckkito tienes dos ejemplos de cómo hacerlo, los que me remito).

Si quieres que al pulsar Aceptar haga algo, se lo has de programar en el código, añade un else al IF Msgbox.... que haga lo que quieres:

                If MsgBox("Campo Vacío, Debe " & vbCrLf & "Rellenar Campo: " & Ctrl.Name, vbExclamation + vbOKCancel, "NO CONTINÚE") = vbCancel Then
                    Frm.Undo
                    Exit Function
                Else
                    Fmr. Undo
                    ...'Aquí no sé lo que quieres hacer. Si es abrir un form:
                    DoCmd. OpenForm "NombreFormulario"
                    DoCmd. Close acForm, Me. Name ' para cerrar este formulario
                End If
Respuesta

Simplemente agrega un botón deshacer esto me elimina el registro en el cual estoy trabajando

Es sencillo de hacer con el generador de botones

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas