Me piden, como es una agenda de citas, aquí actualmente hay 20 médicos, a todos se le asigna cita, me plantearon este problema, poder bloquear fechas en las cuales los médicos no asistirán por motivos diversos (permisos, vacaciones, etc.), ademas de no citar pacientes en días festivos, también no citar pacientes a los médicos en su horario de alimentos. Esto es debido a que en estos días que han utilizado la base de datos dan citas en fechas y horarios que no se debería, no se si puedas ayudarme. O sea necesito bloquear fechas y horas determinadas para todos los médicos. Yo me imaginaba crear un formulario para en el capturar las fechas y horas en que los médicos no asistirán o tendrán alguna actividad y guardarlos en una tabla y al momento de capturar una cita me verificara esta tabla para checar dichas fechas, no se si me expliqué bien.
Respuesta
2
2
Anónimo
Entiendo perfectamente el problema, pero tengo que pensar cual sería la forma más sencilla de resolverlo. Me tienes que decir primero ¿el horario es para todos los médicos igual? Es decir quitando permisos o vacaciones que serian personalizados ¿todos trabajan por ejemplo de 9 a 2 y de 4 a 7? Es por donde debemos empezar, por tener unos intervalos de tiempo digamos hábiles. Después ¿con qué intervalo se dan las citas? ¿15 minutos, media hora...? Para que cuando demos una cita tengamos que respetar el intervalo de tiempo necesario para dar otra. Me cuentas.
Ok Angeles: Mira 14 médicos tienes horario de 8:00 a 14:00 y de 15:00 a 18:00 horas., las citas son con intervalo de 15 minutos, 3 psicólogas con el mismo horario pero las citas con intervalo de 30 minutos. Dime se podría por ejemplo bloquear fechas y horarios, que no estuvieran establecidos, por ejemplo, un medico tiene que dar una platica un día determinado, se podría bloquear esa fecha y hora digamos uno o dos dis antes Espero me haya explicado y gracias Atentamente Adrian Morales
Ya tengo algo. Te cuento como lo he planteado para que me digas si te parece bien. Tabla Médicos: Campos: Código (Un código para cada médico que puede ser por ej. el dni) texto Nombre texto HoraIniM (Hora inicio de jornada mañana) Fecha/Hora HoraFinM (Hora fin de jornada mañana) HoraIniT (Hora inicio de jornada tarde) HoraFinT (HoraFin de jornada tarde) IntervaloCita (Intervalo de las citas en Minutos) Numérico Después una tabla por médico que llamaremos AgendaMedico+Código. Por ejemplo, si el código de un médico es el 001 su agenda se llamará AgendaMedico001. Luego verás la razón. Campos: Código FechaIni (Fecha Inicio del bloqueo) (Formato fecha larga, es decir con la hora) FechaFin Motivo (Motivo del bloqueo. Yo he puesto 4: V ---> Vacaciones P---> Permiso (total de la jornada) A ----> Ausente (parcial de la jornada C---> Cita He construido el formulario de las citas, después haremos el del bloqueo por vacaciones, permisos o ausencias. Formulario Citas: Cuadro Combinado selMedico: Origen de la fila: SELECT [Codigo], nombre FROM medicos ORDER BY nombre; Nº de columnas: 2 Columna Dependiente: 1 Al hacer clic ---> Procedimiento de evento ---> Me. Refresh Control Calendar nombre:Calendario (este control lo tienes en el botón Más controles ---> control calendar) Para formatearlo ---> botón derecho ---> objeto calendar ---> propiedades. Cuadro de Lista ListaCitas (No pongas nada ni en origen del registro ni en origen de la fila, pero si pon Visible=No y Punto de tabulación: No) Cuadro de texto independiente txtHora (el código en este cuadro de texto lo pongo al recibir el enfoque) Botón Enviar que hará las comprobaciones y si es válido insertará la cita. El código de todo esto es: Option Compare Database 'Declaro como pública una variable que nos dará el nombre de la agenda de cada médico. Es pública para que nos valga en todo el proceso Public vTabla As String Private Sub Form_Load() 'al cargar el formulario que el control calendario tome el valor de la fecha del día Form!Calendario.Value = Date End Sub Private Sub selMedico_Click() 'Cuando seleccionas el médico en el combox actualizamos Me.Refresh End Sub Private Sub txtHora_GotFocus() 'Primero hemos seleccionado el médico, después la fecha en el calendario y ahora vamos a meter la hora Dim db As Database Dim rs As Recordset Dim vsql As String Dim var As Integer Set db = CurrentDb If IsNull(Form!selMedico) = True Then 'Si no hemos seleccionado el médico ---> Mensaje de error MsgBox ("Seleccionar médico") Form!selMedico.SetFocus Else 'Si hemos seleccionado el médico llamamos a su agenda y lo igualamos a la variable vTabla vTabla = "AgendaMedico" & Form!selMedico.Value 'Seleccionamos en la tabla correspondiente (vTabla) los registros que tengan V o P (vacaciones o permiso) es decir los que tengan bloqueados la jornada entera vsql = "Select * from " & vTabla & " where FechaFin>cdate('" & Form!Calendario.Value & "') and (Motivo='V' or Motivo='P')" Set rs = db.OpenRecordset(vsql) var = 1 Do While Not rs.EOF 'Vemos si la fecha elegida en el calendario está entre las V o las P If Form!Calendario.Value >= rs!fechaini And Form!Calendario.Value <= rs!fechafin Then MsgBox ("Fecha ocupada") Form!Calendario!.SetFocus var = 2 Exit Do End If rs.MoveNext Loop 'Si no esta bloqueada activamos el cuadro de Lista ListaCitas y le damos el valor del origen de la fila, con ello veremos ordenadas todas las citas que tiene ese médico en 'su agenda If var = 1 Then Form!ListaCitas.RowSource = "SELECT FechaIni, FechaFin FROM " & vTabla & " WHERE Mid(str(FechaIni),1,10)='" & Form!Calendario.Value & "' and Motivo='C' order by FechaIni" Form!ListaCitas.Visible = True Me.Refresh End If End If End Sub 'Metemos la hora y hacemos clic en el botón Enviar (me doy ahora cuenta que no he controlado el que la hora no sea nulo, habrá que hacerlo Private Sub Enviar_Click() Dim db As Database Dim rs As Recordset Dim vFecha As Date Set db = CurrentDb 'Vemos en la tabla Medicos las características del seleccionado Set rs = db.OpenRecordset("Select * from Medicos where Codigo='" & Form!selMedico.Value & "'") 'Vemos si la hora está dentro de jornada If DateDiff("n", Form!txtHora.Value, rs!HoraIniM) > 0 Or (DateDiff("n", Form!txtHora.Value, rs!HoraFinM) <= 0 And (DateDiff("n", Form!txtHora.Value, rs!HoraIniT) > 0)) Or DateDiff("n", Form!txtHora.Value, rs!HoraFinT) <= 0 Then MsgBox ("Hora fuera de jornada") Form!txtHora.SetFocus Else 'Insertamos el registro DoCmd.RunSQL "Insert into " & vTabla & " (Codigo, FechaIni, FechaFin, Motivo)" _ & "Values ('" & Form!selMedico.Value & "', cDate('" & Form!Calendario.Value & " " & Form!txtHora.Value & "'), cdate(dateadd('n',val('" & rs!IntervaloCita & "'),cDate('" & Form!Calendario.Value & " " & Form!txtHora.Value & "'))),'C')" Form!selMedico.SetFocus Form!ListaCitas.Visible = False End If End Sub Buenos creo que para empezar a trabajar ya tienes... Yo seguramente hasta el lunes no podré seguir con esto. Cuando tengamos claro el formulario Citas, haremos otro para bloquear Ausencias, Permisos y Vacaciones. Me cuentas.
Muchas gracias ángeles, trabajare con esto que me diste el fin de semana y te cuento el lunes como me fue, cualquier cosa te aviso, oye por si las dudas te parecería si intercambiamos correo. Bueno hasta pronto bonito fin de semana Atentamente Adrian Morales
Hola ángeles Buen inicio de Semana Te comento ya cheque el código que me enviaste y funciona bien, solo tengo algunas dudas, ademas a querer ingresar otra fecha a la agenda del medico, manda un error, que dice que no se pudo guardar el registro. Ahora me manda un error que dice así "Error de sintaxis en clausula FROM" Es en esta linea 'Seleccionamos en la tabla correspondiente (vTabla) los registros que tengan V o P (vacaciones o permiso) es decir los que tengan bloqueados la jornada entera vsql = "Select * from " & vTabla & " where FechaFin>cdate('" & Form!Calendario.Value & "') and (Motivo='V' or Motivo='P')" Set rs = db.OpenRecordset(vsql) No le cambie nada lo escribí tal y como me lo enviaste tu, espero tu respuesta y gracias por toda tu ayuda Atentamente Adrian Morales
Si quieres me das tú correo y te mando la BD en la que lo hice, de este modo podríamos hablar sobre una base. Te aconsejo que no copies y pegues, intenta hacerlo tú... es mejor saber pescar a que te den un pez.
Hola Ok ángeles tienes razón, pero coo estoy apurado se me hizo más fácil, te mando mi correo te parece es: [email protected] Gracias por todo y disculpa, ya que este más desestresado con esta base de datos, podre analizare cada linea del código, para verificar bien todo el proceso Atentamente Adrian Morales
Ya te la he mandado.
Gracias Ya la checo, lo recibí pero el correo me lo bloqueo y no puedo abrirlo, intentare desbloquearlo Un saludo
Te la mando comprimida, siempre se me olvida y si no la mandas así suele dar problemas.
3 comentarios
Ocultar comentarios
Ante todo quería felicitaros porque me he quedado realmente impresionado, quizás el hecho de ser un verdadero novato influye bastante.. jajaja La cosa es que estoy intentando desarrollar un proyecto igual y quería saber si habría posibilidad de que me reenviarais el archivo a mi también... [email protected] Mil gracias! - Juan Carlos Mb
Hola, buenas noches, estoy trabajando en un proyecto similar me interesaría saber si me pueden pasar el archivo para trabajar en el mismo! Muchas Gracias - Ezequiel Dreessen
Buen día, estoy interesado en intercambiar opiniones con Ustedes acerca de este tema. Ojala y pudieran ayudarme! Saludos - rey_juarez09
Ante todo quería felicitaros porque me he quedado realmente impresionado, quizás el hecho de ser un verdadero novato influye bastante.. jajaja La cosa es que estoy intentando desarrollar un proyecto igual y quería saber si habría posibilidad de que me reenviarais el archivo a mi también... [email protected] Mil gracias! - Juan Carlos Mb
Hola, buenas noches, estoy trabajando en un proyecto similar me interesaría saber si me pueden pasar el archivo para trabajar en el mismo! Muchas Gracias - Ezequiel Dreessen
Buen día, estoy interesado en intercambiar opiniones con Ustedes acerca de este tema. Ojala y pudieran ayudarme! Saludos - rey_juarez09