PDA

Ver la versión completa : SQL Habitaciones Libres



wico
17-06-2014, 12:44 AM
Buenas, estaba reflotando una vieja aplicacion que tenia tirada para hacer reservas y me gustaria hacer una consulta para saber los "huecos libres entre reservas", por ejemplo
Tengo 2 habitaciones las cuales (es un hotel alojamiento muy humilde :p )

1) 3 al 6 --- 10 Al 15 25 al 30
2) 20 al 23 y del 29 al 5 del proximo mes

Si le paso por ejemplo que quiero reservar la habitacion 1 del 7 al 9 me diga si puedo o no. Acualmente lo que hice en esa epoca fue buscar por fecha de cierre, Ej.

Where fechaFin >= FechaInicio and NroHab = 1 (si no hay nada devuelvo True y si hay algo False) pero claro uno de los tanto problemas que me genera a largo plaso es que si generas reservas aleatorias te empiezan a quedar esos buracos.

¿Alguna idea?

G4lle
17-06-2014, 01:58 AM
El razonamiento lógico es que las reservas sean aleatorias y que chequees disponibilidad al hacer una reserva.

No sé cómo tenes la BD, pero por como lo planteás sería así...

Si sabés de antemano cuántos son los días de reserva, te tendrías que fijar que coincidan las fechas salida (Reserva Existente) == fecha ingreso (Nueva Reserva) y fecha ingreso (Reserva Existente) == fecha salida (Reserva Nueva).
Eso para ocupar las habitaciones con los días exactos; sino cambiá los == por <= para encontrar habitaciones libres entre esos días.

Los hoteles funcionan así, van ocupando de acuerdo a disponibilidad, después podés hacer la clásica "te cambiamos de habitación" y listo, vas juntando los días, ahí armás un algoritmito para ir buscando habitaciones por cada día y listo.

Si es que no entendí cualquier cosa! :p

wico
17-06-2014, 01:40 PM
Esa es buena,
Pero pasas el doble trabajo porque tenes que estar moviendo los cliente de hab en hab sin mensionar si tenes habitaciones diferentes en capacidad ponele 4 matrimoniales 2 simples 3 matrimonias con cama extra.
Yo creo que lo ideal ideal seria buscar disponibilidad dependiendo de la cantidad de personas y fecha y que el sistema te tire las habitaciones disponibles bajo ese criterio, ahora ni puta idea como generar eso no soy muy ducho con el SQL (me sacan de lo basico y se me tranca la croqueta)

3 personas entre 10/06/2014 - 17/06/2014
----> Habitacion 1,2,3 libres
2 personas entre 15/06/2014 - 17/06/2014
----> Habitacion 4,5 libres

Se me ocurre algo asi

G4lle
17-06-2014, 01:56 PM
Pero lo único que tenés que hacer es agregar una condición más aparte de eso cantPersonas = X

X es la cantidad de personas que tenés vos, y cantPersonas es un campo de la tabla.
Por eso digo, no tengo idea de como diagramaste la BD.

wico
17-06-2014, 02:48 PM
Tabla Reservas
ResId, RoomId, CliId, ResPaid, ResStatus, ResStart, ResEnd, ResUserReserva,
ResUsercheckIN, ResUsercheckOUT, ResUseranulado, ResUserfactura, fac_id, resHoraCheckInn, resHoraCheckOut, ResCantPersonas

Tabla Habitaciones
RoomId, RoomName, RoomStatus, RoomSize, tar_id

burzuM
17-06-2014, 03:20 PM
Como dice G4lle sería lo más simple de hacer. Che esa BD está BIEN VAGA ajajja

wico
17-06-2014, 03:32 PM
Como dice G4lle sería lo más simple de hacer. Che esa BD está BIEN VAGA ajajja
Vaguiiiisima y debe tener como 8 años (era un pibe que recien salia del access)
La nueva sera mas prolija

G4lle
17-06-2014, 03:32 PM
Creo que en tu caso, algo así serviría...

SELECT Habitaciones.RoomId FROM Habitaciones
WHERE RoomSize = x and RoomId IN
(SELECT Reservas.RoomId FROM Reservas
WHERE
ResStatus = 1 and
FechaEntrada >= ResEnd and
HoraEntrada > resHoraCheckOut and
FechaSalida <= ResStart and
HoraSalida < resHoraCheckIn)

Supuse que:
ResStatus = 1 si la reserva aún está vigente
RoomSize cantidad de personas, y X es la cantidad de personas que tengas vos para la nueva reserva.

Creo q lo otro es bastante entendible

De todos modos, como dijo burzuM, está bastante flojita si!

Xcalibur
17-06-2014, 03:57 PM
Sería tan fácil si antes de pensar la solución programátil hicieran un análisis dibujeril...


Hacete un calendario y anotá en el lo que está reservado en cada fecha, desp. pensá las condicionantes para hacer la búsqueda/revisar.

wico
17-06-2014, 06:53 PM
En si el programa actual me trae todas las reservas y las tiro en un Grid

https://i.imgur.com/Yp3FTaf.jpg

Actualmente se tiene que hacer una a una mirando y seleccionando, la idea es automatizar el proceso y cargar varias reservas y que el sistema las genere

https://i.imgur.com/o4C8N5H.jpg
G4lle voy a probar luego esa consulta

G4lle
17-06-2014, 07:05 PM
Viendo eso y manteniendo lo básico que hay haría un formulario nuevo de consulta de disponibilidad de habitaciones con Fecha Entrada, Fecha Salida, Hora Entrada, Hora Salida y cantidad de Personas.

Usas tu consulta, o la que te puse ahí y vas a tener las habitaciones que están disponibles entre esas fechas y para esa cantidad de personas. Si querés y tenés pocas habitaciones en total podés hacer una grilla con varios botones (uno por cada habitación) que los ponés deshabilitados y de color rojo y cuando ejecutás tu consulta SQL, habilitás y ponés verde el botón. Y al darle al botón, vas al formulario de alta o como sea.

No sé, fue un divague ahí. Suerte con eso

wico
24-06-2014, 10:05 PM
Al final quedo asi:

SELECT RoomId, RoomSize, RoomName
FROM Room
WHERE (NOT (RoomId IN
(SELECT RoomId
FROM Reservation
WHERE (ReservationStatus > 1) AND ('10/06/2014' <= ReservationStart) AND ('30/06/2014' >= ReservationEnd) )))

Con eso alimento el combobox de las Habitaciones listando solamente las habitaciones que no tengan reservas en ese rango, hice unos cambios en la base de datos y me faltan miles pero por lo menos queria dejar esto andando para seguir..
Gurisada Gracias por la mano!!