Comprobar datos en formulario antes de guardar

Tengo una base de datos en access, en la cual utilizo un formulario para que los usuarios introduzcan los datos de 4 campos: CAMPO1, CAMPO2, CAMPO3 y CAMPO4. Según corresponda, podrán completar datos en 1, en 2, en 3 o en los 4 campos. Finalmente hay un botón GUARDAR que ejecuta una macro para guardas los datos en la tabla correspondiente. El CAMPO1 es obligatorio, y los otros 3 opcionales.

Necesito ayuda de un experto para que antes de guardar, se verifique que, cada uno de los datos escritos CAMPO1, CAMPO2, CAMPO3 y CAMPO4, no existen en los campos de la tabla donde se guardan: DATO1, DATO2, DATO3 y DATO4. Es decir, comprobar que los datos introducidos en CAMPO1 no existen en DATO1, DATO2, DATO3 ni en DATO4; comprobar que los datos introducidos en CAMPO2 (si los hay: puede ser NULL) no existe en DATO1, DATO2, DATO3 ni en DATO4. Y lo mismo para los datos de CAMPO3 y CAMPO4 (si los hay: pueden ser NULL).

Sería ideal que en caso de coincidencia de datos de CAMPO1 en cualquiera de DATO1, DATO2 DATO3 o DATO4 se mostrará un aviso de ALERTA al usuario avisando que ya existe para que haga otras comprobaciones. Y más completo aún si el mensaje de ALERTA dijera algo así "El CAMPO1 ya existe en el NÚMERO XXXXX (dónde NÚMERO es un registro de la tabla que contiene DATO1, DATO2 DATO3 y DATO4.

No sé casi nada de código, y hacerlo con MACROS se me antoja muy díficil, por no decir imposible.

Respuesta
1

Lo que buscas es algo complejo de elaborar ya que necesitarías conocer como funcionan los recordsets en vba... ahora bien.. .una forma fácil de comprobar que todos los campos estén llenos es la siguiente:

En el evento Click del botón Guardar, eliges generador de código y escribes lo siguiente:

if me.campo1.value <>"" then

if me.campo2.value <>"" then

if me.campo3.value<>"" then

'acá llamas al proceso que se ejecutará si todos los campos están llenos

else

msgbox "Falta el valor del campo3"

end if

else

msgbox "Falta el valor del campo2"

end if

else

msgbox "Falta el valor del campo1"

end if

Eso te ayudará al menos con la primera parte.. ahora que te verifique los datos para saber si están repetidos, ahí si tendrías que aprender a utilizar bien sea los recordsets o la función dlookup() que viene en ms access.

¡Gracias! Alexis, lo que me dices me sirve para comprobar que el CAMPO1 no esté vacío porque es obligatorio, mientras que el resto son opcionales. Lo implementaré porque así tengo un control adicional de que los usuarios no intentan guardarlo sin rellenar ese dato.

Estimado Alexis, me funcionó el código. Ahora nadie deja el CAMPO1 en blanco.

Ahora tengo otra cuestión diferente ¿podrás ayudarme?  El formulario de visualización de registros tiene unos 30 campos aprox., la mayoría de ellos bloqueados para que los usuarios no cambien datos accidentalmente.  Lo que he hecho es poner un botón oculto detrás del logotipo con la intención de que al clicar se desbloqueen todos los campos del formulario, pero no lo consigo hacer.

¿Podrías decirme cómo?  Muchas gracias anticipadas

Eso es mucho más sencillo...
Yo te aconsejaría mejor que en vez de poner un botón oculto, mejor des clic a la imagen del logotipo y en la pestaña de eventos agregues el evento "doble clic", así le darás soble clic al logo para que esto funcione. El código para desbloquear los controles que tienes bloqueados es el siguiente:
me.Campo1.locked = false  ' True los bloquea y false los desbloquea

me.campo2.locked = false

etc...

También está la propiedad "enabled" (habilitado) pero no estoy seguro de si usaste "bloqueado" o "habilitado", esa se cambia así:
me.campo.enabled = true ' True lo habilita, false lo deshabilita

Ahora bien.. si tu quieres que al hacer doble clic en el logo (o clic en tu botón) se bloquee o se desbloquee dependiendo del status el código sería así:
if me.campo1.locked = false then

me.campo1.locked = true

else

me.campo1.locked = false

end if

y escribes todos los nombres de los controles uno debajo del otro.
Yo te aconsejaría que utilizaras las dos propiedades Locked y enabled, así bloqueas el control para que nadie lo modifique y al mismo tiempo, tampoco pueden seleccionar su contenido.

Ej:

me.campo1.locked = false   ' Para desbloquear

me.campo1.enabled = true 

me.campo1.locked = true   ' Para bloquear nuevamente

me.campo1.enabled = false

Es algo tedioso, pero se ven más presentables.

Para que puedas bloquear o desbloquear tus controles de una, sin estar escribiendo en cada evento los nombres de cada uno, créate una función así:
Private Sub BloquearControles()

me.campo1.locked = true

me.campo1.enabled = false

me.campo2.locked = true .... etc, etc, etc

End sub

Y una para desbloquear

Private Sub DesbloquearControles()

me.campo1.locked = false

me.campo1.enabled = true

me.campo2.locked = false .... etc, etc, etc

End Sub

Luego, en el evento doble clic del logo (o clic de tu botón) agregas la línea:
Call BloquearControles()

o bien

Call DesbloquearControles()

Esto te servirá para que llames la misma función en el formulario desde donde quieras, por ejemplo, puede ser después de guardar el registro, al cargar el formulario, etc.. así evitas reescribir el mismo código varias veces.

Y en el caso del ejemplo de alternancia que te di (que cambie de bloqueado a desbloqueado y viceversa con el mismo botón)
if me.campo1.locked = true then

call DesbloquearControles()

else

call BloquearControles()

End if

Te quedará mucho más eficiente.

¡Gracias! es una respuesta muy completa que se escapaba a mis conocimientos. Intentaré implementar la solución del logo que es mucho más elegante.

Estimado Alexis, no consigo que me funcione. Los controles están "bloqueados".

Si llamo a la función  "call DesbloquearControles()"  me da un error porque no la encuentra.   Y si lo dejo con el nombre del objeto, tengo un error de compilación

¿Qué estoy haciendo mal?  Gracias.

Solucionado Alexis, se me olvidaron los corchetes en el nombre de campo porque son de texto   [CAMPO 1]  y funciona genial. Gracias.

Cuando el nombre del control tiene un espacio (o varios) debes usar los corchetes... cualquier duda puedes enviarme un correo a [email protected]  y en la medida de mi tiempo te responderé... así puedes cerrar esta pregunta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas