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
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
- Compartir respuesta