• Martes 12 de Noviembre de 2024, 21:05

Autor Tema:  Restriccion De Fechas  (Leído 1893 veces)

sneider

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Restriccion De Fechas
« en: Lunes 23 de Octubre de 2006, 23:41 »
0
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

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Restriccion De Fechas
« Respuesta #1 en: Lunes 23 de Octubre de 2006, 23:49 »
0
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-->
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

sneider

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Restriccion De Fechas
« Respuesta #2 en: Martes 24 de Octubre de 2006, 18:46 »
0
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
  1.  
  2. create table reserva
  3. (
  4. num_reserva varchar2(15),
  5. reser_id_hotel varchar2(4),
  6. cod_habitacion number(6),
  7. cod_cliente varchar2(8),
  8. fecha_inicio date,
  9. fecha_fin date
  10. );
  11.  
  12.  
  13. alter table reserva add constraint num_reserva_pk primary key(num_reserva,cod_habitacion,reser_id_hotel);
  14.  
  15. alter table reserva add constraint cod_habitacion_fk foreign key(cod_habitacion,reser_id_hotel) references habitacion(num_habitacion,habita_id_hotel);
  16. alter table reserva add constraint reserva_cod_cliente_fk foreign key(cod_cliente) references cliente(dni);
  17.  
  18.  

Y mi tabla habitacion es la siguiente:

Código: Text
  1.  
  2. create table habitacion
  3. (
  4. num_habitacion number(6),
  5. habita_id_hotel varchar2(4),
  6. num_camas number(2),
  7. precio number(5,2),
  8. estado varchar2(15)
  9. );
  10.  
  11.  
  12.  
  13. alter table habitacion add constraint num_habitacion_pk primary key(num_habitacion,habita_id_hotel);
  14.  
  15. alter table habitacion add constraint habita_id_hotel_fk foreign key(habita_id_hotel) references hotel(id_hotel);
  16.  
  17.  
  18.  

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Restriccion De Fechas
« Respuesta #3 en: Martes 24 de Octubre de 2006, 19:00 »
0
Citar
Hay una cosa ke no entiendo en lo ke me dices. Cuando me pones esto:

    WHEN (old.campoFecha <> new.CampoFecha) 
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?

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.

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  ;)
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io