Ver Mensaje Individual
  #1  
Antiguo 01-09-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Reputación: 21
VRO Va por buen camino
Sacar habitaciones libres por dia - Problema consulta SQL-

Hola, me reincorporo al trabajo despues de las vacaciones
y no se será el sindrome post-vacacional ó que , que se me
ha atragantado una consulta.

Vereis estoy habciendo la gestión de un hotel y quiero hallar
las habitaciones libres por día y tipo de habitación para colocar
el resultado en el planning de ocupacion del hotel.

Para ello utilizo un procedimiento almacenado, ya que al ser
una consulta grande me parece mucho mas rapido, al hacer
la consulta directamente en Interbase 5 , tambien utilizo Delphi 6.
Para hallar las habitaciones libres utilizo 3 tablas,
1.- La Tabla habitacion que es donde guardo todas las habitaciones existentes en el hotel.
2.- La Tabla reserva, que es donde registro todas las reservas hechas por un cliente y que habitacion/es ha reservado.
3.- La Tabla estancia, que es donde guardo todas las estancias de los clientes, es decir, si el cliente ya está en el hotel la reserva pasa ha estancia.

Por lo tanto mi procedimiento almacenado queda de la siguiente forma:

Código:
SET TERM!!;
CREATE PROCEDURE LIBRES_TIPO (FI DATE, FF DATE)
 RETURNS(NUM INTEGER,TIPO VARCHAR(10))
AS
BEGIN

      FOR SELECT COUNT(DISTINCT(COD_HAB)),TIPO
      FROM HABITACION
      WHERE HABITACION.COD_HAB NOT IN
     (SELECT COD_HAB
      FROM ESTANCIA
      WHERE (((ESTANCIA.FECHAI>=:FI) AND
 (ESTANCIA.FECHAF<=:FF)) OR ((ESTANCIA.FECHAI<=:FI) 
AND ((ESTANCIA.FECHAF>=:FI) AND (ESTANCIA.FECHAF<=:FF))) 
OR (((ESTANCIA.FECHAI>=:FI) AND (ESTANCIA.FECHAI<=:FF)) 
AND (ESTANCIA.FECHAF>=:FF)) OR ((ESTANCIA.FECHAI<=:FI) 
AND (ESTANCIA.FECHAF>=:FF))))
     AND HABITACION.COD_HAB NOT IN
     (SELECT HAB_RESERVADA.COD_HAB
     FROM HAB_RESERVADA,RESERVA
     WHERE HAB_RESERVADA.COD_R=RESERVA.COD_R
     AND (((RESERVA.FECHAI>=:FI) AND 
(RESERVA.FECHAF<=:FF)) OR ((RESERVA.FECHAI<=:FI) 
AND ((RESERVA.FECHAF>=:FI) AND (RESERVA.FECHAF<=:FF)))
 OR (((RESERVA.FECHAI>=:FI) AND (RESERVA.FECHAI<=:FF)) 
AND (RESERVA.FECHAF>=:FF)) OR ((RESERVA.FECHAI<=:FI)
 AND (RESERVA.FECHAF>=:FF))))
     group by tipo
     INTO :NUM,:TIPO DO
       BEGIN
          SUSPEND;
       END
END!!
SET TERM;!!
De esta forma sólo saco el nº de habitaciones libres por
tipo que hay entre esas 2 fechas, que generalmente suele
ser un mes, por ejemplo: del FI = 01/08/05 y FF= 31/08/05.

Yo necesito que ademas de esto me lo saque por días, es decir,
que me saque el nº de habitaciones libres segun el tipo de
habitaciones que sea (INDIVIDUAL, DOBLE, SUITE...) por día
desde entre esta fecha fi y ff. Por ejemplo si cojo el mes de agosto
que me saque las habitaciones libres por tipo del día 1,2,3,4,5....
así hasta el día 31.

Lo he intentado con el Extract pero me da error.

Por favor si alguien puede ayudarme. Muchas gracias
por todo

Última edición por VRO fecha: 01-09-2005 a las 11:16:43.
Responder Con Cita