Cómo hacer botón que valide registros?

Necesito agregarle a mi botón Guardar, que valide, antes de guardar los datos me alerte si el registro que intento insertar ya existe en la tabla, pero la validación llevaría varias condiciones, no se puede insertar si el número identificación y la Prótesis ya existen en la tabla. Si el estado del registro que existe en la tabla esta cancelado si me permita la inserción.

Agradezco la ayuda que me puedan dar!

El siguiente es el código que tengo hasta el momento:

Private Sub btn_Guardar_Click()
   Dim db As Database
   Dim rs As Recordset
    Dim msg As String, estilo, title As String
    estilo = vbCritical + vbOKOnly
    title = "Error en la inserción por falta de datos"
    msg = "No se han podido crear los registros solicitados por no existir ninguna entrada en el campo "
    If IsNull(Me.txt_num_identificacion) Then
        msg = msg & "Identificación."
        MsgBox msg, estilo, title
        Me.txt_num_identificacion.SetFocus
        Exit Sub
    End If
        If IsNull(Me.txt_Protesis) Then
        msg = msg & "Protesis."
        MsgBox msg, estilo, title
        Me.txt_Protesis.SetFocus
        Exit Sub 
Set db = CurrentDb
Set rs = db.OpenRecordset("tblBaseDatos")
rs.AddNew
rs!Identificacion = "" & txt_num_identificacion
rs!Protesis = "" & txt_Protesis
rs!Observaciones = "" & txt_Observaciones
rs.Update
rs.Close
Set rs = Nothing
db.Close
 MsgBox "Los datos se ingresaron satisfactoriamente", vbInformation, "Datos"
 Forms!frmRegistro.Refresh
txt_NUM_IDENTIFICACION.SetFocus
txt_NUM_IDENTIFICACION = Null
txt_Protesis = Null
txt_Observaciones = Null
End Sub
1

1 respuesta

Respuesta
1

Puedes usar la función DCount() para saber si hay algún registro que cumpla tus condiciones. Si lo hay, devolverá el número de coincidencias, y si no, devolverá 0.

La idea sería así (si interpreto bien tus reglas y tanto prótesis como identificación son datos numéricos):

If Dcount("Identificacion","tblBaseDatos","Identificacion=" & Me.txt_Num_Identificacion & " AND Protesis=" & Me.txt_Protesis & " AND Estado<>'Cancelado'")>0 Then

MsgBox "Ya existe un registro activo con esos datos"

End If

Un saludo!


Hola 

Los campos Identificacion y Protesis están definidos como texto, creo que por eso me da el siguiente error, pero no se como resolverlo, leí algo que era por las comillas:

Entonces has de encerrarlos entre comillas simples:

If Dcount("Identificacion","tblBaseDatos","Identificacion='" & Me.txt_Num_Identificacion & "' AND Protesis='" & Me.txt_Protesis & "' AND Estado<>'Cancelado'")>0 Then

Hola 

Perfecto con lo de las comillas simples, pero me sigue permitiendo insertar duplicados.   Coloque tu código después de la ultima validación de campos vacíos pero me sigue permitiendo registrar duplicados

Private Sub btn_Guardar_Click()

   Dim db As Database

   Dim rs As Recordset

    Dim msg As String, estilo, title As String

    estilo = vbCritical + vbOKOnly

    title = "Error en la inserción por falta de datos"

    msg = "No se han podido crear los registros solicitados por no existir ninguna entrada en el campo "

    If IsNull(Me.txt_num_identificacion) Then

        msg = msg & "Identificación."

        MsgBox msg, estilo, title

        Me.txt_num_identificacion.SetFocus

        Exit Sub

    End If

        If IsNull(Me.txt_Protesis) Then

        msg = msg & "Protesis."

        MsgBox msg, estilo, title

        Me.txt_Protesis.SetFocus

        Exit Sub 

If DCount("Identificacion", "tblBaseDatos", "Identificacion='" & Me.txt_NUM_IDENTIFICACION & "' AND Protesis='" & Me.txt_Protesis & "' AND Estado_Receta<>'Cancelada'") > 0 Then

  

     MsgBox "Ya existe un registro activo con esos datos"

    End If

Set db = CurrentDb

Set rs = db.OpenRecordset("tblBaseDatos")

rs.AddNew

rs!Identificacion = "" & txt_num_identificacion

rs!Protesis = "" & txt_Protesis

rs!Observaciones = "" & txt_Observaciones

rs.Update

rs.Close

Set rs = Nothing

db.Close

 MsgBox "Los datos se ingresaron satisfactoriamente", vbInformation, "Datos"

 Forms!frmRegistro.Refresh

txt_NUM_IDENTIFICACION.SetFocus

txt_NUM_IDENTIFICACION = Null

txt_Protesis = Null

txt_Observaciones = Null

End Sub

Ponle un "Exit Sub" entre el mensaje y el End If

Gracias amigo, pero lo intente así como me lo indicas pero no funciona! Continua haciendo la inserción!! 

Si lo hiciste exactamente como te dije, no te tiene que guardar porque no se llega a esa parte del código (a no ser que el formulario dependa directamente de la tabla, en cuyo caso el guardado es automático y todo ese código no sirve para nada)

La parte de esa validación tiene que quedarte así:

If DCount("Identificacion", "tblBaseDatos", "Identificacion='" & Me.txt_NUM_IDENTIFICACION & "' AND Protesis='" & Me.txt_Protesis & "' AND Estado_Receta<>'Cancelada'") > 0 Then
MsgBox "Ya existe un registro activo con esos datos"
Exit Sub
End If

Además, ahora que me fijo, te falta un End If para cerrar la validación anterior (la de que protesis no sea nulo)

Private Sub btn_Guardar_Click()
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("tblBaseDatos")
    Dim msg As String, estilo, title As String
    estilo = vbCritical + vbOKOnly
    title = "Error en la inserción por falta de datos"
    msg = "No se han podido crear los registros solicitados por no existir ninguna entrada en el campo "
    If IsNull(Me.txt_NUM_IDENTIFICACION) Then
        msg = msg & "Identificación."
        MsgBox msg, estilo, title
        Me.txt_NUM_IDENTIFICACION.SetFocus
        Exit Sub
    End If
    If IsNull(Me.txt_NOMBRE_COMPLETO) Then
        msg = msg & "No has buscado al Paciente."
        MsgBox msg, estilo, title
        Exit Sub
    End If
    If IsNull(Me.txt_Edad) Then
        msg = msg & "Flata la edad."
        MsgBox msg, estilo, title
        Me.txt_Edad.SetFocus
        Exit Sub
    End If
    If IsNull(Me.txt_Telefono) Then
        msg = msg & "Teléfono."
        MsgBox msg, estilo, title
        Me.txt_Telefono.SetFocus
        Exit Sub
    End If
    If IsNull(Me.txt_Urgencia_Telefono) Then
        msg = msg & "Teléfono 2."
        MsgBox msg, estilo, title
        Me.txt_Urgencia_Telefono.SetFocus
        Exit Sub
    End If
        If IsNull(Me.txt_Medico) Then
        msg = msg & "Medico."
        MsgBox msg, estilo, title
        Me.txt_Medico.SetFocus
        Exit Sub
    End If
        If IsNull(Me.txt_Cantidad) Then
        msg = msg & "Cantidad."
        MsgBox msg, estilo, title
        Me.txt_Cantidad.SetFocus
        Exit Sub
    End If
        If IsNull(Me.txt_Protesis) Then
        msg = msg & "Protesis."
        MsgBox msg, estilo, title
        Me.txt_Protesis.SetFocus
        Exit Sub
    End If
        If IsNull(Me.txt_Monto) Then
        msg = msg & "Monto."
        MsgBox msg, estilo, title
        Me.txt_Monto.SetFocus
        Exit Sub
    End If
    If DCount("Identificacion", "tblBaseDatos", "Identificacion='" & Me.txt_NUM_IDENTIFICACION & "' AND Protesis='" & Me.txt_Protesis & "' AND Estado_Receta<>'Cancelada'") > 0 Then
     MsgBox "Ya existe un registro activo con esos datos"
     Exit Sub
    End If
rs.AddNew
rs!Usurio = fOSUserName() & " "
rs!IDENTIFICACION = "" & txt_NUM_IDENTIFICACION
rs!NOMBRE = "" & txt_Nombre
rs!APELLIDO1 = "" & txt_Ape1
rs!APELLIDO2 = "" & txt_Ape2
rs!Edad = "" & txt_Edad
rs!Telefonos = "" & txt_Telefono
rs!Telefonos2 = "" & txt_Urgencia_Telefono
rs!Dsc_Medico = "" & txt_Medico
rs!Cantidad = "" & txt_Cantidad
rs!Protesis = "" & txt_Protesis
rs!Monto = "" & txt_Monto
rs!Observaciones = "" & txt_Observaciones
rs.Update
rs.Close
Set rs = Nothing
db.Close
 MsgBox "Los datos se ingresaron satisfactoriamente", vbInformation, "Datos"
Forms!frmRegistro.Refresh
txt_NUM_IDENTIFICACION.SetFocus
txt_NUM_IDENTIFICACION = Null
txt_NOMBRE_COMPLETO = Null
txt_Edad = Null
txt_Telefono = Null
txt_Urgencia_Telefono = Null
txt_Medico = Null
txt_Cantidad = Null
txt_Protesis = Null
txt_Monto = Null
txt_Observaciones = Null
End Sub

Gracias por tu tiempo

Realice tus recomendaciones, le quite la dependencia a la tabla y los  exit sub que hacia falta, pero no funciona. el código quedo según el que te adjunte.

hice un access nuevo y me sigue permitiendo la inserción 

Ahora bien si le quito el origen del registro (tblBaseDatos) me va a perjudicar la funcionalidad del formulario, porque tengo un cuadro de lista que al momento de dar doble click sobre un registro este me lo carga en una nueva pestaña por si deseo actualizar algún dato.

El código, aparentemente es correcto.

Si no te funciona la validación (entiendo que nunca te salta el mensaje de "ya existe un registro con esos datos") es porque hay algún error con la función DCount().

Como no sé cómo es tu BD, ni si lo que supuse para escribir el código es lo correcto, solo te puedo explicar cómo funciona para que intentes arreglarla tu mismo:

DCount() tiene tres parámetros:

1º/ Nombre del campo a contar, en tu caso "Identificacion"

2º/ Nombre de la tabla/consulta donde se encuentra el campo anterior, en tu caso "tblBaseDatos"

3º/ (opcional, pero necesario en tu caso) serían los criterios que tienen que cumplir los registros para que te los cuente, en tu caso: que el número identificación y la Prótesis ya existan en la tabla y que el estado sea distinto de cancelado.

La función devuelve el número de ocurrencias o 0 si no encuentra ninguna, con lo que si la función devuelve un número mayor que 0, muestra el mensaje y sale del procedimiento, y por tanto no se ejecuta la parte del guardado por medio del recordset.

Teniendo claros los criterios solo queda darles la sintaxis adecuada:

1.-/ si en la tabla el campo está definido como texto, el valor que le pases debe ir entre comillas simples.

2.-/ si el campo es numérico o autonumérico, se le pasa directamente (sin comillas simples)

3.-/ Si el campo es de tipo Fecha/Hora, se pasa entre almohadillas (#)

Además, has de tener en cuenta si Cancelado es un cuadro combinado que depende de otra tabla, pues en ese caso, es probable que el valor que devuelva no sea "Cancelado" (de tipo texto, sino un número (el correspondiente al identificador de la tabla en la que tengas los distintos estados".

Para tratar de depurar la sintaxis de la función, pon un botón en un formulario y vete mostrando los resultados por medio de un msgbox, por ejemplo:

Private Sub btnPrueba_Click()

Msgbox DCount("Identificacion","tblBaseDatos","Identificacion='" & Me.txtIdentificacion & "'")

End If

Este mensaje te mostrará cuantos registros tienes en tu tabla cuyo Identificacion sea igual al de tu cuadro de texto txtIdentificacion. A partir de ahí es cuestión de ir probando hasta dar con la sintaxis adecuada a la función y traspasarla al otro procedimiento.

¡Gracias! El error estaba en que el campo "Estado" no contenía ningún valor.

Gracias a tus recomendaciones en este momento me funciona perfecto 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas