PROYECTO DE BASE DE DATOS Jos Jess Marente Florn Daniel Payn
Alcedo GESTIN DE RESERVAS DE HOTEL Tecnologa Avanzada de Bases de
Datos Universidad de Cdiz
Diapositiva 2
PUNTOS A TRATAR Especificaciones funcionales Diagrama de clases
persistentes (UML) Tipos y mtodos Disparadores y procedimientos
Interfaces de usuario despliegue CONCLUSIONES
Diapositiva 3
ESPECIFICACIONES FUNCIONALES El sistema a modelar trata de la
reserva de habitaciones de un hotel por parte de personas, las
cuales sern empleados (personal del hotel) y clientes (no empleados
que hayan realizado alguna vez alguna reserva). Estas personas
podrn realizar reservas de habitaciones, cada una con diferentes
ventajas econmicas: Empleados: se beneficiarn del 30% de descuento
por cada reserva Clientes, deben tener almacenado un descuento, que
lo asignar el sistema dependiendo del nmero de reservas que haya
realizado, es decir, entre 2 y 3, un 5%, entre 4 y 8 el 10% ms de 8
reservas, el 20 %.
Diapositiva 4
ESPECIFICACIONES FUNCIONALES El hotel enva ofertas tanto a
empleados como a clientes, dichas ofertas debern guardar las fechas
de sta, su descripcin y el precio. El hotel dispone de
habitaciones, las cuales se caracterizan por: el nmero (el cual ser
nico en el hotel), la planta donde se encuentra (ser el primer
dgito del nmero de habitacin, pues solo tenemos 5 plantas), la
categora, que ser simple, doble o suit, la descripcin de ese tipo
de habitacin y el precio de la misma al da.
Diapositiva 5
ESPECIFICACIONES FUNCIONALES Respecto a las reservas de
habitaciones por las personas (mximo 5 por reserva), se guardarn
las siguientes caractersticas, la fecha de inicio, la de fin, algn
comentario sobre preferencias del cliente de esa reserva y el
precio de la reserva, al cual se le aplicar el descuento de la
persona que haya realizado la reserva. Para cancelar la reserva, el
cliente deber hacerlo como mximo un da antes de la fecha de inicio
de la reserva, con el motivo de la misma. En este caso, la reserva
de dicho cliente no se debe contabilizar como posible descuento en
otras reservas. Una vez que se cancele, sta no se podr habilitar de
nuevo, permanecer cancelada.
Diapositiva 6
DIAGRAMA DE CLASES PERSISTENTES Generalizacin / especializacin
Atributo Compuesto Atributo Multievaluado Polimorfismo
Diapositiva 7
DIAGRAMA DE CLASES PERSISTENTES Asociacin N:N Asociacin 1:N
getPrecio() = descuento de persona * das de reserva * precio
habitaciones
Diapositiva 8
DIAGRAMA DE CLASES PERSISTENTES Agregacin Composicin 1:1
Diapositiva 9
TIPOS CREADOS Tipo Direccin Necesario para almacenar la
direccin completa en Persona. Tipo Habitacin Tipo Cancelacin Tipo
Persona Tipo Empleado Tipo Cliente Tipo Reserva
Diapositiva 10
MTODOS Obtener descuento en Cliente Devuelve el descuento que
posee el cliente, segn el nmero de reservas no canceladas que haya
realizado Obtener descuento de Empleado Devuelve el descuento que
posee el empleado. Siempre ser del 30%. Obtener precio en reserva
Devuelve el precio de la reserva, teniendo en cuenta todas las
habitaciones reservadas, das de la duracin de la reserva y el
descuento aplicado, segn que persona realiz la reserva. Obtener
planta en habitacin Devuelve la planta en la que se encuentra la
habitacin segn el nmero de esta.
Diapositiva 11
DISPARADORES Disparador cancelacin no permitida Una reserva se
puede cancelar con un da de antelacin como mximo. Este disparador
controlar que dicha cancelacin se realice dentro del plazo.
Disparador Reserva sin cancelar No permite crear en el sistema una
nueva reserva que ya est cancelada desde un principio
Diapositiva 12
PROCEDIMIENTOS Todas las operaciones sobre la Base de Datos, se
realizan usando procedimientos. Insertar Cliente Insertar Empleado
Inserta nuevos clientes y empleados. Modificar Cliente Modificar
Empleado Procedimientos que modifican nicamente los datos de los
empleados y clientes Eliminar Persona Elimina a la persona y a
todas las reservas realizada por esa persona
Diapositiva 13
PROCEDIMIENTOS Procedimientos encargados de controlar la
bidireccionalidad entre persona y reserva. Insertar Reserva Inserta
la nueva reserva, la relaciona con la persona y a su vez relaciona
a la persona con esa reserva. Modificar Reserva Modifica los datos
de la reserva y si se da el caso, modificar la persona con la que
se relaciona y desvincula a la persona anterior. Eliminar Reserva
Elimina la reserva y la relacin que exista entre la persona y la
reserva
Diapositiva 14
PROCEDIMIENTO MODIFICAR RESERVA /* CREATE OR REPLACE PROCEDURE
ModificaReserva ( idRes VARCHAR2, nuevafechaInicio VARCHAR2,
nuevafechaFin VARCHAR2, nuevoscomentarios CLOB, DNIPer VARCHAR2,
IdHabbitaciones Tipo_VectorCadenas ) IS RefPersona REF
Tipo_Persona; RefReserva REF Tipo_Reserva; ListaRefHab
Tipo_ListaHabitaciones; RefHab1 REF Tipo_Habitacion; realizada_por
Tipo_Persona; realizadas Tipo_Realiza; realizadas_actualizadas
Tipo_Realiza; reserva Tipo_Reserva; i NUMBER; indice NUMBER;
cambiarPersona boolean; BEGIN /* DESVINCULAMOS A LA PERSONA */
SELECT DEREF(realizadaPor) INTO realizada_por FROM Tabla_Reserva
WHERE IdReserva = to_number(idRes); cambiarPersona := false;
Diapositiva 15
PROCEDIMIENTO MODIFICAR RESERVA IF realizada_por.DNI != DNIPer
THEN cambiarPersona := true; -- realizadas almacena el nested tabla
de ref a reservas de esa persona select realiza into realizadas
from Tabla_Persona where idPersona = realizada_por.idpersona; --
var de tipo nested table de ref de reservas realizadas_actualizadas
:= Tipo_Realiza(); indice := 1; -- creamos en el nested table de
ref a reservas temporal -- las mismas reservas que tena pero sin la
actual FOR i IN 1..realizadas.count LOOP
UTL_REF.SELECT_OBJECT(realizada s(i), reserva); IF
reserva.idReserva != to_number(idRes) THEN
realizadas_actualizadas.EXTEND(); realizadas_actualizadas(indice)
:= realizadas(i); indice := indice + 1; END IF; END LOOP; END
IF;
Diapositiva 16
PROCEDIMIENTO MODIFICAR RESERVA /* MODIFICAMOS LA RESERVA */ --
Seleccionamos persona select REF(t) into RefPersona from
Tabla_Persona t Where t.DNI = DNIPer; -- var que almacenar la lista
de ref a habitaciones de esa reserva ListaRefHab :=
Tipo_ListaHabitaciones(); FOR i IN 1..IdHabbitaciones.count LOOP
SELECT REF(H) INTO RefHab1 FROM Tabla_Habitacion H WHERE
H.IDHabitacion = IdHabbitaciones(i); ListaRefHab.extend();
ListaRefHab(i) := RefHab1; END LOOP; -- actualizamos la reserva
UPDATE Tabla_Reserva set FechaInicio =
to_date(nuevafechaInicio,'DD/MM/YYYY'), FechaFin =
to_date(nuevafechaFin,'DD/MM/YYYY'), -- Fecha Fin comentarios =
nuevoscomentarios, -- Comentarios RealizadaPor = RefPersona, --
Referencia a Row de Tabla_Persona SeCancela = NULL, --
Cancelaciones TieneHabitaciones = ListaRefHab -- refs a
habitaciones WHERE IdReserva = to_number(idRes);
Diapositiva 17
PROCEDIMIENTO MODIFICAR RESERVA /* VINCULAMOS A LA NUEVA
PERSONA EN CASO DE QUE SEA OTRA */ IF cambiarpersona = true THEN
SELECT REF(t) INTO RefReserva FROM Tabla_Reserva t WHERE
t.IdReserva = idRes; SELECT realiza INTO realizadas FROM
Tabla_Persona WHERE DNI = DNIPer; -- En su nested table de ref a
reservas de esa nueva persona -- incluimos esta reserva i :=
realizadas.count; realizadas.EXTEND(); realizadas(i+1) :=
RefReserva; UPDATE Tabla_Persona SET realiza = realizadas WHERE DNI
= DNIPer; END IF; EXCEPTION -- Algn tipo de error en la consulta de
datos agregados WHEN OTHERS THEN --Lanzamos excepcin
raise_application_error(-20010,'No se puede MODIFICAR reserva'
||SQLCODE||' -ERROR- '||SQLERRM); END ModificaReserva;
Diapositiva 18
INTERFACES DE USUARIO Como interface de usuario se ha optado
por JDBC y Java para aplicaciones de escritorio (uso de librera
Swing,) con los clsicos formularios, botones, desplegables y
ventanas. Para poder disponer de la API JDBC : import java.sql.*;
Pero para disponer de las extensiones del modelo relacional de
Oracle (implementacin de JDBC para ORACLE con ojdbc6.jar): import
oracle.jdbc.driver.*; import oracle.sql.*; Capturar las excepciones
de PLSQL: } catch (SQLException ex) {
JOptionPane.showMessageDialog(frame, "Error:" +
ex.getMessage());
Diapositiva 19
INTERFACES DE USUARIO Implementamos BD.java, clase singleton
que controla en todo momento la conexin con Oracle, desde el logon,
pasando por las sucesivas operaciones DML y su posterior
desconexin. El siguiente fragmento muestra el ncleo principal de
conexin : Connection conn; try { DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver()); String url =
"jdbc:oracle:thin:@//localhost:1521/XE"; conn =
DriverManager.getConnection(url,nombre,passwd);
conn.setAutoCommit(false); } catch (SQLException e) { error =
e.getMessage(); } La variable conn nos permita todas las
operaciones de manejo de datos con Oracle.
Diapositiva 20
INTERFACES DE USUARIO Aunque se permita las operaciones INSERT,
UPDATE o DELETE desde cdigo java, se establece hacer todo este tipo
de operaciones DML a travs de procedimientos almacenados. Ejemplo
insertarcliente: private void insertarCliente(){ BD OraBD =
BD.getInstance(); try { OraBD.conn.setAutoCommit(true);
CallableStatement pstm1 = OraBD.conn.prepareCall ("{ call
InsertaCliente(?,?,?,?,?,?,?,?,?,?,?,?) }"); //Controlamos el DNI
if("".equals(DNI.getText())){ pstm1.setString(1, null); }else{
pstm1.setString(1, DNI.getText()); } //Controlamos el nombre .. .
Dems campos } pstm1.execute();
Diapositiva 21
DESPLIEGUE 1. Crear usuario y dar permisos con grant 1. SQL>
create user tabd 2. SQL> grant connect to tabd; 2. Ejecutar
scripts de creacin de tipos, tablas, secuencias, disparadores y
procedimientos 1. SQL> connect tabd 2. SQL>
@DiseoLogicoEspecifico.sql 3. Lanzar la aplicacin : 1. Ejecutar el
fichero GUIDBD.jar desde escritorio 2. Desde consola: java jar
GUIDBD.jar
Diapositiva 22
DEMOSTRACIN
Diapositiva 23
CONCLUSIONES EL tratamiento de las extensiones del modelo
objeto-relacional de Oracle conlleva un mayor esfuerzo si se
compara con el modelo relacional (mayor curva de aprendizaje).
Todava se aprecia ms dicha complejidad si se contempla la
bidireccin en las asociaciones (mantenimiento de referencias y
nested tables en las diferentes clases relacionadas) Falta de IDEs
que contemplen dichas extensiones. Triggers muy limitados por el
problema de las tablas mutantes (para referenciar o desreferenciar
el objeto se deben hacer consultas sobre la propia tabla a
modificar o insertar). Como ventajas, el paso del diagrama de
clases persistentes al modelo lgico es relativamente sencillo, se
aumenta la semntica del problema a modelar. Java mediante libreras
proporcionadas por Oracle permite el tratamiento de estas
extensiones (CLOBs, BLOBs, Referencias, Varrays, etc) para su
utilizacin en dicho lenguaje de programacin orientado a
objetos.
Diapositiva 24
REFERENCIAS Oracle and Java Development Bulusu Lakshman
Transparencias de las asignatura, tema 2. Manual del desarollador
de jDeveloper. Tutoriales Java y Swing