[ Foro de PHP ]

ayuda con ejercicio horario

28-Jun-2013 00:23
Invitado (ruben ruiz)
3 Respuestas

Hola saludos desde paraguay.

queria preguntar sobre un ejercicio que deseo realizar y se trata de realizar un horario de lunes a viernes de las 12 horas a las 24.

mis dudas y preguntas profesor:
la idea es que se me almacene en una base de datos las franjas horarias( 1 , 2 o mas horas) en dos dias como maximo permitido a cada usuario. es decir un usuario puede tener franja horaria en dos dias como maximo, asi a juan podria asignarle el lunes de 12 a 14 horas y el miercoles de 15 a 16 horas, visualizandose en la pagina web dicho horario con esas franjas ya ocupadas en una tabla de html, mi idea es para cada uno de los usuarios recorrer de lunes a domingo para ver si la franja solicitada por el usuario esta disponible( y en su caso asignarla) o ocupada, el problema que noto en mi idea es que con cada usuario tengo que volver a empezar de cero es decir desde el lunes a las 12 horas y asi sucesivamente con todos, me podrias profesor indicar una forma quiza mas optimizable? se que mi duda es mas de logica que de programacion pero es importante para mi recibir propuestas mejores que la mia o si es la unica forma en que podria hacerlo segun mi idea? agradezco inmensamente este espacio y cualquier orientacion que puedan brindarme, sin antes agradecer de antemano su atencion.


29-Jun-2013 10:39
Nacho Cabanes (+32)

Quizá la forma más sencilla de plantearlo sea almacenar día y hora para "tarea".

Por ejemplo, si el usuario con código 10 tiene la tarea "programar", los lunes (día 1) a las dos de la tarde (hora 14), en tu base de datos guardarías esos cuatro valores:

 
INSERT INTO tareas (usuario, dia, hora, tarea) VALUES (10, 1, 14, "programar")
 


Si alguien tiene una franja de dos o más horas, lo puedes almacenar como si se tratara de varias franjas de una hora. Esto hace que ocupe algo más de espacio que usar otras alternativas, pero a cambio es muy fácil comprobar si una franja ya está ocupada, no sea que la vuelvas a reservar para otra persona. Por ejemplo, en el caso anterior, si ese usuario tiene una franja de dos horas, harías:

 
INSERT INTO tareas (usuario, dia, hora, tarea) VALUES (10, 1, 14, "programar")
INSERT INTO tareas (usuario, dia, hora, tarea) VALUES (10, 1, 15, "programar")
 


Así, si alguien quiere reservar la franja de las 15 horas, es inmediato ver que está ocupado, y no sería igual de fácil si lo hubieras almacenado como "una franja de 2 horas que empieza en las 14 horas" (tampoco es mucho más difícil, pero comienza por buscar soluciones fáciles y ya las optimizarás después).


30-Jun-2013 00:52
Invitado (ruben ruiz)

hola profesor.
Gracias por tu respuesta, me ha quedado entendido lo de hacer en la base de datos, queria preguntarte acerca de la parte de hacer en php, respecto a como podria hacer para cuando un usuario pida hora o franja de horas, la idea es que tengo la tabla realizada en html, pero no se si la unica forma sea la de por cada usuario debo recorrer dicha tabla desde el inicio, es decir iniciando desde el lunes a las 12 horas y hasta recorrer toda la tabla para indicarle a dicho usuario si en esa hora o franja de horas que solicita hay disponibilidad,hay alguna forma de hacerlo distinto a mi analisis? a mi se me ha ocurrido que podria adicionar a la base de datos adicional a lo que me planteaste, de tener una hora final y una hora inicial, con el objetivo de poder saber que celda o celdas dentro de la tabla html debo marcar como ocupada(s) segun sea la franja solicitada por el usuario a traves de una variable $i, porejemplo que $i=hf-hi,( y hacer si porejemplo esta $i vale dos entonces en el rowspan=$i y asi tomar de la tabla dos celdas) y devolver este valor a traves de una funcion a otra funcion que sea la de rellenar los datos de asignada(s) segun sea la cantidad de horas.
te pido el favor me ayudes desde tu punto de vista profesional a cual seria la mejor opcion a tomar y que ojala en tu idea puedas plasmarmelo en seudocodigo, quedo muy agradecido por tu ayuda profesor.


30-Jun-2013 13:14
Nacho Cabanes (+32)

Céntrate primero en descomponer el problema, en pensar cómo va a ser la lógica de tu programa, cómo se va a comportar, porque creo que todavía no lo has meditado mucho.

El hacer un "rowspan" es algo puramente estético, no tiene que ver con la lógica del programa: el programa se comportaría igual (aunque quizá fuese un poco menos vistoso) si dos filas que pertenecen a un mismo usuario se ven separadas por una línea.

Primero piensa cómo hacer que funcione, y una vez que lo consigas, analiza qué mejoras podrías hacer, ya sea de estética o de rendimiento.

Por ejemplo, para ver si una franja está ocupada o no, no necesitas mirar nada en la tabla HTML, toda esa información te la da la base de datos, y no necesitas recorrer nada: haces un "SELECT" que te devuelva la información que hay a esa hora; si no hay datos, sabes que puedes guardar.

Pero insisto: primero piensa qué debe hacer el programa en qué orden, luego hazlo de la forma más sencilla que se te ocurra, y finalmente lo optimizas.

Por ejemplo, podría ser un:

- Mostrar ocupación de horarios.
- Pedir día y hora al usuario.
- Si está ocupado, avisar y volver al primer paso.
- Si no está ocupado, guardar y volver al primer paso.

Y en una primera aproximación, podrías mostrar los horarios sin usar ni siquiera un TABLE de HTML, sino escribir todos los datos, uno tras otro. Cuando TODO funcione bien, ya lo adaptarás usando una tabla.

De igual modo, podrías pedir los datos usando casillas de texto, y cuando funcione TODO bien lo mejorarás con listas desplegables que sólo muestren las franjas que realmente están disponibles, o haciendo clic en las casillas de la tabla.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)