Bases de Datos > Oracle
Restriccion De Fechas
(1/1)
sneider:
Buenas, estoy haciendo la gestion de reservas de un hotel con Oracle y Forms. Tengo un problema en lo siguiente: Resulta ke en mi tabla reservas tengo ke poner una restriccion, ya que una habitacion puede estra reservada para distintos periodos de tiempo, y al mismo tiempo estar ocupada, siempre que las fechas para la reservas y la ocupacion no se solapen.
Supongo ke tendre ke poner un disparador a nivel de bloque. Pero como lo hago? que tendria ke poner? No se me ocurre la idea de como programarlo.
Espero puedan ayudarme. Un saludo y gracias.
JuanK:
Un constraint no te servira para eso.
Debes usar un trigger que se dispare antes de actualizar o insertar en ese campo de la tabla, el trigger se debe disparar por cada fila asi:
<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->CREATE OR REPLACE TRIGGER MiTrigger
BEFORE [color=blue;font-weight]INSERT[/color] OR [color=blue;font-weight]UPDATE[/color] ON MiTabla
FOR EACH ROW
WHEN (old.CampoFecha <> new.CampoFecha)
...
...
... <!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->
sneider:
Hola Juank. Gracias por tu respuesta. Hay una cosa ke no entiendo en lo ke me dices. Cuando me pones esto:
WHEN (old.campoFecha <> new.CampoFecha)
A que te refieres con esto? old. y new. que valor tiene para ti?
Con poner ese codigo es un disparador a nivel de mi bloque reservas se solucionara la restriccion de fechas que comento? Estoy un poco pez en estas cosas. Espero puedas ayudarme, gracias.
Por cierto, si te sirve de ayuda, mi tabla de reservas es la siguiente:
--- Código: Text --- create table reserva(num_reserva varchar2(15),reser_id_hotel varchar2(4),cod_habitacion number(6),cod_cliente varchar2(8),fecha_inicio date,fecha_fin date); alter table reserva add constraint num_reserva_pk primary key(num_reserva,cod_habitacion,reser_id_hotel); alter table reserva add constraint cod_habitacion_fk foreign key(cod_habitacion,reser_id_hotel) references habitacion(num_habitacion,habita_id_hotel);alter table reserva add constraint reserva_cod_cliente_fk foreign key(cod_cliente) references cliente(dni);
Y mi tabla habitacion es la siguiente:
--- Código: Text --- create table habitacion(num_habitacion number(6),habita_id_hotel varchar2(4),num_camas number(2),precio number(5,2),estado varchar2(15)); alter table habitacion add constraint num_habitacion_pk primary key(num_habitacion,habita_id_hotel); alter table habitacion add constraint habita_id_hotel_fk foreign key(habita_id_hotel) references hotel(id_hotel);
JuanK:
--- Citar ---Hay una cosa ke no entiendo en lo ke me dices. Cuando me pones esto:
WHEN (old.campoFecha <> new.CampoFecha)
--- Fin de la cita ---
Me refiero a que :
esta instruccion en el trigger permite solo que se dispare el triger cuando se modifica el valor de la fecha actual del registro de la tabla , esto lo hace comparando el valor actual ( old) contra el valor nuevo (new).
--- Citar ---A que te refieres con esto? old. y new. que valor tiene para ti?
--- Fin de la cita ---
No es para mi , el trigger siempre tiene por defecto el valor nuevo del campo en new y el valor actual en old, sin embargo eso lo puedes cambiar asi:
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
CREATE OR REPLACE TRIGGER MiTrigger
BEFORE INSERT OR UPDATE ON MiTabla
REFERENCING NEW AS nuevo OLD AS anterior
FOR EACH ROW
WHEN (old.CampoFecha <> new.CampoFecha)<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
--- Citar ---Con poner ese codigo es un disparador a nivel de mi bloque reservas se solucionara la restriccion de fechas que comento? Estoy un poco pez en estas cosas. Espero puedas ayudarme, gracias.
--- Fin de la cita ---
No, eso es solo un ejemplo de el esqueleto del trigger que debes hacer. Este trigguer ´para lo que ncesitas no se debe disparar a nivel de bloque ( FOR EACH STATEMENT) sino a nivel de fila ( FOR EACH ROW).
Mi recomendacion es que no comiences a ahcerlo sin saber primero que son como funcionan y para que sirven los triggers. Investiga y experimenta con ellos y cuando estes listo ven y pregunta de nuevo ;)
Navegación
Ir a la versión completa