Validar registros antes de guardar para nuevo registro

Me podrían ayudar creo que es algo sencillo pero no eh podido hacerlo andar en Access. Tengo el FORM1 con un botón "Guardar", coloque un comando que me valide ciertos registros, me envié mensaje avisando que falta algo, completarlo y guardar. Dentro del mimo comando me copie un registro del Campo1 al FORM2 que le pido me habra y cierre el Form1. Este es:

Private Sub Comando64_Click()
    If IsNull(Me.Nombre) Or IsNull(Me.Paterno) Or IsNull(Me.Materno) Or IsNull(Me.Celular) Then
        MsgBox "FALTAN CAMPOS DE LLENAR" & vbLf & vbLf & "Verifique.", vbInformation, "Aviso"
    Else
        DoCmd.RunCommand acCmdSaveRecord
    End If
 DoCmd.OpenForm "Registro_Pacientes", acNormal
 Form_Registro_Pacientes.Rut = Me.Rut.Value
 DoCmd.Close acForm, "Registro_Clientes"
End Sub

Me resulta en parte, si dejo un campo en blanco me arroja el mensaje, le doy OK pero me guarda igual todos los registro y me habré el Form2 sin problema con el dato del Campo que le indique.

Como puedo hacer que no me permita guardar nada hasta completar los registro que necesito, y que el mensaje de advertencia sea mas personalizado, me indique que campo es el que falta completar y al darle OK el setFocus se posicione en el o se coloque de un color para destacarle. Eh tratado de adaptar otros comando parecidos para personalizar el msgBox sin resultado y con el If no eh podido dar para que me detenga el proceso sin que complete todos los registro.

Espero haber sido claro con mi problema y me puedan seguir orientando...

2 respuestas

Respuesta
1

Hay muchas formas de hacerlo, a mí particularmente me gusta usar la que explico en este ejemplo: http://neckkito.xyz/nck/index.php/ejemplos/13-formularios/83-campos-obligatorios, porque es muy "visual" para el usuario, ya que se "colorean" los campos que tiene en blanco y que debe rellenar.

En cuanto al código que tienes, comentarte dos cosas: parte de tu problema lo solucionas metiendo las 3 últimas lineas dentro del If, después del acCmdSaveRecord. Así no te abrirá el segundo formulario si tienes campos vacíos. Pero no te equivoques, el registro se te guardará igual con esos campos en blanco (incluso aunque no le pongas lo del acCmdSaveRecord), ya que el formulario depende directamente de la tabla. Esto lo puedes evitar también si en al tabla marcas los campos como requeridos (como explico al principio en el ejemplo).

Gracias Sveinbjorn El Rojo, revise lo que me indicaste y me sirve mucho para implementarlo, pero mi pregunta es la siguiente, según vi como es un modulo publico, puedo utilizarlo en cualquier otro formulario, solo debo indicarle los comandos al inicio del formulario y colocar la OB en los campos que requiero???

Correcto, el código del módulo te servirá para todos los formularios que quieras, siempre que identifiques con el Ob (o los caracteres que quieras y lo cambies en consecuencia en la función) los campos que quieres validar.

¡Gracias! Sveinbjorn El Rojo, ya lo probé y funciona sin problemas... adicional a esto estuve practicando un poco y logre hacer lo que quería, en donde faltaba el dato me envía el mensaje, me coloca el Texbox en color y se posiciona el cursor. Pero me di cuenta que solo sirve si te falta un registro, ya que si son mas de uno, mi sistema pasa por cada uno con el mensaje y terminado esto me guarda los registros. Me hubiera gustado que realizara el mensaje global indicando los campos a llenar y los coloree, no soy muy experto en programación. Con tu sistema es global y demarca todo los campos faltantes y lo puedo usar para cualquier formulario, el mio es mas personalizado.

De igual lo dejo aquí por si a alguien le resulte interesante de ocupar o se ajuste a lo que necesite y si alguien puede automatizar mejor.

Private Sub Comando65_Click()
Dim resp, resp2, resp3, resp4 As Integer
Dim FP, FP2, FP3, FP4 As String
Dim FP4 As Variant
FP = "Nombre Cliente"
FP2 = "Apellido Paterno"
FP3 = "Apellido Materno"
FP4 = "N° Celular Cliente"
    If IsNull(Me.Nombre) Then
       resp = MsgBox("Falta Agregar" & "" & FP, vbOKOnly + vbCritical, "Registro Cliente")
            If resp = vbOK Then
                Nombre.BackColor = 65535
                Nombre.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    ElseIf IsNull(Me.Paterno) Then
        resp2 = MsgBox("Falta Agregar" & "" & FP2, vbOKOnly + vbCritical, "Registro Cliente")
            If resp2 = vbOK Then
                Paterno.BackColor = 65535
                Paterno.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    ElseIf IsNull(Me.Materno) Then
        resp3 = MsgBox("Falta Agregar" & "" & FP3, vbOKOnly + vbCritical, "Registro Cliente")
            If resp3 = vbOK Then
                Materno.BackColor = 65535
                Materno.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    ElseIf IsNull(Me.Celular) Then
        resp4 = MsgBox("Falta Agregar" & "" & FP4, vbOKOnly + vbCritical, "Registro Cliente")
            If resp4 = vbOK Then
                Celular.BackColor = 65535
                Celular.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    Else
        DoCmd.GoToRecord , , acNewRec
        Nombre.BackColor = 16777215
        Paterno.BackColor = 16777215
        Materno.BackColor = 16777215
        Celular.BackColor = 16777215
        MsgBox "Registro guardado con exito", vbInformation, "Registro Cliente"
    End If
End Sub

Muchas gracias....

¡Gracias! Sveinbjorn El Rojo, ya lo probé y efectivamente realiza lo que indica el sistema en cualquier formulario.

Pero mi inquietante forma de realizar cosas, estuve practicando y pude hacer lo que quería más personalizado, lo único malo es que no me resulta en forma global, solo va paso a paso si encuentra el texto vació y recién completados guarda los registros, me hubiera gustado poder hacerlo de forma global y el mensaje me indicara los nombre de los campos a completar. Tu sistema es más amigable y sirve para cualquier formulario.

De igual dejo el código aquí para quien le sirva si quiere hacer algo más personalizado y si puede dejarlo de forma más automatizado y que sirva para cualquier otro formulario seria genial.

Private Sub Comando65_Click()
Dim resp, resp2, resp3, resp4 As Integer
Dim FP, FP2, FP3, FP4 As String
FP = "Nombre Cliente"
FP2 = "Apellido Paterno"
FP3 = "Apellido Materno"
FP4 = "N° Celular Cliente"
    If IsNull(Me.Nombre) Then
       resp = MsgBox("Falta Agregar" & "" & FP, vbOKOnly + vbCritical, "Registro Cliente")
            If resp = vbOK Then
                Nombre.BackColor = 65535
                Nombre.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    ElseIf IsNull(Me.Paterno) Then
        resp2 = MsgBox("Falta Agregar" & "" & FP2, vbOKOnly + vbCritical, "Registro Cliente")
            If resp2 = vbOK Then
                Paterno.BackColor = 65535
                Paterno.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    ElseIf IsNull(Me.Materno) Then
        resp3 = MsgBox("Falta Agregar" & "" & FP3, vbOKOnly + vbCritical, "Registro Cliente")
            If resp3 = vbOK Then
                Materno.BackColor = 65535
                Materno.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    ElseIf IsNull(Me.Celular) Then
        resp4 = MsgBox("Falta Agregar" & "" & FP4, vbOKOnly + vbCritical, "Registro Cliente")
            If resp4 = vbOK Then
                Celular.BackColor = 65535
                Celular.SetFocus
            Else
            DoCmd.CancelEvent
            End If
    Else
        DoCmd.GoToRecord , , acNewRec
        Nombre.BackColor = 16777215
        Paterno.BackColor = 16777215
        Materno.BackColor = 16777215
        Celular.BackColor = 16777215
        MsgBox "Registro guardado con exito", vbInformation, "Registro Cliente"
    End If
End Sub

Muchas Gracias...

Respuesta
1

¿Has probado a poner justo debajo de msgbox....

Docmd. Cancelevent

Es decir, si no se cumple la condición... no sigue

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas