Al cerrar formulario access revisar si ciertos campos están cubiertos

Tengo un formulario donde ingreso los registros y cuando acabo hago click en el botón salir y como access guarda los registro por defecto solo le puse con codigo que cierre el formulario. Pero necesito que me compruebe que el campo Fecha y Acción estén cubiertos si es así perfecto pero sino me avise y me de a elegir entre cubrirlos o cerrar el formulario sin guardar nada, es decir ese registro no exista.


        

1 respuesta

Respuesta
1

Kike: Antes de dar la orden de cierre >>

If IsNull(Me.Fecha) Or IsNul(Me.Acción) Then

MsgBox "Te faltan datos fundamentales por rellenar",vbCritical,"DATOS SIN LLENAR"

Me.Fecha, Set Focus

DoCmd. CancelEvent

Exit Sub

End If

Mis saludos >> Jacinto

Muchas gracias por contestar Jacinto, y puse este código que es muy parecido:

    On Error GoTo Err_Cerrar_Click
If IsNull(Me.Accion) Or IsNull(Me.Fecha) Then
MsgBox " Faltan datos", vbInformation, "AVISO"
    DoCmd.RunCommand acCmdUndo
    Me.Fecha.SetFocus
End If
Exit_Cerrar_Click:
Exit Sub
Err_Cerrar_Click:
MsgBox Err.Description
Resume Exit_Cerrar_Click

pero lo que yo quiero hacer que quizás me expliqué mal  es que el msgbox vbCritical  o vbInformacion fuese un vbQuestion +vbyesno.

Que me diga que están vacíos y son necesarios y dejar a mi elección si decido cubrirlos o por el contrario decirle que no y que no me guarde nada del registro.

A veces pasa que empiezas con un registro y lo dejas a medias pero access te lo guarda y es lo que quiero evitar pero que sea una acción consciente.

Un saludo

Kike: Después del Sondeo de los Nulos>>

Dim Mensaje,Estilo,Titulo.Respuesta

Mensaje = "Como mínimo hay un Campo Nulo:" & vbCrLf & vbCrLf & "Quieres Llenarlo antes de salir ??"
Estilo = vbYesNo + vbCritical + vbDefaultButton2 'Define los botones.
Titulo = "MENSAJE INFORMATIVO" 'Define el Titulo
Respuesta = MsgBox(Mensaje, Estilo, Titulo) 'Muestra el Mensaje.

If Respuesta = vbYes Then 'Cuando Eliges SI.

Me.Fecha, Set Focus

DoCmd. CancelEvent

Exit Sub

Else
'Si eliges NO
MsgBox "El o los campos quedarán sin llenar", vbInformation, "CAMPOS INCOMPLETOS"
End If

No creo que mde olvide nada, porque a ésas horase las letras y números comienzan a juntarse. Mis saludos >> Jacinto

Hola de nuevo Jacinto, he puesto el código y funciona pero estén cubiertos los campos o no se ejecuta siempre, así que he añadido algunas cosas como la línea if is null para valorar los campos pero no me funciona:

Dim Mensaje As String, Estilo As String, Titulo As String, Respuesta As Integer
If IsNull(Me.Accion) Or IsNull(Me.Fecha) Then
    Mensaje = "Como mínimo hay un Campo Nulo:" & vbCrLf & vbCrLf & "Quieres Llenarlo antes de salir ??"
    Estilo = vbYesNo + vbCritical + vbDefaultButton2 'Define los botones.
    Titulo = "MENSAJE INFORMATIVO" 'Define el Titulo
    Respuesta = MsgBox(Mensaje, Estilo, Titulo) 'Muestra el Mensaje.
        Else
    DoCmd.Close acForm, Me.Name
End If
If Respuesta = vbYes Then 'Cuando Eliges SI.
Me.Fecha.SetFocus
DoCmd.CancelEvent
Exit Sub
Else
'Si eliges NO
MsgBox "El registro no se guardara", vbInformation, "CAMPOS INCOMPLETOS"
DoCmd.RunCommand acCmdUndo
End If

La cosa sería si se cumple que están vacíos ejecute el mensaje, estilo, titulo y respuesta correcto pero dentro de este if debería de añadir el if por si la respuesta fuera positiva no? y por el contrario sino lo estuvieran guardar el registro.

¿Pero esta la opción de que digan que no y eso supondría tener dos else no? Esto es muy engroso por lo que veo.

Un saludo

Kike: Aún me queda alguna duda, pero según yo lo veo la situación es.
Pulso en Cerrar el Formulario y quiero que me avise si hay alguno de 2 controles Nulos para >>
1.- Que me obligue a llenarlos y mientras no estén llenos el Formulario no se cierre
2.- Que se cierre con los datos que tenga rellenados
3.- Que se cierre el Formulario sin guardar ningún dato . Abortar el proceso complet
Dime por favor si esto es así y apartir de ahí seguimos
Mis saludos
Jacinto

Hola Jacinto:

Lo que prentendo si puede ser es:

 pulso cerrar el formulario;

1) que valore si esos campos están cubiertos.

2) si están cubiertos se guarde el registro

3) Sino fuera así me diga que son obligatorios y si los deseo cubrir.

4) Que contesto que si pues pongo el foco en uno de ellos los cubro y como se cumple ya se guardaría el registro 

5) Que digo que no mensaje de que no se guardará nada registro y que se eliminara lo que haya..

espero haber podido aclararme con lo que quiero

Kike: Vamos a utilizar una Funcion y un Procedimiento.

No las he probado pero supongo que no debe de haber dificultades, aunque me queda la duda de si el procedimiento sería o no más adecuado que fuera el de BeforeUpdate en lugar que en un botón que cierre el Formulario.

Dim Mensaje As String, Estilo As String, Titulo As String, Respuesta As Integer
'Estas variables pueden estar fuera del procedimiento si se quiere
Private Sub BtnCierraForm_Click()
Dim StrMsg As String
If FaltanDatosObligatorios = False Then ‘Valoramos si faltan datos. Si no faltan salimos sin más
    DoCmd.Close acForm, Me.Name
    Exit Sub
Else ‘Si la Función ha devuelto True, Preguntamos si se quieren llenar los controles
    ‘Primera pregunta
     If MsgBox("Estamos en éste punto porque Falta llenar la Fecha o la Acción o ambos" & vbCrLf & vbCrLf & "Quieres llenarlos ahora?", vbYesNo) = vbYes Then
         Me.Fecha.SetFocus
         DoCmd.CancelEvent
         Exit Sub       
     Else ‘ Saltará aquí si hemos dicho que “NO queremos llenarlos ahora”, por lo que hemos de repreguntar
          ‘Segunda pregunta
           If MsgBox("Has elegido que no quieres llenar los datos Obligatorios que faltan" & vbCrLf & vbCrLf & "Quieres guardar los que hay?", vbYesNo) = vbYes Then
                 DoCmd.Close acForm, Me.Name
                 Exit Sub
           Else
                'Cuando el usuario elije No por segunda vez
                StrMsg = "Has elegido salir sin guardar. " & "Los datos de éste Formulario no se guardará"
                MsgBox StrMsg, vbExclamation, "NO SE HARAN CAMBIOS EN LA TABLA"
                DoCmd.RunCommand acCmdUndo
           End If
    End If
End If
End Sub  'BtnCierraForm_Click()
'Esta es la Función que estará en el módulo de código asociado al Formulario
Function FaltanDatosObligatorios() As Boolean
If IsNull(Me.Fecha) Or IsNull(Me.Acción) Or Me.Acción = "" Then
        FaltanDatosObligatorios = True
        Exit Function
End If
End Function

Ya me contarás. Saludos >> Jacinto

¡Gracias! Funciona correctamente, he cambiado alguna cosa como no dar la opción de guardar nada sin que estén cubiertos los campos Fecha y Acción:

Private Sub BtnCierraForm_Click()
 Dim Mensaje As String, Estilo As String, Titulo As String, Respuesta As Integer
Dim StrMsg As String
If FaltanDatosObligatorios = False Then 'Valoramos si faltan datos. Si no faltan salimos sin más
    DoCmd.Close acForm, Me.Name
    Exit Sub
Else 'Si la Función ha devuelto True, Preguntamos si se quieren llenar los controles
    'Primera pregunta
     If MsgBox("Los campos Fecha y Accion son obligatorios para guardar el Registro" & vbCrLf & vbCrLf & "¿Quieres llenarlos ahora?", vbYesNo) = vbYes Then
         Me.Fecha.SetFocus
         DoCmd.CancelEvent
         Exit Sub
     Else ' Saltará aquí si hemos dicho que “NO queremos llenarlos ahora”, por lo que hemos de repreguntar
          'Segunda pregunta
               If MsgBox("Todo el registro será eliminado", vbCritical & vbCrLf & vbCrLf & "¿Desea Continuar?", vbYesNo) = vbYes Then
                  StrMsg = "Has elegido salir sin guardar. " & "Los datos de éste Formulario no se guardará"
                  MsgBox StrMsg, vbExclamation, "NO SE HARAN CAMBIOS EN LA TABLA"
                  DoCmd.RunCommand acCmdUndo
                 Exit Sub
           Else
                Me.Fecha.SetFocus
                DoCmd.CancelEvent
           End If
    End If
End If
End Sub  'BtnCierraForm_Click()

He intentado poner los msgbox en lugar de vbCritical como vbQuestion en los que pregunta pero no lo he conseguido. Pero era solo porque me gusta mas la estética.

Muchas gracias como siempre

Kike: Tal como te comentaba no lo había probado y me alegra que partiendo de la idea hayas podio conseguir lo que pretendías, a excepción de ese detalle del Vb...

Si haciendo alguna prueba más no lo consigues me comentas y le echo una mirada.

Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas