Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 1 de 18
Enunciado
La trascripción que aparece a continuación corresponde a una entrevista con una emprendedora que quiere crear una empresa de gestión de alquileres de apartamentos turísticos. Pregunta: Bien, ¿qué necesita que haga el portal web a desarrollar? Respuesta: Bueno, por un lado permitir que los usuarios con alojamientos disponibles los puedan publicar y, por otro lado, que los usuarios que busquen alquilar un alojamiento los puedan buscar por una determinada zona (Costa de la Luz, Costa del Sol, etc.), ver las fotos y solicitar una reserva. P: Muy bien, empecemos por los apartamentos. R: Hablemos mejor de alojamientos, no todos son apartamentos, también hay casas rurales y otros tipos distintos. P: ¿Pero se tratan todos de la misma forma? R: Sí, para nosotros son iguales. P: Bien, pues dígame que información quiere guardar de los alojamientos. R: Pues la dirección, sus características y muchas fotos. P: ¿Cuáles son las características? R: Pues el número de dormitorios, el número de baños, la ocupación máxima y si tiene aire acondicionado, wifi, piscina y garaje. Y quien es el propietario, claro. Ah, y la zona turística en la que se encuentra, como le dije antes. P: Muy bien, y ¿qué información necesita de los usuarios? R: Bueno, de los usuarios necesito el DNI, nombre y apellidos, correo electrónico, una contraseña para acceder, una dirección y un teléfono de contacto. P: ¿Considera usuarios tanto a los propietarios como a los que solicitan reservas? R: Sí, porque los propietarios también pueden reservar. Simplemente, si un usuario es propietario, al entrar al portal podrá gestionar sus alojamientos y hacer reservas. Si no tiene alojamientos, sólo podrá hacer reservas. P: Muy bien, hábleme de las reservas. R: Bueno, una reserva la hace un usuario sobre un alojamiento, con una fecha de check-in y una fecha de check-out. P: ¿Check-in, check-out? R: Sí, entrada y salida, es como se suele hablar en este sector, ¿sabe? P: OK, fecha de check-in y fecha de check-out. R: Eso es, tenga en cuenta que el mismo día de check-out se puede hacer un check-in de otra reserva, pero no puede haber más solape de reservas que ese. P: ¿Me lo puede explicar? R: Sí claro, dos reservas de un mismo alojamiento no se pueden solapar salvo en el día de check-out de una y el de check-in de la siguiente. P: Lo entiendo, debemos controlar el solape de reservas. ¿Algo más sobre reservas? R: Bueno, si la reserva se confirma por parte del propietario y el usuario, me gustaría que el usuario pudiera añadir comentarios con una valoración. P: ¿Qué tipo de valoración? R: Por el momento me vale una de esas de estrellitas, de una a cinco estrellas, ¿sabe de qué le hablo? P: Sí, de acuerdo, una valoración de 1 a 5 que se visualiza como estrellas.
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 2 de 18
R: Eso es. P: ¿Más funcionalidades que necesite del portal? R: Quedan muchos más temas por tratar, como la disponibilidad, la gestión de los pagos, etc., pero para una primera versión creo que puede ser suficiente. P: De acuerdo, seguiremos avanzado más adelante.
Contenido 1. Introducción ................................................................................................................. 3
2. Glosario de términos .................................................................................................... 3
3. Catálogo de requisitos .................................................................................................. 4
3.1. Mapa de historias de usuario .................................................................................................. 4
3.2. Requisitos de información ....................................................................................................... 4
3.3. Reglas de negocio .................................................................................................................... 5
3.4. Requisitos funcionales ............................................................................................................. 5
3.5. Pruebas de aceptación de reglas de negocio .......................................................................... 6
4. Modelo conceptual ....................................................................................................... 7
4.1. Diagrama de clases UML ......................................................................................................... 7
4.2. Escenarios ................................................................................................................................ 8
4.3. Matriz de trazabilidad Requisitos/Artefactos del Modelo Conceptual ................................... 9
5. Modelo Tecnológico ..................................................................................................... 9
5.1. Modelo relacional en 3FN ....................................................................................................... 9
5.2. Matriz de trazabilidad Artefactos del Modelo Conceptual/Tecnológico .............................. 12
5.3. Esquema ORACLE .................................................................................................................. 13
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 3 de 18
1. Introducción La empresa de gestión de alquileres de apartamentos turísticos tiene por objetivo crear un espacio común
entre los usuarios que ofertan alojamientos para alquilar y los demandantes de alquileres.
Al ser una empresa nueva creación no dispone de ningún software para llevar a cabo su trabajo.
En este documento se presenta un ejemplo ilustrativo de documentación de tres modelos del ciclo de vida
de desarrollo del software: Catálogo de Requisitos, Modelo Conceptual, Modelo Tecnológico.
2. Glosario de términos Término Descripción
Alojamiento Inmueble disponible para ser reservado.
Fecha de check-in Fecha inicial de la reserva.
Fecha de check-out Fecha final de la reserva.
Reserva Petición de un alojamiento concreto para un intervalo de fechas.
Catálogo
de Requisitos
Modelo
Conceptual
Modelo
Tecnológico
TRACE TRACE
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 4 de 18
3. Catálogo de requisitos
3.1. Mapa de historias de usuario
Figura 1: Mapa de historias de usuario
3.2. Requisitos de información
RI-1.1: Información sobre alojamientos: Como: Gestor de la empresa. Quiero: Conocer las características del alojamiento como número de dormitorios, número de baños, ocupación máxima posible, disponibilidad de aire acondicionado, wifi, garaje y piscina. Además se guardará su propietario, zona donde está situado y una o más fotografías de dicho alojamiento de las que quiero conocer su localización (path) y tipo. Para que: Los usuarios, al hacer las reservas, puedan conocer sus características y filtrar por distintos criterios.
RI-3.1: Información sobre reservas: Quiero: Conocer el intervalo de fechas reservado (fecha de check-in y fecha de check-out), el alojamiento reservado y el usuario que hace la reserva. Así mismo, se almacenará la opinión de los usuarios y su valoración.
RI-7.1: Información sobre propietarios y usuarios: Quiero: Conocer el Dni, nombre, apellidos, correo, contraseña, dirección y teléfono de los usuarios.
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 5 de 18
3.3. Reglas de negocio
RN-3.6: Fechas solapadas Quiero que: Para un mismo alojamiento, no pueda haber dos reservas con intervalos de fechas de
reservas solapadas, salvo la fecha de check-in y check-out.
RN-3.7: Duración reserva Quiero que: En cada reserva, la fecha de check-out sea al menos un día posterior a la fecha check-in.
RN-3.8: Propietario reserva Quiero que: Un usuario no pueda reservar un alojamiento del que es propietario.
3.4. Requisitos funcionales
RF-1.2: Consultas de alojamientos sin ocupar
Como: Gestor de la empresa. Quiero: Conocer los alojamientos que no están reservados para la fecha actual o para una fecha concreta. Para: Realizar labores de mantenimiento.
RF-1.3: Registrar nuevos alojamientos
Como: Gestor de la empresa, usuario propietario. Quiero: Poder registrar nuevos alojamientos junto con sus fotos, propietarios y zonas donde están ubicados. Para que: Puedan ser reservados.
RF-1.4: Añadir nuevas fotos
Como: Usuario propietario. Quiero: Poder añadir nuevas fotos de los alojamientos de los que soy propietario. Para: Dar a conocer mis alojamientos y aumentar las reservas.
RF-3.2: Consultas de Reservas Como: Gestor de la empresa Quiero: Poder consultar las reservas por diferentes criterios como fechas, zonas, propietarios, etc. Para: Conocer las preferencias de los usuarios
RF-3.3: Registrar nuevas reservas
Como: Gestor de la empresa Quiero: Facilitar la realización de reservas sobre alojamientos. Para: Mejorar y controlar mi negocio.
RF-3.4: Anular o cambiar una reserva Como: Usuario Quiero: Poder modificar o anular las reservas realizadas.
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 6 de 18
RF-3.5: Hacer un comentario
Como: Gestor de la empresa, usuario Quiero: Guardar la opinión de los usuarios sobre los alojamientos reservados Para: Mejorar el servicio.
RF-6.1: Consultas de alojamientos más reservados
Como: Gestor de la empresa Quiero: Dado un intervalo de fechas, conocer los alojamientos que tienen más reservas Para: Saber qué alojamientos son más rentables.
RF-7.2: Registro de nuevos usuarios Como: Gestor de la empresa Quiero: Registrar propietarios y usuarios que consulten y/o realicen reservan sobre los alojamientos disponibles. Para: Facilitar el acceso de los usuarios al sistema.
3.5. Pruebas de aceptación de reglas de negocio
RN-3.6: Fechas solapadas
- Se registra una primera reserva para un intervalo dado.
- Se intenta registra una segunda reserva para un intervalo solapado con el anterior y da error.
- Se registra una nueva reserva para un intervalo que no solape y es correcto. RN-3.7: Duración de la reserva
- Se intenta registra una reserva con la misma fecha de salida y de entrada y da error. RN-3.8: Propietario reserva
- Se intenta registra una reserva sobre un alojamiento para el usuario propietario de dicho
alojamiento y da error.
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 7 de 18
4. Modelo conceptual
4.1. Diagrama de clases UML
Figura 2: Modelo conceptual
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 8 de 18
4.2. Escenarios
Figura 3: Escenario de dos alojamientos localizados en la misma zona junto con sus propietarios y fotos.
Figura 4: Escenario de dos alojamientos, uno de ellos con dos reservas y otro con una. Dos de las reservas son de un mismo usuario
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 9 de 18
4.3. Matriz de trazabilidad Requisitos/Artefactos del Modelo Conceptual
Requisitos
Modelo Conceptual R
I-1
.1
RI-
3.1
RI-
7.1
RN
-3.6
RN
-3.7
RN
-3.8
RF-
1.2
RF-
1.3
RF-
1.4
RF-
3.2
RF-
3.3
RF-
3.4
RF-
3.5
RF-
6.1
RF-
7.2
Ele
me
nto
s M
od
elo
Co
nce
ptu
al
Cla
ses
Zona
Alojamiento
Usuario
Foto
Reserva
Comentario
Aso
ciac
ion
es
esPropietarioDe
seEncuentraEn
reserva
tieneReserva
tieneFoto
comenta
Re
stri
ccio
ne
s
RN-3.6
RN-3.7
RN-3.8
5. Modelo Tecnológico
5.1. Modelo relacional en 3FN
Las figuras 5 y 6 representan el esquema relacional derivado del esquema conceptual mediante
la aplicación de la heurísticas de transformación Conceptual (UML) Relacional (La Fig. 5, el
esquema relacional independiente del SGBD, y la Fig. 6 el esquema relacional propietario
generado con SQL Developer en el caso ORACLE). Se ponen como notas las reglas de negocio
que no pueden definirse estructuralmente y que requieren código adicional (cláusulas en
CREATE TABLE y Triggers) ORACLE.
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 10 de 18
Tabla 1. Esquema relacional
PK AK FK Zonas (IdZona, nombre) IdZona nombre(*)
Usuarios ( IdUsuario, dni, nombre, apellidos, correo, contraseña, dirección, teléfono)
IdUsuario dni
Alojamientos (IdAlojamiento, dirección, num_dormitorios, num_baños, ocu_máxima, aire_acondicionado, wifi, piscina, garaje, IdZona, IdPropietario)
IdAlojamiento dirección IdZona/Zonas, IdPropietario/Usuarios
Fotos (IdFoto, pathf, tipo, IdAlojamiento ) IdFoto IdAlojamiento / Alojamientos
Reservas (IdReserva, fecha_check_in, fecha_check_out, IdAlojamiento, IdUsuario)
IdReserva IdAlojamiento / Alojamientos IdUsuario / Usuarios
Comentarios (IdComentario, texto, valoración, IdReserva) IdComentario IdReserva/ Reservas
(*) Es razonable asumir que los nombres serán únicos
Figura 5: Diagrama relacional (equivalente a la tabla 2)
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 11 de 18
Figura 6: Diagrama relacional generado en Oracle SQL Developer (equivalente a la Fig. 5 y Tabla 2)
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 12 de 18
5.2. Matriz de trazabilidad Artefactos del Modelo Conceptual/Tecnológico
Modelo Conceptual Modelo Relacional
Clase Asociación Restricción
Zon
a
Alo
jam
ien
to
Usu
ario
Foto
Re
serv
a
Co
me
nta
rio
esP
rop
ieta
rio
De
seEn
cuen
traE
n
rese
rva
tie
ne
Re
serv
a
tie
ne
Foto
com
en
ta
RN
-3.6
RN
-3.7
RN
-3.8
Tab
la
Zonas
Alojamientos
Usuarios
Fotos
Reservas
Comentarios
Ch
eck
Fechas_Reserva
Trig
ger ReservasPropietario
FechasReservas
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 13 de 18
5.3. Esquema ORACLE
El código PL/SQL ORACLE se ha estructurado en cuatro scripts:
- 0-CleanUp.sql
o Crea el procedimiento Clean_Up que borra, en caso de que ya existan, las tablas y
secuencias.
- 1-Crea.sql
o Ejecuta el procedimiento anterior.
o Crea las tablas. Para cada tabla creada:
Crea una secuencia
Crea un trigger que utilizando la secuencia anterior generará clave primaria
de dicha tabla.
o Crea los triggers necesarios para especificar las reglas de negocio que no han podido
ser definidas como check en la creación de tablas:
Trigger para impedir que el usuario reserve sus alojamientos
Trigger para impedir fechas solapadas
o Crea los procedimientos:
Procedimiento para insertar reservas
Procedimiento para presentar los tres alojamientos con más reservas en un
intervalo de fechas dado.
- 2-Inserta.sql
o Poblado de tablas a partir de los datos presentados en los escenarios mediante:
Comando Insert
Procedimiento para insertar reservas
- 3-Consultas.sql
o Consultas sobre las tablas.
o Consulta en bloque anónimo
o Llamada al procedimiento para presentar los tres alojamientos con más reservas en
un intervalo de fechas dado.
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 14 de 18
Script 0-CleanUp.sql:
CREATE OR REPLACE PROCEDURE Clean_Up
IS
BEGIN
-- Borrado de tablas
EXECUTE IMMEDIATE 'DROP TABLE Comentarios';
EXECUTE IMMEDIATE 'DROP TABLE Reservas';
EXECUTE IMMEDIATE 'DROP TABLE Fotos';
EXECUTE IMMEDIATE 'DROP TABLE Alojamientos';
EXECUTE IMMEDIATE 'DROP TABLE Usuarios';
EXECUTE IMMEDIATE 'DROP TABLE Zonas';
-- Borrado de secuencias
EXECUTE IMMEDIATE 'DROP SEQUENCE sec_com';
EXECUTE IMMEDIATE 'DROP SEQUENCE sec_res';
EXECUTE IMMEDIATE 'DROP SEQUENCE sec_fot';
EXECUTE IMMEDIATE 'DROP SEQUENCE sec_alo';
EXECUTE IMMEDIATE 'DROP SEQUENCE sec_usu';
EXECUTE IMMEDIATE 'DROP SEQUENCE sec_zon';
END;
/
Script 1-Crea.sql /* Borra tablas y secuencias */
EXECUTE Clean_Up;
/* Creación Tabla de Zonas */
CREATE TABLE Zonas (
IdZona SMALLINT PRIMARY KEY,
Nombre VARCHAR(30) NOT NULL );
-- Creación de secuencia para generar PK de tabla de Zonas
CREATE SEQUENCE sec_zon;
-- Creación de Trigger de secuencias para generar PK de tabla de Zonas
CREATE OR REPLACE TRIGGER zonas_PK
BEFORE INSERT ON zonas
FOR EACH ROW
BEGIN
SELECT sec_zon.nextval INTO :new.IdZona FROM dual;
END;
/
/* Creación Tabla de Usuarios */
CREATE TABLE Usuarios (
IdUsuario SMALLINT PRIMARY KEY,
Dni VARCHAR(9) NOT NULL,
Nombre VARCHAR(30) NOT NULL,
Apellidos VARCHAR(30) NOT NULL,
Correo VARCHAR(30) NOT NULL,
Contraseña VARCHAR(30) NOT NULL,
Direccion VARCHAR(30) NOT NULL,
Telefono VARCHAR(14) NOT NULL);
-- Creación de secuencia para generar PK de tabla de Usuarios
CREATE SEQUENCE sec_usu;
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 15 de 18
-- Creación de Trigger de secuencias para generar PK de tabla de Usuarios
CREATE OR REPLACE TRIGGER usuarios_PK
BEFORE INSERT ON usuarios
FOR EACH ROW
BEGIN
SELECT sec_usu.nextval INTO :new.IdUsuario FROM dual;
END;
/
/* Creación Tabla de Alojamientos */
CREATE TABLE Alojamientos (
IdAlojamiento SMALLINT PRIMARY KEY,
Direccion VARCHAR(30) NOT NULL,
Num_Dormitorios SMALLINT NOT NULL,
Num_Baños SMALLINT NOT NULL,
Ocu_Maxima SMALLINT NOT NULL,
Aire_Acondicionado VARCHAR(1),
CHECK (UPPER(Aire_Acondicionado) IN ('S', 'N')),
Wifi VARCHAR(1), CHECK (UPPER(Wifi) IN ('S', 'N')),
Piscina VARCHAR(1), CHECK (UPPER(Piscina) IN ('S', 'N')),
Garaje VARCHAR(1), CHECK (UPPER(Garaje) IN ('S', 'N')),
IdZona SMALLINT NOT NULL,
IdPropietario SMALLINT NOT NULL,
FOREIGN KEY(IdZona) REFERENCES Zonas,
FOREIGN KEY(IdPropietario) REFERENCES Usuarios);
-- Creación de secuencia para generar PK de tabla de Alojamientos
CREATE SEQUENCE sec_alo;
-- Creación de Trigger de secuencias para generar PK de tabla de Alojamientos
CREATE OR REPLACE TRIGGER alojamientos_PK
BEFORE INSERT ON alojamientos
FOR EACH ROW
BEGIN
SELECT sec_alo.nextval INTO :new.IdAlojamiento FROM dual;
END;
/
/* Creación Tabla de Fotos */
CREATE TABLE Fotos (
IdFoto SMALLINT PRIMARY KEY,
Pathf VARCHAR(30) NOT NULL,
Tipo VARCHAR(5),
IdAlojamiento SMALLINT NOT NULL,
FOREIGN KEY(IdAlojamiento) REFERENCES Alojamientos);
-- Creación de secuencia para generar PK de tabla de Fotos
CREATE SEQUENCE sec_fot;
-- Creación de Trigger de secuencias para generar PK de tabla de Fotos
CREATE OR REPLACE TRIGGER fotos_PK
BEFORE INSERT ON fotos
FOR EACH ROW
BEGIN
SELECT sec_fot.nextval INTO :new.IdFoto FROM dual;
END;
/
/* Creación Tabla de Reservas */
CREATE TABLE Reservas (
IdReserva SMALLINT PRIMARY KEY,
Fecha_Check_In DATE NOT NULL ,
Fecha_Check_Out DATE NOT NULL,
CONSTRAINT Fechas_Reserva -- La reserva debe de ser de al menos un día
CHECK (fecha_check_out - fecha_check_in >=1),
IdAlojamiento SMALLINT NOT NULL,
IdUsuario SMALLINT NOT NULL,
FOREIGN KEY(IdAlojamiento) REFERENCES Alojamientos,
FOREIGN KEY(IdUsuario) REFERENCES Usuarios);
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 16 de 18
-- Creación de secuencia para generar PK de tabla de Reservas
CREATE SEQUENCE sec_res;
-- Creación de Trigger de secuencias para generar PK de tabla de Reservas
CREATE OR REPLACE TRIGGER reservas_PK
BEFORE INSERT ON reservas
FOR EACH ROW
BEGIN
SELECT sec_res.nextval INTO :new.IdReserva FROM dual;
END;
/
/* Creación Tabla de Comentarios */
CREATE TABLE Comentarios (
IdComentario SMALLINT PRIMARY KEY,
Texto VARCHAR(30) NOT NULL,
Valoracion VARCHAR(5) NOT NULL,
IdReserva SMALLINT NOT NULL,
FOREIGN KEY(IdReserva) REFERENCES Reservas);
-- Creación de secuencia para generar PK de tabla de Comentarios
CREATE SEQUENCE sec_com;
-- Creación de Trigger de secuencias para generar PK de tabla de Comentarios
CREATE OR REPLACE TRIGGER comentarios_PK
BEFORE INSERT ON comentarios
FOR EACH ROW
BEGIN
SELECT sec_com.nextval INTO :new.IdComentario FROM dual;
END;
/
/* Triggers para impedir que el propietario reserve un alojamiento de su propiedad */
CREATE OR REPLACE TRIGGER ReservasPropietario
BEFORE INSERT OR UPDATE ON Reservas
FOR EACH ROW
DECLARE
V_propietario Integer;
BEGIN
SELECT idPropietario INTO V_propietario
FROM Alojamientos
WHERE IdAlojamiento = :NEW.IdAlojamiento;
IF (V_propietario = :NEW.IdUsuario) THEN
RAISE_APPLICATION_ERROR
(-20600,'El propietario no puede hacer reservas sobre sus alojamientos');
END IF;
END;
/
/* Triggers fechas de reservas solapadas */
CREATE OR REPLACE TRIGGER FechasReservas
BEFORE INSERT ON Reservas
FOR EACH ROW
DECLARE
V_Res Integer;
BEGIN
SELECT COUNT(*) INTO V_Res
FROM Reservas A
WHERE IdAlojamiento = :NEW.IdAlojamiento
AND (Fecha_Check_In, Fecha_Check_Out)
OVERLAPS (:NEW.Fecha_Check_In, :NEW.Fecha_Check_Out);
IF (V_Res >= 1) THEN
RAISE_APPLICATION_ERROR
(-20600,'Para dicho alojamiento ya existe una reserva concurrente');
END IF;
END;
/
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 17 de 18
/* Procedimiento para crear reservas */
CREATE OR REPLACE PROCEDURE crear_reserva
(w_fecha_in IN reservas.fecha_check_in%TYPE,
w_fecha_out IN reservas.fecha_check_out%TYPE,
w_idAloja IN reservas.idalojamiento%TYPE,
w_idUsua IN reservas.idusuario%TYPE ) IS
BEGIN
INSERT INTO reservas (fecha_check_in, fecha_check_out, idalojamiento, idusuario)
VALUES (w_fecha_in, w_fecha_out, w_idAloja, w_idUsua);
COMMIT WORK;
END;
/
/* Procedimiento para presentar los tres alojamientos con más reservas en
un intervalo de fechas pasado como parámetro */
CREATE OR REPLACE PROCEDURE MasReservas (v_f1 IN VARCHAR, v_f2 IN VARCHAR )
IS
CURSOR c IS
SELECT idAlojamiento,count(*) AS cuenta FROM reservas
WHERE Fecha_Check_In BETWEEN TO_DATE(v_f1,'DD.MM.YYYY')
AND TO_DATE(v_f2,'DD.MM.YYYY')
GROUP BY idAlojamiento ORDER BY 2 DESC;
BEGIN
DBMS_OUTPUT.PUT_LINE('Los 3 alojamientos más reservas en el intervalo
de fechas solicitado (Fecha_Check_In en intervalo) ');
FOR fila IN c LOOP
EXIT WHEN C%ROWCOUNT >3;
DBMS_OUTPUT.PUT_LINE('El alojamiento '||fila.idAlojamiento||' ha sido rerservado '
||fila.cuenta ||' veces') ;
END LOOP;
END;
/
-- Para permitir visualizar mensajes en pantalla
SET SERVEROUTPUT ON
Script 2-Inserta.sql: /* Creacion de filas */
INSERT INTO zonas (nombre) VALUES ('Costa de la Luz');
INSERT INTO usuarios (dni, nombre, apellidos, correo, contraseña, direccion, telefono)
VALUES ('12345678X', 'Juan', 'Blanco', '[email protected]', 'blanco', 'Nueva 25', '(34)122334455');
INSERT INTO usuarios (dni, nombre, apellidos, correo, contraseña, direccion, telefono)
VALUES ('11111111A', 'Ines', 'Lopez', '[email protected]', 'lopez', 'Sierpes 5', '(34)222334455');
INSERT INTO usuarios (dni, nombre, apellidos, correo, contraseña, direccion, telefono)
VALUES ('22222222B', 'Ana', 'Gris', '[email protected]', 'gris', 'Mayor 2', '(34)654223344');
INSERT INTO alojamientos (direccion, num_dormitorios, num_baños, ocu_maxima, aire_acondicionado, wifi,
piscina, garaje, idzona, idpropietario) --Cuidado con las FK son secuencias
VALUES ('Avda. Mayor Nº1', 3, 2, 8, 'S', 'S', 'N', 'N', 1, 3);
INSERT INTO alojamientos (direccion, num_dormitorios, num_baños, ocu_maxima, aire_acondicionado, wifi,
piscina, garaje, idzona, idpropietario) --Cuidado con las FK son secuencias
VALUES ('Calle Blanca Nº2', 2, 2, 4, 'N', 'S', 'N', 'S', 1, 1);
INSERT INTO fotos (pathf, tipo, idalojamiento) VALUES ('C:\fotos\foto1.png', 'png', 1);
INSERT INTO fotos (pathf, tipo, idalojamiento) VALUES ('C:\fotos\foto2.png', 'png', 1);
-- Inserción de reservas mediante llamada al procedimiento crear_reservas
EXECUTE crear_reserva(TO_DATE('2017-12-20', 'YYYY-MM-DD'), TO_DATE('2017-12-23', 'YYYY-MM-DD'), 1, 2);
EXECUTE crear_reserva(TO_DATE('2017-12-23', 'YYYY-MM-DD'), TO_DATE('2018-1-2', 'YYYY-MM-DD'), 1, 1);
EXECUTE crear_reserva(TO_DATE('2017-12-24', 'YYYY-MM-DD'), TO_DATE('2018-1-2', 'YYYY-MM-DD'), 2, 2);
INSERT INTO comentarios (texto, valoracion, idreserva) VALUES ('Muy bien', '***', 1);
Introducción a la Ingeniería del Software y a los Sistemas de Información
Alojamientos
octubre 2018
Página 18 de 18
Script 3-Consultas.sql
-- Reservas existentes
SELECT * FROM reservas;
-- Reservas ya terminadas
SELECT * FROM reservas
WHERE sysdate > Fecha_Check_Out;
-- Reservas correspondientes a alojamientos actualmente ocupados
SELECT * FROM reservas
WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out;
-- Dirección de los alojamientos actualmente ocupados
SELECT direccion FROM reservas NATURAL JOIN alojamientos
WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out ;
-- Dirección y zona de los alojamientos actualmente ocupados
SELECT direccion, nombre FROM reservas NATURAL JOIN alojamientos NATURAL JOIN zonas
WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out;
-- Direción de los alojamientos actualmente libres
SELECT idAlojamiento, direccion FROM alojamientos A
WHERE idAlojamiento NOT IN
(SELECT idalojamiento FROM reservas NATURAL JOIN alojamientos NATURAL JOIN zonas
WHERE sysdate BETWEEN Fecha_Check_In AND Fecha_Check_Out);
-- Alojamiento y número de reservas
SELECT idAlojamiento, count(*) FROM reservas GROUP BY idAlojamiento;
-- Alojamiento con más reservas
SELECT idAlojamiento FROM reservas
GROUP BY idAlojamiento
HAVING count(*) >= ALL (SELECT count(*) FROM reservas GROUP BY idAlojamiento);
-- Dirección del alojamiento con más reservas
SELECT direccion FROM reservas NATURAL JOIN alojamientos
GROUP BY idAlojamiento, direccion
HAVING count(*) >= ALL (SELECT count(*) FROM reservas GROUP BY idAlojamiento);
-- Bloque anónimo que presenta los tres alojamientos con más reservas
DECLARE
CURSOR c IS
SELECT idAlojamiento,count(*) AS cuenta FROM reservas
GROUP BY idAlojamiento ORDER BY 2 DESC;
BEGIN
DBMS_OUTPUT.PUT_LINE('Los 3 Alojamientos más solicitados');
FOR fila IN c LOOP
EXIT WHEN C%ROWCOUNT >3;
DBMS_OUTPUT.PUT_LINE('El alojamiento '||fila.idAlojamiento||' ha sido rerservado
'||fila.cuenta ||' veces') ;
END LOOP;
END;
/
/* Ejecución del procedimiento que presenta los tres alojamientos con más reservas en
un intervalo de fechas pasado como parámetro */
EXECUTE MasReservas ('1.12.2017','31.12.2017');