Problemas con regla de validación

Otra vez acudo a vuestra sapiencia para resolver un problema que tengo con la BD que estoy haciendo, gracias vuestros magníficos consejos. Veréis, en el campo "DNI/NIF" del formulario "CLIENTES", configurado en la tabla correspondiente como indexado sin duplicados, con el fin de no registrar a un cliente en dos fichas diferentes. La ragla es <>[DNI/NIF]. Funciona perfectamente y, por supuesto hace aparecer el correspondiente mensaje. El problema comienza cuando quiero rectificar el nº, pues aún cuando lo cambie no me deja seguir y me sigue saltando el mnesajito que he configurado. Tengo que cerrar la ficha, por supuesto sin grabarla, para poder rectificarla. Lo que me gustaría hacer es que si en el formulario nuevo escribo un DNI/NIF que ya existe se abra el formulario que ya existe con dicho num. ¿Es posible? Estoy seguro que vosotros sabéis como hacerlo.

2 respuestas

Respuesta
1

Si lo pones como indexado sin duplicados, no es necesario que establezcas una regla de validación para evitar duplicados, pues ya te avisa por la configuración del índice.

Mira este ejemplo de Neckkito:

 http://www.siliconproject.com.ar/neckkito/index.php/component/content/article/93-ejemplos-explicados/ejemplos-de-formularios/162-este-valor-ya-existe 

En el código del ejemplo, sólo has de añadir un Else para que si existe el DNI, te abra el formulario filtrado, con algo de este estilo:

DoCmd.OpenForm "NombreForm",,,"DNI='" & Me.DNI & "'"

Muchas gracias,Sveinbjorn. tengo que estudiarme todos eso que me dices muy despacio, porque como te imagina, mis conocimientos de VBA son bastante "escacitos" y ya soy bastante mayor (77 añitos. Espero que no se lo cuentas a nadie, je,je..),como para intentar aprender mucho más, aunque tengo que confesar que me gusta bastante. No obstante, si me lo pudieras dar un poco más "mascadito" te lo agradecería de todo corazón. Un abrazo. amigo

Ok, en primer lugar, borra la regla de validación de tu campo, tanto en la tabla como en el formulario (si la tienes en ambos, si no, sólo donde la tengas)

Segundo: en el evento "Después de actualizar" del campo DNI/NIF de tu formulario, le generas este código (en el enlace se explica cómo):

 Dim vDNI As Variant, vDNIB As Variant
 vDNI = Me.[DNI/NIF].Value
 If IsNull(vDNI) Then Exit Sub
 vDNIB = DLookup("[DNI/NIF]", "CLIENTES", "[DNI/NIF]='" & vDNI & "'")
 If vDNIB= vDNIThen
 MsgBox "El DNI introducido ya existe", vbInformation, "AVISO"
 Me.[DNI/NIF].Value = Null
 DoCmd.OpenForm "NombreFormulario",,,"[DNI/NIF]='" & vDNI & "'"
End If

Cambia NombreFormulario por el que quieres abrir y listo, si acerté con los nombres de tus cmpos y lo que creo que quieres hacer...

Gracias Sveinbjorn, te envío el código que he insertado. En primer lugar perdon por el error en el nombre del campo, en realidad es "PASAPDNI, que como ves ya he cambiado. Funciona perfectamente hasta dar el "AVISO El DNI introducido ya existe", pero al ACEPTAR aparece el mensaje "Se ha producido el error 3314 en tiempo de ejecución: escriba un valor en el campo 'CLIENTES.DNI/CIF'. Y al tocar en el botón depurar aparece el cod. con la línea en negrita resaltada en amarillo. Lo que pretendo, es que,además del aviso, se abra la "FICHACLIENTE" que pertenece a ese Dni o Nif. Perdona la "murga" que te estoy dando y espero, una vez más, tu inestimable ayuda, gracias a la cual voy a poder culminar este proyecto. Muchas gracias.

Private Sub PASAPDNI_AfterUpdate()
Dim vDNI As Variant, vDNIB As Variant
vDNI = Me.[PASAPDNI].Value
If IsNull(vDNI) Then Exit Sub
vDNIB = DLookup("[PASAPDNI]", "CLIENTES", "[PASAPDNI]='" & vDNI & "'")
If vDNIB = vDNI Then
MsgBox "El DNI introducido ya existe", vbInformation, "AVISO"
Me.[PASAPDNI].Value = Null
DoCmd.OpenForm "FICHACLIENTE", , , "[PASAPDNI]='" & vDNI & "'"
End If
End Sub

Imagino que el error viene dado porque tienes configurado ese campo para que no admita valores nulos.

Prueba cambiando esa línea por alguna de estas:

Me.[PASAPDNI].Value = vbNullString

Me.[PASAPDNI].Value = Empty

Me.[PASAPDNI].Value = ""

Si no lo resuelves habrá que mirar de cambiar el evento en el que estamos programando el código.

No ha funcionado Sveinbjorn, después del "AVISO" en los tres casos me sigue saliendo que el campo"CLIENTES.DNI/NIF" no puede ser una cadena de longitud cero. Por favor, espero tu ayuda.

¿Puedes pasarme una copia de la BD?

Este código creo que te servirá, pero tienes que borrarle el del evento Antes de actualizar:

Private Sub PASAPDNI_AfterUpdate()
Dim vDNI As Variant, vDNIB As Variant
Dim rst As DAO.Recordset
vDNI = Me.[PASAPDNI].Value
If IsNull(vDNI) Then Exit Sub
vDNIB = DLookup("[DNI/CIF]", "CLIENTES", "[DNI/CIF]='" & vDNI & "'")
If vDNIB = vDNI Then
resp = MsgBox("El DNI introducido ya existe. ¿Quieres ir a él?", vbInformation + vbYesNo, "AVISO")
    If resp = vbYes Then
        Me.Undo
        Set rst = Me.RecordsetClone
        rst.FindFirst "[DNI/CIF]='" & vDNI & "'"
        Me.Bookmark = rst.Bookmark
        rst.Close
    Else
        Me.Undo
    End If
End If
End Sub

Me vas diciendo

Respuesta
1

Supongamos ( es que no tengo muchas ganas de trabajar) que tienes una tabla Clientes con los campos Idcliente, NombreCliente, NIF, dir(de dirección), localidad. También tienes un formulario Clietes con estos campos. Haz una copia de éste formulario y llámalo Modificar.

En el cuadro de texto NIF del formulario Clientes, en sus propiedades-Eventos-Antes de actualizar, crea un procedimiento de evento y entre Private Sub y End Sub escribe

If DCount("nif", "clientes", "[nif]=forms!clientes!nif") >= 1 Then
Dim d, e, f
d = DLookup("nombrecliente", "clientes", "[nif]=[forms]![clientes]![nif]")
e = DLookup("dir", "clientes", "[nif]=[forms]![clientes]![nif]")
f = DLookup("localidad", "clientes", "[nif]=[forms]![clientes]![nif]")
Dim Respuesta As Integer
Respuesta = MsgBox("Ese nif ya existe, corresponde a " & UCase(d) & Chr$(10) + "con dir en " & UCase(e) & Chr$(10) + "en " & UCase(f) & " ¿ Quiere modificar los datos ?", vbYesNo, "El que avisa no es traidor")
If Respuesta = vbYes Then
 DoCmd.CancelEvent
DoCmd.OpenForm "modificar", , , "[nif]=forms!clientes!nif", , acDialog
End If
End If

Así, si en un registro duplicas el nif, te aparecerá un mensaje con el nombre, dirección y localidad del que tiene ese nif. Al pulsar aceptar se te abre el formulario Modificar para que cambies el NIF.

No se si era eso lo que querías.

Nota: Lo de Ucase es para que la primera letra te aparezca en el mensaje en mayúsculas

Gracias, Icue, por tu trabajada respuesta, que todavía no he probado. En realidad lo que yo pretendo es que se abra el formulario al que corresponde el DNI/NIF duplicado, porque doy por supuesto, que al introducir el dni duplicado, el operador lo que pretende es imputar una venta a un cliente, sin saber que este ya existe y que es en esa ficha, ya existente, donde tiene que efectuar la operación. Muchisimas gracias y un cordial saludo

Efectivamente, cuando en el mensaje le dices que si quieres modificar, se abre el formulario Modificar en el registro correspondiente al DNI que has escrito en el formulario Clientes, y como ambos formularios dependen de la misma tabla, los cambios que hagas en el formulario Modificar quedan guardados en la tabla Clientes. Una vez modificado el form Modificar y lo cierres, te quedarás en el registro del formulario Clientes donde escribiste el DNI duplicado. Ahí puedes poner, por ejemplo un botón Eliminar registro con el código

DoCmd. RunCommand acCmdDeleteRecord

Al pulsar el botón como todavía no habrás borrado el DNI duplicado del cuadro de texto, te volverá a aparecer el mensaje, pero como ya no quieres modificar nada, le dices que no quieres modificar nada y te borra ese registro.

Si no quieres poner un botón, cuando vuelves al form Clientes, con borrar o cambiar de DNI.

En fin, hay varias posibilidades

¡Gracias! Solo decirte que el formulario que sale es "modoficar" pero en blanco. Te agradezco muchísimo tu ayuda. Un cordial saludo

¿Pero has puesto, en el origen de datos del formulario modificar la tabla Clientes?

Cuando dije duplicar el formulario Clientes, es para que pongas el cursor encima de él en la ventana de objetos, le das al botón de la derecha del ratón, pulsas Copiar, le vuelves a dar al botón derecho y pulsas Pegar. Se abre una ventana donde te aparece, guardar como Copia de Clientes. Ahí le pones Modificar y ya está. Es exactamente igual al de Clientes

Así es como lo he hecho y me sale el formulario exacto al de clientes pero con todos los datos en blanco. Te agradezco tu interés y trabajo. Un saludo cordial.

No suelo hacerlo, pero mi correo es [email protected]. Si quieres, o bien me mandas un mensaje y te mando un ejemplo, o bien me mandas una copia de tu base, porque te aseguro que funcionar, funciona.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas