Como crear la regla de validación en access
Tendo una BD en access, en la cual el campo fecha esta restringido para que se agenden citas solo con 15 días de anticipación.
Hay tantos usuarios que agendan, que requiero restringir el día martes de cada semana para mi, es decir que si yo ingreso a la BD y tomo el martes me deje agendar, si ingresa otro usuario le restringa tomar ese día, es decir podrá agendar los demás días menos el martes.
actualmente para el campo fecha la regla de validacion la tengo asi: <=Fecha()+15
Texto de validación lo tengo así: "puedes Agendar tu espacio, máximo con 15 días de anticipación"
Adicional necesitaría bloquear el día martes de cada semana para mi, pero no he logrado encontrar la forma, no se mucho de VB.
1 respuesta
Vamos a ver si consigo explicarme. Primero, no dices como determinas el cliente, las fechas, ni como están construidas las tablas y el formulario. Por eso, antes de suponer vamos a señalar unos casos que pueden darse
1º Que el "cliente" sólo quiera reservar una cita un día determinado.
2º Que ese día determinado sea martes
3º Que ese día determinado ya esté reservado por otro cliente
4º Que no se pueda reservar para el mismo día del sistema
Vamos ahora a suponer que quiere reservar un intervalo de días, por ejemplo 15/03/2020 al 22/03/2020
5º Si hay algún martes en medio no debe guardarlo
6º Si en ese intervalo de días hay alguno que ya está reservado, que lo avise y no lo guarde
No se me ocurren más.
Vamos ahora al trabajo.
Si tengo un formulario como el de la imagen
No haría falta el botón, pero me remito a lo dicho en las primeras líneas. Si pulso el botón
En caso de que hubieras puesto el mismo día del sistema te aparece un mensaje avisándote y no hace nada hasta que lo corrijas. Vamos a suponer que elijes un intervalo
Al pulsar
Con lo que la tabla Reservas te quedaría
Como puedes ver, el martes 10 no te lo guarda.
Vamos a suponer que llega María y quiere reservar el 12/03/2020, que puedes ver que ya está reservado por Pepe( y como somos unos machistas se lo asignamos a él)
Al pulsar
Me parece que no me deja poner más imágenes, así que continuo en la ampliación
Vamos a suponer que María(¿es qué no tiene otra cosa que hacer?) Elige un intervalo de días en los que hay algunos ya reservados
Recuerda que el 11, 12 y 13 ya están reservados por Pepe
Primero me aparece lo de los martes para recordármelo
y al Aceptar
Y así te lo va diciendo mientras "haya" días que ya están reservados, por lo que al final la pobvre María se queda con
El código del botón es
Private Sub Comando36_Click() If IsNull([FechaFin]) Then If FechaInicio = Date Then MsgBox "No se puede reservar el mismo día", vbOKOnly, "¿Cuantas veces tengo que decirlo?" Exit Sub ElseIf FechaInicio > Date Then If DCount("*", "reservas", "fechareserva=forms!formulario1!fechainicio") >= 1 Then MsgBox "Imposible,Imposible, ese día ya está cogido", vbOKOnly + vbExclamation, "Tendrás que reservar otro" Exit Sub ElseIf Format([FechaInicio], "dddd") = "Martes" Then MsgBox "Imposible, los martes están reservados para Gloria", vbOKOnly, "Derberás seleccionar otro" Exit Sub Else DoCmd.RunSQL "insert into reservas (cliente,fechareserva)values(Cliente,fechainicio)" End If End If Else Dim c As Byte MsgBox "Que sepas que los martes estan reservados para Gloria", vbOKOnly, "No digas que no te avisé" For c = 1 To DateDiff("d", FechaInicio, FechaFin) + 1 If DCount("*", "reservas", "fechareserva=forms!formulario1!fechainicio+" & c & "-1") >= 1 Then Dim d d = DateValue(Forms!formulario1!FechaInicio + c - 1) MsgBox "Imposible,Imposible, ese día " & d & " ya está cogido", vbOKOnly + vbExclamation, "Tendrás que reservar otro" Else DoCmd.RunSQL "insert into reservas (cliente,fechareserva)values(Cliente,fechainicio+" & c & "-1)" End If Next DoCmd.RunSQL "delete * from reservas where format([fechareserva],""dddd"")=""Martes""" End If End Sub
Parece liado, pero es por tener que cubrir todas las posibilidades y los mensajes de aviso.
Gracias por tu respuesta. Si se ve liado el tema.
Me explico mejor.
1. Tengo un formulario que cada usuario diligencia así: ejemplos
- Usuario: María este campo no es modificable, lo trae directo una vez se identifica en la base.
- Nombre del servicio: lavar el patio
- fecha del servicio: 10.03.20
- Equipo a usar: Lavadora
- horario: 7.00 a 12.00 Nota: los horarios que se manejan esta descritos así y se despliega el listado con dos opciones 7.00 a 12 y 13.00 a 17
Lo que mencionas arriba, de la alerta notificando que el equipo esta ocupado en esa fecha y hora, ya lo tengo funcionando bien.
El dilema que tengo es, que tengo muchos usuarios, que ingresan al formulario para programar su turno, esta bien, pero hay algunos que se quedan sin días y horarios pues ya todo estaría reservado y les aparece el mensaje que esta ocupado tal equipo en tal fecha en tal hora. Esta bien.
Ahora, lo que quiero es dejar un día se me ocurre el martes, que si un usuario POR va a reservar ese día, genere la alerta y diga ejemplo "este día no se puede reservar, esta asignado para glori", y que cuando yo entre a la base, como me autentico con contraseña, si quiero reservar un espacio y quiero el martes me deje sin problema, obivio que si hay más horarios libres lo pueda hacer, pero en primera instancia ya sepa que el martes es mio. Se me ocurre así como para proteger al más débil por decirlo así, y todos tengan oportunidad de agendar.
Si fuese muy complicado lo anterior. Pues se me ocurre habilitar el botón que dice programación para que se pueda agendar solo los días miércoles por ejemplo desde las 8 am hasta las 5.00 pm, y así cada miércoles. Y como decimos acá, el primero que se arrodille se confiesa.
El menu principal consta de 3 botones y cada uno despliega un formulario, para el caso del botón de programación al dar click desplieqa el formulario que menciono líneas arriba para diligenciarlo y agendar. Seria solo hacer la validación de este botón y solo se active los días miércoles desde las 8 am hasta las 5.00, para que ingresen a agendar.
Agradezco su respuesta.
Pero lo importante es saber que define una reserva, por ejemplo:
1º Ana quiere reserva para un día y una hora, pero el servicio de Limpieza de patio ya está cogido. ¿Se anula la reserva? ¿Tiene qué elegir otro día? ¿Elige otro servicio? ¿Elige otra lavadora?
2º Ana quiere trabajar, pero que sea precisamente el 14/03/2020 de 13 a 17 horas. Si ya estuviera cogida ¿Se queda de brazos cruzados? ¿Elige otro día?
Supongamos que tengo una tabla Reservas con los mismos campos que ves en el formulario
También tengo una tabla Dias Libres donde se van a guardar los días y las horas(la primera vez, de los día que le quedan al mes en curso. Luego a cada día que pase ya le añadirá uno para compensar que el actual ha pasado). Cuando pulso el botón
Me ha creado dos turnos por día hasta que acabe el mes.
En el formulario de antes, llega Ana y elige un día
Y luego elige una hora
Y como todavía nadie eligió están los dos turnos libres.
Ahora viene Carlos y elige el mismo día, ya que hay un turno libre
Cuando vaya a elegir la hora, sólo le aparecerá la que está libre
Y la elige( o no, en este caso vamos a suponer que sí) Cuando llegue otro usuario a elegir día
Ya no le aparece el 14 porque ambos turnos están cogidos.
Le tengo puesto que si hubiera seleccionado un martes le diga que no puede que ya está reservado, pero también se le podría decir
A.- Que si el usuario no es Gloria, en el combinado no le muestre los martes
B.- Que no muestre los sábados y domingos( que son para descansar, se supone)
En el formulario, una vez que ya ha creado la tabla Dias libres, se le puede decir que ya no muestre el botón.
El código del formulario es
Private Sub Comando10_Click() Dim i As Byte For i = 1 To DateSerial(Year(Now()), Month(Now()) + 1, 0) - DateSerial(Year(Now()), Month(Now()), 1) DoCmd. RunSQL "Insert into diaslibres(diaslibres, horaslibres)values(dateSerial(Year(Now()), Month(Now()), 1)+" & i & ",""7:00 a 12:00"")" DoCmd. RunSQL "Insert into diaslibres(diaslibres, horaslibres)values(dateSerial(Year(Now()), Month(Now()), 1)+" & i & ",""13:00 a 17:00"")" DoCmd.RunSQL "delete * from diaslibres where diaslibres<=Date()" Next End Sub Private Sub FechaReserva_BeforeUpdate(Cancel As Integer) If Format([FechaReserva], "dddd") = "Martes" And Usuario <> "Gloria" Then MsgBox "No se puede reservar, es martes y es para Gloria", vbOKOnly, "Háblalo con ella" End If End Sub Private Sub FechaReserva_GotFocus() FechaReserva.Requery End Sub Private Sub HoraReserva_AfterUpdate() DoCmd.RunSQL "delete * from diaslibres where diaslibres=forms!reservas!fechareserva and horaslibres=forms!reservas!horareserva" End Sub Private Sub HoraReserva_GotFocus() HoraReserva.Requery End Sub
Me gusta pero no me funciono, tome solo la parte del código:
Si entro al formulario y selecciono el 17 q es un martes, deja q otrousuario lo tome, en este caso maría.
¿Sera por el formato de día? Como se podría enlazar para q restrinja a otro usuario seleccionar el martes, q solo pueda tomarlo yo. Es decir puedo tomar cualquier día, pero con seguridad se q el martes es mio.
Agradezco su orientación
Private Sub Fechafabrica_BeforeUpdate(Cancel As Integer) If Format([Fechafabrica], "dddd") = "Martes" And Usuario <> "Gloria" Then MsgBox "No se puede reservar, es martes y es para Gloria", vbOKOnly, "Háblalo con ella" End If End Sub
No sé como lo habrás puesto. Mira la imagen. María intenta quitarte el día
Y cuando aceptas, el cursor se vuelve al control Fechareserva para que la cambies.
Pero también puedes ponerlo en el evento Después de actualizar del control FechaReserva como
Private Sub FechaReserva_AfterUpdate() If Format([FechaReserva], "dddd") = "Martes" And Usuario <> "Gloria" Then MsgBox "No se puede reservar, es martes y es para Gloria", vbOKOnly, "Háblalo con ella" Usuario.SetFocus FechaReserva = "" End If End Sub
En este caso, te saldría el mensaje y al Aceptar, el cursor se iría a Usuario y el control Fechareserva te lo deja vacío para que lo cambies.
- Compartir respuesta