Ayuda - Franjas Horarias


([N4] Ramon Denuc) #1

Hola Foro,

Llevo toda la semana peleándome con una función para controlar una franja horaria que no hay forma que me funcione correctamente.

Lo que se plantea: Un registro que contiene el campo [Fecha Visita], campo [Hora Inicio], campo tiempo en minutos de la [Duración Visita] y el campo [Hora Fin].

La necesidad: Cuando se crea una nueva visita el programa tiene que buscar si existe una visita con la misma fecha y dentro de esa franja horaria, para que se pueda informar al usuario de que ya existe una visita igual.

Lo que he montado: os lo adjunto como imagen.

Se aceptan sugerencias.

Saludos



([N1] wikan) #2

F9 y debug!!!

Veo condiciones como:

  • Si la fecha es distinta, no hay problema.
  • En el caso que la fecha sea la misma, debes verificar si la hora de inicio de la nueva cita que quieres introducir se encuentra dentro de la franja horaria. Yo para estos casos para hacerlo mas legible, paso los tiempos a enteros( milisegundos )

if (( hora_cita_nueva_ini < hora_cita_fin ) | ( hora_cita_nueva_ini > hora_cita_ini )) // Estás dentro de la franja.

Básicamente pasa los tiempos a milisegundos y comprueba si la hora inicial de la cita que quieres introducir se encuentra dentro del inicio y fin de la ya guardarda.


([N3] synetic) #3

Otra opción:
Como la fecha es la misma el problema lo tienes en las horas.
Creas tres índices, fecha, hora inicio y hora fin. Todos acepta repetidas.

Ahora creas una búsqueda. Todos los componentes cruzar.

  • Componente 1. Indice Fecha. Parte izquierda = Fecha visita.
  • Componente 2. Índice hora de inicio. Entre límites. Limite inicial = Hora nueva visita. Límite final = settime(23,59,59)
  • Componente 3. Índice hora de fin. Entre límites. Límite inicial = settime(00,00,00). Límite final = Hora nueva visita.

Si la búsqueda te devuelve registros es que hay visitas en esa franja horaria. Con esto controlas la hora de inicio que esté libre, lo mismo podrías hacer si quieres controlar la hora de finalización. Está escrito del tirón sin probar pero espero que te oriente.
Un saludo.


([N3] pacosatu) #4

Hola Ramon.

Te propongo otro diseño de la tabla aprovechando la potencia de Velneo con los Índices.

  • El objetivo sería establecer un mecanismo instantáneo para detectar franjas ocupadas en lugar de tener que recorrer o filtrar las listas buscando que esté o no en la franja horaria.
  • Para ello debes establecer un criterio, por ejemplo que las franjas horarias vayan en saltos de 15 minutos y con valores de 00, 15, 30 y 45.
  • Dadas una Hora inicial y la duración de la Visita debes crear una función FUN_GENERAR_FRANJA() que devuelva un String con los Saltos ocupados. Por ejemplo:
    Hora inicial = 18.00, Duración = 90 minutos -> Resultado = “1800 1815 1830 1845 1900 1915”
  • Creas un campo en la tabla que se llame FRANJA_HORARIA cuyo Valor inicial es la función FUN_GENERAR_FRANJA()
  • Ahora solo tienes que Indexar por palabras el campo FRANJA_HORARIA y tendrás una Búsqueda instantánea de Franjas Horarias introduciendo la Fecha y cualquier Hora expresada en saltos de 15 minutos.
    Así por ejemplo: buscando por la fecha 20/03/2015 y por la palabra 1815 nos devolverá que ya existe un registro con esos datos.
  • Observa que en la cita de Ejemplo no he puesto al final 1930 para permitir que una cita empieze justo cuando acaba la anterior.
  • Lo normal será buscar solo la Hora inicial. Pero para contemplar todos los casos debes buscar todos los saltos dentro de la cita solicitada para asegurarte que la cita solicitada no se solapa con otra ya existente:
    Por ejemplo: Nueva cita: Hora inicial = 17.30, Duración = 60 minutos Si la hora inicial está libre deberemos comprobar también que los saltos 1745, 1800 y 1815 estén libres para no solapar con otra cita posterior.

Son índices, por lo que las búsquedas son inmediatas.

Algo improvisado pero pruébalo y nos cuentas.
Saludos
Paco Satué


([N4] victorgt) #5

Yo uso una funcion para esto. Quiza sea un poco “pesada” pero es muy practica.

La adjunto en imagen.

Saludos.



([N4] Ramon Denuc) #6

Hola,

Muchas gracias a todos,

Ya tengo trabajo para saber cual de las cinco sugerencias es la que mejor se adapta al código que ya tengo escrito, si es posible, claro.

Eso si, si consigo que esto funcione como a mi me gustaría, pondré el resultado.

Saludos,


([N4] Ramon Denuc) #7

Disculpar, pero después de estar mas de 24 horas con este tema y no conseguir ningún resultado satisfactorio y que fuese seguro, me he dado por convencido, y reconozco que no entiendo bien el comando de Búsqueda.

Primero, he estado mirando y adaptando el comentario de Manuel, osea ser, me pasado las horas a milisegundos según su ejemplo y no he conseguido el resultado esperado.

Segundo, seguidamente he cogido el ejemplo de Synetic, hacer tres Indices con sus respectivos campos indexados, y he montado la búsqueda, resultado, nada de nada.

Tercero, me he mirado el ejemplo de Paco, pero tengo poco tiempo para ponerme a cambiar todo el sistema que ya tengo montado, y he pensado que lo dejo, por el simple echo de no tener tiempo para ajustarme a su sugerencia.

Cuarto, por ultimo me he mirado la sugerencia de VictorGT, pero no se adapta en nada a lo que yo tengo y lo he descartado automáticamente.

En fin, que estoy peor que el otro día, pues el tiempo se me esta echando encima y todavía no tengo resuelto este problema.

Muchas gracias a los cuatro por vuestro tiempo, de verdad, pero no lo he conseguido.

No pensaba que utilizar el comando Búsqueda(), para realizar un búsqueda de registros que me devuelva cuantos registros están dentro de una franja horaria, como por ejemplo las 12:00 y las 12:30, fuese tan difícil.

Os dejo una imagen de la tabla de las Franjas Horarias y el código que utilizo para buscar dichas franjas horarias.

Sigo admitiendo sugerencias.

Saludos,




([N1] Manuel) #8

Buneas, yo en la función que te envío lo que conseguio es saber cuanto tiempo juega un jugador con el resto de compañeros. Creo que te sirve perfectamente. Le mando por funcion las cuatro horas.

Si tienes cualquier duda comenta.

Gracias.



([N2] Mgalvezh) #9

Hola, si he entendido bien, es una agenda médica, si es eso, (aparte del aporte de Paco, muy ingenioso) yo crearía una agenda anual por médico, en la tabla del médico tendrás los horarios, la duración de una consulta los días que trabaja, etc. en la agenda tendrás todos los días del año y todas las franjas horarias, algunas estarán ‘ocupadas’ algunas estarán ‘no trabaja’, algunas estarán ‘es fiesta’ y otras estarán ‘libres’, en fin con un índice de las libres encontraras las libres directamente, no lo he realizado pero creo que funcionará.

PD:Incluso podras enseñar una rejilla o un combo con los huecos libres.

Saludos.
Miguel.


([N3] synetic) #10

Hola Ramón,
he montado un .vin que creo soluciona lo que necesitas utilizando una búsqueda, como te decía en el mensaje anterior. Échale un vistazo y no te desanimes!
Atascos tenemos todos.

Un saludo.

FranjasHorarias.rar (3.15 KB)


([N4] Enrique) #11

Hola Ramón,

te adjunto este vin con una solución que creo se ajustará a tus necesidades. La clave esta en un par de indices (anteriores y posteriores) donde los mismos tienen como parte del indice la fecha junto a la “hora desde” y la “hora hasta” respectivamente.

Estos indices se utilizan en la búsqueda para crear un , algo que aprendemos en los primeros años del colegio, luego vemos en el secundario, luego en las carreras de sistemas como matemática I (funciones)… y siempre a esa altura nos preguntamos “para que diablos sirven estas cosas???”.

Bueno, sirven para este tipo de soluciones. La idea en este caso es usar la busqueda entre limites, siendo el componente de búsqueda ANTERIORES, la linea de tiempo que va entre la hora 00:00:00 y la hora HASTA en la FECHA pasada a la búsqueda. Mientras que el componente POSTERIORES va desde la hora DESDE hasta la hora 23:59:59 de la FECHA pasada. Al cruzar estos componentes obtenemos la intersección de los registros.

Seria algo como esto, para una FECHA dada:

Intersección

Siendo el retorno la lista de registros (************) que son los que intervienen en la intersección.

Espero que pueda ser de utilidad esta solución y no haber sido muy complicado en la explicación.

Saludos!

Enrique

citas.vin_.zip (3.34 KB)


([N4] Enrique) #12

No se porque pero no subio la imagen que pretendia mostrar con la intersección, aqui va como pdf por las dudas.

INTERSECCIÓN.pdf (19.8 KB)


([N4] Enrique) #13

Quizas algo mas detallada la idea, pero es la base de lo que comentaba synetic. Y eso, no te desanimes que en estos menesteres todos hemos tenido dolores de cabeza importantes!!

Saludos!


([N4] Ramon Denuc) #14

Hola Foro,

Voy a tener mucho trabajo, gracias a vuestro apoyo.

Me parece que voy a tener que pagar algunas cervezas.

Sin duda alguna cuando tenga solucionado el problema, pondré el resultado final para que en un futuro, si alguno de nosotros necesite alguna solución parecida, está le podrá ayudar.

Saludos,


([N3] pacosatu) #15

Hola Ramon.

Está claro que a veces nos liamos con lo más sencillo. La solución es siempre la misma, desconecta un rato, cambia de actividad y vuelve sobre el problema, ya verás como te preguntarás porqué no lo habias resuelto antes.

Está claro que las soluciones de synetic y Enrique son las más efectivas, por ser las más sencillas e inmediatas de implementar. Es cierto Enrique, matemáticas básicas.

¿A qué estás esperando?

Saludos
Paco Satué


([N4] Ramon Denuc) #16

Hola Foro,

Bueno, bueno el problema ya a sido solucionado y encima funciona la mar de bien, y además no he tenido que modificar nada de código, porque de las dos opciones que incluían en sus respectivos .VIN el que más se ajustaba a lo que ya tenia desarrollado era la opción de Enrique. Además en la entrada del foro puso una cosa que me llamo mucho la atención: “La clave esta en un par de indices (anteriores y posteriores) donde los mismos tienen como parte del indice la fecha junto a la “hora desde” y la “hora hasta” respectivamente.” y efectivamente hay esta la solución.

Después de revisar de arriba abajo las dos opciones (Synetic y Enrique) y ver que las dos solucionaban casi de la misma forma la verificación de interferencias en las franjas horarias, decidí por la de Enrique porque solo tuve que copiar su Búsqueda “INTERFERENCIAS” y crean una de nueva en mi aplicación, y como el código que yo ya tenia era compatible con la búsqueda funciono a la primera.

Daros de verdad las gracias a todos por vuestro interés y ayuda.
Un fuerte abrazo.



([N4] Enrique) #17

Hola Ramón,

bueno realmente una alegria leer que has podido solucionar el problema. Y si, como tu lo marcas con respecto a mi comentario sobre los índices, es que la escencia de Velneo está ahi mismo, en el proyecto de datos y sus características que lo hacen único. El código en programación esta muy bien, pero mucho mejor es definir reglas ya que son mas abstractas y permiten soluciones mas simples y robustas. Y si tenemos la herramienta que nos permite abstraernos de esta manera, esta todo dicho!.

Saludos y a las ordenes como siempre.