Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

restriccion de una fecha

Estas en el tema de restriccion de una fecha en el foro de Oracle en Foros del Web. buenas, tengo un pequeño problema en una tabla que estoy creando, necesito hacer una restriccion de un campo llamado fecha_inicio que sea menor que la ...
  #1 (permalink)  
Antiguo 15/09/2009, 18:57
Avatar de sebas_20_jv  
Fecha de Ingreso: agosto-2009
Ubicación: Medellin, Colombia
Mensajes: 59
Antigüedad: 15 años, 3 meses
Puntos: 3
restriccion de una fecha

buenas, tengo un pequeño problema en una tabla que estoy creando, necesito hacer una restriccion de un campo llamado fecha_inicio que sea menor que la fecha actual y no encuentro como ya que el sysdate veo que no me permite usarlo
gracias
  #2 (permalink)  
Antiguo 15/09/2009, 19:36
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: restriccion de una fecha

la validación la debes hacer al momento que el usuario intente ingresar una fecha inferior.
la haces desde la aplicación o desde una función en oracle haciendo uso de sysdate.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 15/09/2009, 21:54
Avatar de sebas_20_jv  
Fecha de Ingreso: agosto-2009
Ubicación: Medellin, Colombia
Mensajes: 59
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: restriccion de una fecha

El campo lo tengo de esta forma:

proyectoFechaInicio date not null
constraint p_fch_ck check (proyectoFechaInicio<=sysdate),

pero me saca un error por la funcion del sistema.............
  #4 (permalink)  
Antiguo 16/09/2009, 02:07
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: restriccion de una fecha

Creo que sé por donde van los tiros, pon el script completo de creación de la tabla y te lo confirmo
  #5 (permalink)  
Antiguo 16/09/2009, 05:43
Avatar de sebas_20_jv  
Fecha de Ingreso: agosto-2009
Ubicación: Medellin, Colombia
Mensajes: 59
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: restriccion de una fecha

Mira esta es la tb completa



create table tbl_Proyectos(
proyectoId number(8)
constraint p_id_nn not null,
proyectoDescripcion varchar2(30)
constraint p_des_nn not null,
proyectoClienteId number(12)
constraint p_clid_nn not null,
proyectoFechaInicio date not null
constraint p_fch_ck check (proyectoFechaInicio<=sysdate),
proyectoPresupuesto number(12) not null
constraint p_pre_ck check (proyectoPresupuesto between 20000000 and 100000000),
constraint p_cli_fk foreign key (proyectoClienteId)references tbl_clientes (clienteId),
constraint p_des_uk unique (proyectoDescripcion),
constraint p_id_pk primary key (proyectoId));
  #6 (permalink)  
Antiguo 16/09/2009, 07:40
Avatar de 8vio  
Fecha de Ingreso: marzo-2008
Ubicación: Detras del monitor
Mensajes: 168
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: restriccion de una fecha

Hola que tal,

No creo que puedas lograr eso con un check, lo que si podrias hacer es crear un trigger, validando que cada vez que se haga insert o update genere un error si la fecha es mayor a la actual.


Algo asi

Código:
CREATE OR REPLACE TRIGGER trg_fecha BEFORE INSERT OR UPDATE ON Tbl_Proyectos
BEGIN
   IF :ProyectoFechaInicio > SYSDATE THEN
      RAISE_APPLICATION_ERROR (num => -20000, msg => 'La fecha es mayor a la actual');
   END IF;
END;
  #7 (permalink)  
Antiguo 16/09/2009, 07:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: restriccion de una fecha

Parece que no se puede. Hice multiples pruebas sin ningún resultado. Asumo que el rango que se le da al ckeck constraint debe ser fijo y no permite la comparación con una función que es dinamica.

Al hacer una prueba así:

Código sql:
Ver original
  1. CREATE TABLE tbl_Proyectos(
  2. proyectoId NUMBER(8)
  3. CONSTRAINT p_id_nn NOT NULL,
  4. proyectoDescripcion varchar2(30)
  5. CONSTRAINT p_des_nn NOT NULL,
  6. proyectoClienteId NUMBER(12)
  7. CONSTRAINT p_clid_nn NOT NULL,
  8. proyectoFechaInicio DATE NOT NULL
  9. CONSTRAINT p_fch_ck CHECK (proyectoFechaInicio<=to_date('2009-09-16','YYYY-MM-DD')));

De esta forma la tabla se crea correctamente.

Esperemos los cometarios de Juan carlos para ver existe forma de hacer lo que quieres.
Sin embargo, como te dije en el primer post, esto lo puedes controlar desde una función en plsql o desde la aplicación que tenga conexión a la base.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 16/09/2009, 08:46
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: restriccion de una fecha

Pues no, confundí las churras con las merinas, sorry.

He buscado en el google y pone lo que has puesto tu, que es una funcion dinamica y oracle no te lo permite.
En un foro he encontrado algo que puede servir, copio y pego :

CREATE OR REPLACE TRIGGER trg_emp_dob BEFORE INSERT OR UPDATE ON emp
BEGIN
IF :new.dob > SYSDATE THEN
RAISE_APPLICATION_ERROR (num => -20000, msg => 'DOB Cannot be in the future');
END IF;
END;
  #9 (permalink)  
Antiguo 16/09/2009, 08:50
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: restriccion de una fecha

Aprovecho el aporte de 8vio y jc3000 para preguntarles acerca de los triggers que han puesto (Que son igualitos).

El trigger se dispara antes de un insert o update. El raise_application_error interrumpe la ejecución del trigger una vez creado? En pocas palabras... si entra a este if, la inserción o la actualización se cancelan? Que pasaría si no fuera before sino after? Haría una especie de rollback?

Por el concepto de triggers que manejo, pensé que esto no era posible.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 16/09/2009, 09:31
Avatar de sebas_20_jv  
Fecha de Ingreso: agosto-2009
Ubicación: Medellin, Colombia
Mensajes: 59
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: restriccion de una fecha

Bueno si por lo que veo es imposible hacerlo con una restriccion check.........
Lo malo es que como todavia hemos visto el tema de los triggers no lo puedo hacer de esa manera...........
Me tocara crearlo entonces con una fecha especifica......

De tdas formas Gracias a tdos!!!
  #11 (permalink)  
Antiguo 16/09/2009, 15:06
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: restriccion de una fecha

Espera, que lo mismo se me ha encendido la bombilla.
Huesos, el RAISE_APPLICATION_ERROR, es un un error forzado por programacion pero que oracle lo trata como cualquier error suyo, es decir, se va por la parte EXCEPTION y ahí tu puedes gestionar ese "error " especifico, simplemente pones un WHEN OTHERS o no pones nada y en este ultmo caso en la pantalla o editor de sql ta saltará el tipico error : ORA-XXXXX en linea X columna Y : " Fecha erronea " y en consecuencia si, te deshace todas las operaciones DML que has hecho y aborta la ejecucion. Un trigger es simplemente un PL que en lugar de ejecutarse " a peticion " como los pl's de BBDD , se ejcutan al hacer una operacion DML en la tabla.

Sebas, prueba esto a ver si te vale, estoy en casa y lo hago de corrido, pero creo que puede valer :

CREATE OR REPLACE TRIGGER trg_emp_dob BEFORE INSERT OR UPDATE ON emp
declare
var_fecha date;
begin
BEGIN
select sysdate
into var_fecha
from dual;
IF :new.dob > var_fecha THEN
RAISE_APPLICATION_ERROR (num => -20000, msg => 'DOB Cannot be in the future');
END IF;
END;
end;
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:32.