PDA

Ver la Versión Completa : fechas en reservas


anubis
15-05-2007, 19:38:02
Tengo un problemilla de diseño a ver si me iluminais un poquito dado que teneis mucha mas experiencia. Estoy haciendo una aplicacion para un hotel y una de las partes es de reservas de habitaciones segun fechas pero tengo el problema que no se como se puede manejar esto de manera eficiente, nose si se habria que usar la fecha de reserva de entrada y la de salida de la habitacion y compararlas una a una con el resto de reservas y con las habitaciones a fin de displayar las habitaciones libres en esas fechas, pero nos e si esto es asi o habria otra forma.

gracias

Caral
15-05-2007, 22:16:52
Hola anubis
Siempre hay muchas maneras de hacer las cosas, todo depende de que tan complicado se quiera o el tiempo que se quiera invertir en el asunto.
Para mi, la fecha de reserva debe ser solo un dato, las que valen son la entrada y salida, que es cuando la habitación no se puede usar o rentar de nuevo.
Yo haría una especie de mapa, tipo calendario y con las habitaciones incluidas, cambiaría el color de la habitación si esta ocupada o no, asi visualmente me enteraría del estado general del hotel.
Saludos

Delphius
15-05-2007, 22:34:47
No se si debe a que llevo tiempo frente la PC... pero me está costando entender el sentido de la pregunta:

anubis, ¿Te refieres a la parte lógica, como llevar a cabo la distinción de entre libre/ocupado? ¿O por el ontrario... te refieres al aspecto visual?
Es decir: ¿Diseño lógico o diseño de interfaz?

Si te refieres a la lógica:
¿Como está diseñada tu tabla?
Que estás guardando?

Yo lo veo así: Mantener en una tabla, tal vez llamada reservas. Otra tabla habitación. Entre ellas veo una relación 1-M: una habitación tiene muchas reservas.
Bueno, en la tabla reserva tendría un campo FechaReserva, FechaEntrada y un campo CantidadNoches.
Este último campo es un entero... y lo que guardará es la cantidad de noches que estará reservada.

La fecha de salida se obtiene haciendo simplemente sumando la cantidad de noches a la fecha de entrada. No tiene sentido (a mi modo de ver) guardar un dato que puede ser calculado (al menos que desees llevar un historial)


Tendrías que lanzar ahora una simple consulta que busque aquellas habitaciones que no tenga asociado alguna reserva en en rango de días entre la fecha de reserva y la cantidad de dias...

No se si se entiende la idea...
Y si estoy equivocado me avisan por favor.

Saludos,

egostar
15-05-2007, 23:34:07
Hola anubis

Me imagino que el sistema que estas haciendo es para un hotel digamos pequeño ya que lo que los hoteles "grandes" generan reservas por tipo de habitación y no por ujna habitación específica.

Imagino también que estas usando un "rack" de habitaciones para que visualmente se vea el status de la habitación, yo recomedaría que tu rack tenga colores para identificar ese estado por habitación/dia.

Aquí (http://img79.imageshack.us/img79/6739/recepciongu8.png) te muestro una imagen de un sistema que hice y tal vez te de una idea.

Por otro lado, te recomiendo que uses los componente TMS Planner (http://www.tmssoftware.com/dbplanner.htm), que es con lo que estoy migrando este sistema y me está dando muy buenos resultados.

Salud OS.

anubis
16-05-2007, 03:01:23
Gracias, lo del rack si esta hecho.Tengo la pantalla principal que contiene tantos botones como habitaciones. Cuando la habitacion esta desocupada no se puede clickar, si viene un cliente, se le da de alta y se muestra en pantalla las habitaciones disponibles, se clika en un de ellas y aparece en la habitacion, el nombre del cliente en curso, la fecha actual(porque se esta dando de alta) la fecha de salida y los dias, debajo figuran las fechas tantas como dias va a estar el cliente.
Tal y como lo tiene egostar esta bien con el planning, asi puedes ver visualmente lo que hay libre, pero yo preguntaba otro metodo.
La idea era que si un cliente quiere reservar una habitacion, el sistema diria para esas fechas que habitaciones estan libres, tal y como va en internet cuando haces una reserva. Lo que nose es si seria normal rastrear para esas fechas de reserva, cada habitacion por si esta libre en esas fechas o no. Me lo veo complicado no?.

mis tablas son, a grandes rasgos, porque todavia no estan acabadas:

clientes
codcliente,nombre, apellidos, domicilio....
habitacion
codhabitacion,codcliente,fecha entrada, fecha salida,estado(ocupada o no ocupada)
reservas
codreserva,codhabitacion,codcliente,fecha entrada, fecha salida


mas que nada para que el sistema muestre las habitaciones que, para esos dias, van quedando.

gracias por vuestra paciencia

Delphius
16-05-2007, 05:11:06
Lo que nose es si seria normal rastrear para esas fechas de reserva, cada habitacion por si esta libre en esas fechas o no. Me lo veo complicado no?.

ummmm... un poco.

Yo lo estaba pesando en algo como una consulta SQL al estilo:

selcciona info_habitacion
desde tabla_habitacion
que NO tenga relacion con tabla_reserva
Lo que me está costando es traducir la parte "NO tenga relacion"

Ahora con respecto a tus tablas debo decirte que debes hacerle una limpieza ya que hay información duplicada. La tabla Habitación no tiene porqué tener registrado las fechas... ya que esta información está disponible en la tabla Reservas. Además, en la tabla reserva debes colocar la fecha de reserva.
Y como dije en el post anterior, no veo sentido guardar la fecha de salida si esta puede calcularse mediante la suma de los dias a la fecha de entrada.

Por ahora, esto es donde creo que puedo darte alguna idea...

Saludos,

anubis
16-05-2007, 05:51:41
gracias delphius.
La cuestion de almacenar tambien la fecha de entrada y la de salida o bien la fecha de entrada y los dias de estancia en la habitacion me sirve para tener registro de todas las habitaciones, la tabla reserva esta relacionada con las futuras reservas, pero como dices quiza parezca complicado, pero creo que se necesitan esas fechas no?

Lepe
16-05-2007, 12:06:07
Lo que me está costando es traducir la parte "NO tenga relacion"


Una consulta (aunque no muy eficiente por aquello del IN) sería:


select codhabitacion
from habitacion
where codhabitacion not in
( select codhabitacion from reservas
where fechaentrada between :fini and :ffin)
and estado = 'libre'
Dado un periodo de fechas, mostraría las habitaciones libres y sin reservas previas.

Saludos

Delphius
16-05-2007, 20:42:33
Muchas gracias Lepe por refrezcarme la memoria. Me había olvidado de la sentencia IN. De que se necesitaba dos select eso lo tenía claro.

Tengo que reconocer que no sabía que la sentencia IN sea ineficiente. Pero si es que no son muchos los registros con que maneja anubis, no creo que sea tan afectado.

Ahora, tengo una duda. ¿No debería compararse también con la fecha de reserva? Porque por lo que tengo entendido, cuando uno solicita una reserva es cuando se debe determinar cuales están libres:

select codhabitacion
from habitacion
where codhabitacion not in
( select codhabitacion from reservas
where (fechaentrada between :fini and :ffin)
and fechareserva <= :ahora)
and estado = 'libre'

El :ahora se trataría de la fecha actual (pasada como parámetro). Lo que yo ando considerando es que no sólo se restrinja a un rango sino que no haya una reserva previa a las fechas.
No se.. en una de esas estoy confundido.
Y el tema me está interesando... y me dejó "picando".

Al igual que anubis, voy a ver cuales son las opciones... creo y considero que yo también necesito aprender.

Saludos,

Lepe
17-05-2007, 00:51:00
para la fecha actual, que mejor que pedirla al servidor con "Getdate()" (según he visto para MySql y con CURRENT_DATE para Firebird.


select getdate() from una_tabla_cualquiera

o bien
where fecha between GetDate() -1 and GetDate()
Eso si habría que probarlo, intuyo que se le puede restar un día por la cara.... pero no lo puedo afirmar.

Por supuesto la sql que puse era una "prueba" y quizás tenga más restricciones, cuantas más mejor, porque así quedará menos registros para incluir con el operador IN

Otros compañeros han demostrado que la cláusula IN se puede evitar creando la consulta de otra forma... personalmente reconozco que es más intuitivo el operador IN y siempre se me viene a la mente. Si alguien sabe evitarlo, bienvenida sea la respuesta.

Saludos

anubis
17-05-2007, 05:31:12
os lo agradezco, voy a intentar probar esos inventos ;)