¿Cómo hacer que salga un aviso para un valor repetido en campo de un formulario access?
En la oficina los compañeros usamos una base de datos para programar visitas de inspección a establecimientos y nos interesaría saber como hacer para que al rellenar el campo de fecha de visita nos saliera un aviso conforme para ese día alguno de nosotros ya haya programado una visita y así comprobar si dispondremos del material necesario (coche, instrumentos de medición, etc.). No en todos los casos utilizamos el mismo material por lo que se podrían hacer distintas visitas por diferentes personas el mismo día, por ello sólo nos interesaría que saliera el aviso pero que fuera posible poner la misma fecha repetida.
1 respuesta
Te doy una idea general (de varias posibles que se me vienen a la cabeza), pues no puedo decirte nada concreto al no saber los elementos de tu BD:
1º/ Crea una consulta con el campo fecha de visita y aquellos campos que te interese mostrar en el aviso. En el campo fecha, le pones como criterio el cuadro de texto del formulario, según este modelo: [Formularios]![NombreFormulario]![NombreCampo]
2º/ En el evento después de actualizar de tu campo fecha, le generaría un código que compruebe si la consulta anterior devuelve registros (ya sea por medio de un recordset o de la función DCount() ).
Si los devuelve, es porque ya tienes alguna visita programada para esa fecha. En este caso, podrías lanzar un MsgBox indicando esa circunstancia, lanzar un msgbx indicando la circunstancia y los datos que quieras, y/o abrir un formulario (o la propia consulta) sobre esa consulta para mostrar los datos de las visitas programadas.
Si necesitas una explicación más detallada, indícame los nombres de los elementos que intervienen (formularios, campos y tabla)
Gracias por responder. No tengo ni idea de todo lo que me has dicho, por culpa mia claro. Tengo conocimiento nulo sobre programar en Access...
Te explico como usamos la base de datos y así sabrás qué es lo que intentamos hacer.
Cuando llama un cliente el tècnico que se encargará de hacer el trabajo introduce en la base de datos los datos del cliente y del control, en éste último introducimos entre otros datos, el día de la visita. En el Outlook tenemos compartido un calendario donde reservamos el coche para hacer la visitas pero alguna vez se nos olvida reservar y nos encontramos con que dos tècnicos realizamos la visita el mismo día pero el que se ha olvidado de reservar coche tiene que aplazar la visita que conlleva muchos inconvenientes.
Lo que nos interesa es que en el mismo momento de introducir una fecha en el formulario (sin tener que hacer filtros, consultas, etc. por que no nos acordaremos de hacerlo) nos salga el aviso que esa fecha ya está introducida y así antes de programarla poder consultar con el compañero si necesitará el coche (por que no siempre se necesita). En caso que podamos hacer la visita el mismo día también nos intersa que podamos repatir la fecha en el campo.
El formulario está ligado a una tabla con todos los campos del formulario.
No sé si me he explicado bien ni si se puede hacer lo que pretendemos.
Gracias de nuevo y un saludo!
El funcionamiento lo tengo claro, pero si quieres que te de el código exacto para que te funcione necesito que me digas:
1º/ El nombre de la tabla donde almacenas fa fecha de visita, y los nombres de los campos de esa tabla (puedes ponerme aquí una imagen de la vista diseño de la misma)
2º/ El nombre del formulario en el que introduces la fecha de visita y donde quieres que te salga el aviso, y el nombre del cuadro de texto (si es distinto al nombre del campo de la tabla, que puedes ver en sus propiedades->pestaña otras->nombre)
La tabla se llama "General" (sin comillas) y el nombre del campo en la tabla "gdata_actuacio" (sin comillas)
El nombre del formulario es "General total" (sin comillas) y el nombre del cuadro de texto es idéntico al de la tabla.
Gracias por tu pronta respuesta y un saludo!
Ok, allá vamos, a ver si sale como queremos:
1º/ Crea una consulta nueva sobre la tabla General, seleccionando el campo gdata_actuacio y aquellos otros que te interese mostrar en la alerta. A esta consulta la llamas CAviso
Abre la consulta CAviso en Vista Diseño, y en la columna correspondiente al campo gdata_actuacio le pones como criterio lo siguiente:
[Formularios]![General total]![gdata_actuacio]
De esta forma, cada vez que ejecutes la consulta (con el formulario General total abierto) te devolverá los registros de la tabla general que coincidan con la fecha que tengas en el campo gdata_actuacio (si es que hay registros)
2º/ Abre el formulario General total en vista diseño, selecciona el campo gdata_actuacio, saca sus propiedades con el botón derecho, vete a la pestaña Eventos y localiza el que se llama "después de actualizar". Verás que a la derecha de esa fila aparece un botón con 3 puntos. Lo pulsas y seleccionas "Generador de código". Se te abrirá el editor de VBA, y entre las lineas Private Sub... y End Sub (donde te aparece el cursor), pones este código:
Dim numRegistros As Integer
Dim resp As Integer
numRegistros=Nz(DCount("*","CAvisos"),0)
If numRegistros<>0 Then 'Si devuelve algún registro
resp=MsgBox("Para la fecha seleccionada ya existen visitas programadas. ¿Quieres consultarlas?", vbQuestion+vbYesNo,"Visitas programadas")
If resp=vbNo Then Exit Sub 'Si pulsas en No, salen sin hacer nada más
DoCmd. OpenForm "FAvisos",,,,, acDialog
3º/ Crea un formulario continuo (usando el asistente) sobre la consulta CAvisos y llámalo FAvisos. Este formulario será el que se muestre si se pulsa Sí cuando pregunte si quieres consultar las visitas de ese día.
A ver si te sale.
Hola de nuevo,
Ya lo he probado y en principio parace que debe funcionar por que al repetir la fecha y hacer la consulta si aparece el formulario con los técnicos que han reservado para la misma fecha, pero quisiéramos que al introducir la fecha automáticament saliera el aviso que ya está escogida, sin tener que ejecutar expresamente la consulta... ¿no es posible o he hecho algo mal?
Uhm, pues algo no has hecho bien, porque el código que te puse en el punto 2, al meter una fecha en el formulario, te lanza el mensaje avisando de que ya hay reservas, y al pulsar en el botón sí, te abre un nuevo formulario (basado en la consulta) que te muestra la información.
En ningún momento es necesario que ejecutes manualmente la consulta.
Revisa que has seguido los pasos correctamente, y si quieres, ponme aquí el código que tienes en el evento después de actualizar de tu campo fecha, a ver si te falta algo.
He comprobado los pasos a seguir y creo que están bien... Te pongo el código del evento a ver que puede fallar...
pues al código sólo le veo un fallo (y mío, además), y es que le falta un End If antes del End Sub.
¿No te daba error al ejecutarse?
Te adjunto un mini-ejemplo que simula tu BD.
La verdad no parece ejecutarse nada... He modificado como me decías el código del evento y tampoco funciona...
He probado el mini ejemplo que me has enviado y tampoco sale ningún aviso al repetir la fecha de actuación en el formulario de datos...
¿No le tendrás puesta la seguridad para que no se ejecute el código VBA?
Porque el ejemplo que te mando funciona perfectamente... Abres FDatos, vas a un registro nuevo (o modificas la fecha de uno existente) y si ya está registrada (19, 20 o 21/04/2015) te salta el mensaje, y al pulsar en sí, FAvisos con las revisiones de la fecha.
Si quieres pásame tu BD y lo miro, pero me da que es problema de que tu BD bloquea el código...
Te he preparado un video de la BD que te mandé en funcionamiento, para que veas que sí lanza avisos.
Sigo pensando que a ti no te va por bloqueos de seguridad de tu access...
No será por que no le estás echando ganas... ahí te dejo un trozo de la base de datos a ver si hay algo que se nos escapa (para haber dejado tres registros pesa bastante el archivo que te envío...)
Has puesto el link para borrar el archivo, no el de descargar... :D
Tienes que coger el primero de los 4 que sale.
a ver ahora... lo he tenido que volver a colgar...
Jejeje, ya encontré tu fallo:
En el código La consulta es CAvisos y el formulario FAvisos y tu los llamaste en la BD CAviso y FAviso
Si cambias los nombres en el código o de los objetos para que coincidan, ya te funciona correctamente.
Consejo, en las opciones de la BD busca la opción "Compactar al cerrar" y márcala, verás que el tamaño de tu BD se te reduce significativamente.
Ya he cambiado los nombres pero sigue sin funcionar... además de cambiar los nombres en el código de evento también he traducido los mensajes de alerta al catalán por que trabajamos en esa lengua en la oficina... ¿puede tener algo que ver?
¿La qué te pasé en mi último mensaje tampoco te funciona?
En esa ya no tenías que cambiar nada (sólo traducir el texto del mensaje)
¿Te da algún error o simplemente no hace nada?
Esto ya parece Expediente X...
No la había probado pero tampoco funciona... no da error, no hace nada (no parece que se ejecute nada... no se queda el cursor "pensando" ni "rasca" el disco duro ;-p)...
Pues ya me estoy quedando sin ideas, no entiendo por qué a mi me funciona y a ti no...
Haz esto y me vas contando lo que te sale:
Abre el módulo de VBA, y vete al evento Private Sub gdata_actuacio_AfterUpdate().
Coloca el cursor encima de esa línea y pulsa F9. Se te debería marcar en rojo y aparecer un punto rojo a la izquierda de la misma.
Vuelve al formulario, y mete una fecha que ya tengas (p.e. 23/10/01 o 06/11/01 en la que me pasaste).
Si todo va bien, te llevará al código a la línea inicial del procedimiento. Pulsa F8 para ir avanzando línea a línea.
Cuando llegues al primer If, coloca el cursor encima de la variable numRegistros, y verás el número que devuelve la función DCount (o lo que es lo mismo, los registros de la consulta CAviso).
Si pusiste una fecha para la que hay registros y numRegistros=0, es señal de que la consulta está fallando, o falla el nombre de la consulta en la línea numRegistros = Nz(DCount("*", "CAviso"), 0)
Sigue pulsando F8 hasta el final a ver si se te ejecuta el código dentro del Bloque if
Me dices.
Nada, doy F9 sobre la línia, se marca en rojo y sale el punto que comentas pero al meter una fecha existente ni se immuta...
No sé si tendrá algo que ver pero cuando entro en el código del evento, a parte de la línias que me dijiste que pusiera para que saliera el aviso, aparecen antes bastantes "cosas", copio y pego (por si sirve de algo):
Option Compare Database
Private Sub Comando_9906_Click()
On Error GoTo Err_Comando_9906_Click
Dim stDocName As String
stDocName = "Consulta num informe"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_Comando_9906_Click:
Exit Sub
Err_Comando_9906_Click:
MsgBox Err.Description
Resume Exit_Comando_9906_Click
End Sub
Private Sub Comando_5966_Click()
On Error GoTo Err_Comando_5966_Click
Dim stDocName As String
stDocName = "Consulta Num Oferta"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_Comando_5966_Click:
Exit Sub
Err_Comando_5966_Click:
MsgBox Err.Description
Resume Exit_Comando_5966_Click
End Sub
Private Sub Comando_5965_Click()
On Error GoTo Err_Comando_5965_Click
Dim stAppName As String
stAppName = "C:\Documents and Settings\All Users\Documentos\Bases de dades\Model Oferta CI.doc"
Call Shell(stAppName, 1)
Exit_Comando_5965_Click:
Exit Sub
Err_Comando_5965_Click:
MsgBox Err.Description
Resume Exit_Comando_5965_Click
End Sub
Private Sub Comando9489_Click()
On Error GoTo Err_Comando9489_Click
Dim stDocName As String
Dim stLinkCriteria As String
stDocName = "Registre Administratiu"
stLinkCriteria = "[gid_]=" & Me![gid_]
DoCmd.OpenForm stDocName, , , stLinkCriteria
Exit_Comando9489_Click:
Exit Sub
Err_Comando9489_Click:
MsgBox Err.Description
Resume Exit_Comando9489_Click
End Sub
Private Sub Comando14398_Click()
On Error GoTo Err_Comando14398_Click
Dim stDocName As String
stDocName = "Control comunicacions"
DoCmd.OpenQuery stDocName, acNormal, acEdit
Exit_Comando14398_Click:
Exit Sub
Err_Comando14398_Click:
MsgBox Err.Description
Resume Exit_Comando14398_Click
End Sub
Private Sub gdata_actuacio_AfterUpdate()
Dim numRegistros As Integer
Dim resp As Integer
numRegistros = Nz(DCount("*", "CAviso"), 0)
If numRegistros <> 0 Then 'Si devuelve algún registro
resp = MsgBox("Para la fecha seleccionada ya existen visitas programadas. ¿Quieres consultarlas?", vbQuestion + vbYesNo, "Visitas programadas")
If resp = vbNo Then Exit Sub 'Si pulsas en No, salen sin hacer nada más
DoCmd.OpenForm "FAviso", , , , acFormReadOnly, acDialog
End If
End Sub
Los otros códigos son los de los botones que tienes en tu formulario. Si te funcionan los botones parece que el problema está en el que cuadro de texto no se asocia al código.
Comprueba esto, y si no va, me doy por vencido...
Abre tu formulario en vista diseño, saca las propiedades del cuadro de texto gdata_actuacio, vete a la pestaña Eventos y comprueba si en la fila del evento "después de actualizar" te pone [Procedimiento de Evento].
Es lo que tiene que poner.
¿Si le das al botoncito de los 3 puntos, te lleva al código Private Sub gdata_actuacio_AfterUpdate()?
Dime otra cosa: cuando dices que no te hace nada, ¿es justo al poner/cambiar la fecha en el campo, o cuando sales de él/pulsas Tab o Enter?
Lo que me sigue sonando raro es que al ponerle el punto de interrupción (lo de pulsar F9) no te entre al código.
Tampoco me cuadra que el archivo que a mí sí me funciona a ti no...
Al darle a los tres puntos me lleva a aquí:
Exactamente el cursor se sitúa en la segunda línea Dim numRegistros As Integer (no sé si es relevante o no pero yo lo suelto por si acaso...).
No hace nada haga como lo haga, cambiando la fecha en un registro existente o poniéndola en un registro nuevo, pase de campo del formulario haciendo tab o enter o simplemente cambiando con el ratón...
Pues si tu consulta se llama CAviso, el formulario FAviso, todo está correcto: el código es correcto, el evento es el correcto, el campo tiene bien asociado el código...)
Ya me quedé sin ideas, y desde aquí poco más puedo hacer.
Lo único que me conecte a tu PC por remoto y mire a ver si veo algo raro...
- Compartir respuesta