Cerrar formulario al guardar datos

Me podrían ayudar con este código por favor. El código funciona super bien cuando presiono el "SI" para guardar y al presionar el "NO" para corregir algún campo, pero me gustaría que al presionar "SI" aparte de guardar los datos me cierre el formulario y al momento de presione "NO" no me cierre el formulario y me deje corregir cualquier campo que estime conveniente.

Private Sub Form_BeforeUpdate(Cancel As Integer)
If fncControlaVacios(Me.Name) = False Then
MsgBox "LOS CAMPOS RESALTADOS SON OBLIGATORIOS Y DEBES INTRODUCIR UN " _
& "VALOR PARA CONTINUAR.", vbExclamation + vbOKOnly, "ATENCION: HAY CAMPOS OBLIGATORIOS"
Cancel = True
Else
If MsgBox("QUIERES GUARDAR LOS DATOS INGRESADOS", vbQuestion + vbYesNo, "ATENCION") = vbYes Then
Else
Cancel = True
End If
End If
End Sub

He probado con DoCmd. Close en diferentes partes del código, pero no hace lo que necesito. ¿Me faltara agregar algo más?.

2 respuestas

Respuesta
2

Es que en el segundo If no le estás diciendo nada. Si pulsas Sí entonces Else. Tienes que decirle lo que tiene que hacer en caso de que digas Si. Por ejemplo, si tengo el formulario Clientes(donde he copiado tu código)

Ala decir sí, como no te puedo mostrar una imagen del formulario cerrado, efectivamente lo cierra y en la tabla Clientes

Al no saber como tienes construido el formulario, al mío le he puesto

Private Sub Form_BeforeUpdate(Cancel As Integer)
If MsgBox("QUIERES GUARDAR LOS DATOS INGRESADOS", vbQuestion + vbYesNo, "ATENCION") = vbYes Then
DoCmd.RunSQL "insert into clientes(nombrecliente,ciudad,pais)values(nombrecliente,ciudad,pais)"
DoCmd.Close
Else
Cancel = True
End If
End Sub

Estoy probando lo que me indicas, pero como solo quiero que al presionar el botón "SI" me guarde y cierre el formulario coloque solo el DoCmd.Close donde me indicas pero no lo coloque el DoCmd.RunSQL

Private Sub Form_BeforeUpdate(Cancel As Integer)
If fncControlaVacios(Me.Name) = False Then
MsgBox "LOS CAMPOS RESALTADOS SON OBLIGATORIOS Y DEBES INTRODUCIR UN " _
& "VALOR PARA CONTINUAR.", vbExclamation + vbOKOnly, "ATENCION: HAY CAMPOS OBLIGATORIOS"
Cancel = True
Else
If MsgBox("QUIERES GUARDAR LOS DATOS INGRESADOS", vbQuestion + vbYesNo, "Atencion") = vbYes Then
DoCmd.Close
Else
Cancel = True
End If
End If
End Sub

Y al presionar el botón "SI" me cierra el formulario pero no me guarda los registros ingresados. ¿Qué más tendría que colocarle para que me guarde los registros?

Ten en cuenta que la instrucción se la has dado en el evento Antes de actualizar, por eso no te guarda nada( a menos que le pongas lo de Docmd.insert( es decir, lo "obligas"). Te pongo un ejemplo absurdo pero que sirve. Si te digo "Antes de pintar el coche de rojo cierra el taller". El coche se quedará del color que tenía, porque el taller de pintura se cerró. Pero si te digo, "Antes de cerrar el taller pinta el coche de rojo", el coche tendrá el nuevo color. Eso es lo que hace la línea de Insert.

Respuesta
1

Otra solución:

En el encabezado del módulo del formulario pones:

Dim cerrar As Boolean

En tu código del evento "antes de actualizar" del formulario añades la línea que señalo:

Private Sub Form_BeforeUpdate(Cancel As Integer)
If fncControlaVacios(Me.Name) = False Then
    MsgBox "LOS CAMPOS RESALTADOS SON OBLIGATORIOS Y DEBES INTRODUCIR UN " _
    & "VALOR PARA CONTINUAR.", vbExclamation + vbOKOnly, "ATENCION: HAY CAMPOS OBLIGATORIOS"
    Cancel = True
Else
    If MsgBox("QUIERES GUARDAR LOS DATOS INGRESADOS", vbQuestion + vbYesNo, "ATENCION") = vbYes Then
        cerrar = True  '<-----------Añades esta linea ------------>
    Else
        Cancel = True
    End If
End If
End Sub

Y en el evento "Después de actualizar" del formulario:

Private Sub Form_AfterUpdate()
    If cerrar Then
        cerrar = False
        DoCmd.Close acForm, Me.Name
    End If
End Sub

Agregue lo que me indicas, pero parece que hice algo mal, ya que al presionar el botón "SI" me guarda los datos pero no me cierra el formulario. Así coloque lo que me indicas.

Public Function fncControlaVacios(miForm As String) As Boolean

Dim cerrar As Boolean

Dim ctl As Control

fncControlaVacios = True 

For Each ctl In Forms(miForm).Controls

    If ctl.Name Like "*Ob" Then

        If IsNull(ctl) Or ctl.Value = "" Then 

            ctl.BackColor = RGB(256, 189, 193)

            fncControlaVacios = False  

        Else

            ctl.BackColor = vbWhite

        End If

    End If

 Next ctl

If fncControlaVacios = False Then

    For Each ctl In Forms(miForm).Controls

        If ctl.Name Like "*Ob" And ctl.BackColor = RGB(256, 189, 193) Then

           ctl.SetFocus

           Exit For

        End If

          Next ctl

  End If

End Function

Public Sub subRestauraCajasVacias(miForm As String)

On Error Resume Next

Dim ctl As Control

For Each ctl In Forms(miForm).Controls

    If Not ctl.ControlType = acCommandButton Then ctl.BackColor = vbWhite

Next ctl

End Sub

y en la otra parte lo deje así.

Private Sub Form_BeforeUpdate(Cancel As Integer)

If fncControlaVacios(Me.Name) = False Then

MsgBox "LOS CAMPOS RESALTADOS SON OBLIGATORIOS Y DEBES INTRODUCIR UN " _

& "VALOR PARA CONTINUAR.", vbExclamation + vbOKOnly, "ATENCIÓN: HAY CAMPOS OBLIGATORIOS"

Cancel = True

Else

If MsgBox("QUIERES GUARDAR LOS DATOS INGRESADOS", vbQuestion + vbYesNo, "ATENCION") = vbYes Then

  cerrar = True

Else

  Cancel = True

End If

End If

End Sub

Private Sub Form_AfterUpdate()

    If cerrar Then

        cerrar = False

        DoCmd.Close acForm, Me.Name

    End If

End Sub

En el encabezado del módulo del formulario pones:

Dim cerrar As Boolean

El dim Cerrar As Boolean va fuera de la función, en el encabezado del módulo, debajo de la linea:

Option Compare Database

Y funciona perfectamente: http://www.filebig.net/files/KxVThtKRCZ 

También te valdría ponerlo en un módulo independiente como:

Public Cerrar As Boolean

Y en este caso con ponerlo una vez te serviría para todos los formularios de tu BD

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas