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

Ayuda con triggers

Estas en el tema de Ayuda con triggers en el foro de Oracle en Foros del Web. ola toy aciendo un trabajo de diseño de base de datos en oracle y tengo algunas dudas con los triggers que me dan error de ...
  #1 (permalink)  
Antiguo 28/05/2009, 02:23
 
Fecha de Ingreso: agosto-2008
Mensajes: 73
Antigüedad: 15 años, 8 meses
Puntos: 0
Ayuda con triggers

ola toy aciendo un trabajo de diseño de base de datos en oracle y tengo algunas dudas con los triggers que me dan error de compilacion

create or replace trigger tarifas_concurrentes
before insert on tarifas
for each row
declare
inicial date;
begin
Select tarifas.fecha_final into final from tarifas where tarifas.id_producto = :new id_producto

if(final> :new.fecha_inicio) then
raise_application_arror("tarifas concurrentes")
end if;
end;


Se trata de un trigger para que un mismo producto no pueda tener dos precios en la misma fecha

Tabla tarifa tiene como atributo(id_tarifa,id_producto,fecha_inicial,fecha _final,precio)
clave principal id_tarifa,id__producto
clave foragena id_producto de la tabla productos

Sin mas muxas gracias y un saludo
  #2 (permalink)  
Antiguo 28/05/2009, 02:39
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Ayuda con triggers

prueba con esto

Cita:
CREATE or replace trigger tarifas_concurrentes
before insert on tarifas
for each row
DECLARE
inicial date;
BEGIN
Select a.fecha_final into final from tarifas a
where a.id_producto = :new id_producto

if(final> :new.fecha_inicio) then
raise_application_Error('tarifas concurrentes')
end if;
END;

Parece que habías puesto ARROR en vez de ERROR
Y ademas al string del mensaje lo habías puesto con dobles comillas.

a ver que tal
  #3 (permalink)  
Antiguo 28/05/2009, 02:51
 
Fecha de Ingreso: agosto-2008
Mensajes: 73
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda con triggers

Lo de error lo tenia bien escrito y con las comillas simples sigue sin irme bien.Acias
  #4 (permalink)  
Antiguo 28/05/2009, 02:57
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Ayuda con triggers

por cierto

Qué error te da???

Algún ORA?? tablas mutantes???
dinos alguna cosa mas...
  #5 (permalink)  
Antiguo 28/05/2009, 03:04
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Ayuda con triggers

Por cierto, para comprobar que un producto no tiene dos precios en la misma fecha, por qué no haces esta select???

Cita:
SELECT count(1) into contador
FROM tarifas a
WHERE a.id_producto = :new id_producto
and fecha= :new id_fecha;
Ahora bien, esto tiene un problema, al comparar dos campo fechas, estas comparando todo el campo fecha (dias, mes, año, minutos, horas y segundo), por lo que es dificl que sean iguales.
Si la hora de creacion te da igual y solo te importa el dia, entonces:

Cita:
SELECT count(1) into contador
FROM tarifas a
WHERE a.id_producto = :new id_producto
and to_char(fecha,'dd/mm/yyyy')= to_char(:new id_fecha, 'dd/mm/yyyy');
Esta comprobación la puedes hacer antes de hacer la insercion en la bbdd, usando las variables id_producto y fecha que recojas del formulario en el que estes trabajando.


Y otra cosa.
Dices qeu tus clave es: id_tarifa,id__producto
al tener esta clave, no vas a poder tener un mismo producto con tarifas iguales (independientemente de las fechas) Ej. PRODUCTO 1 VALE 3 EUROS
PRODUCTO 1 VALE 4 EUROS SUBE LE PRODUCTO
PRODUCTO 1 VALE 3 EUROS (BAJA POR LA CRISIS) no te va a dejar por la clave

Ya nos deices que tal

saludos

Última edición por javi_cassi; 28/05/2009 a las 03:18
  #6 (permalink)  
Antiguo 28/05/2009, 03:19
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Respuesta: Ayuda con triggers

Lo primero, si haces un RAISE APPLICATION ERROR, tienes que darle el numero de error para que te lo muestre :

raise_application_Error(-20001,'tarifas concurrentes');

Y lo segundo, como bien dice Javi, lo mas seguro es que en tiempo de ejecución te salte un error de "tabla mutante".

Creo que la solucion sería sencilla : ¿ porque no te creas una " UNIQUE KEY " sobre esos dos campos y te quitas de historias con triggers y demas ???????????
  #7 (permalink)  
Antiguo 29/05/2009, 01:18
 
Fecha de Ingreso: agosto-2008
Mensajes: 73
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda con triggers

Buenos dias! El error que me sale es disparador creado con errores de compilacion
os dejo el codigo de nuevo como me dijiste:

create or replace trigger tarifas_concurrentes
before insert on tarifas_djg
for each row
declare
inicial date;
begin
SELECT count(1) into contador
FROM tarifas_djg a
WHERE a.id_producto = :new id_producto
and to_char(fecha,'dd/mm/yyyy')= to_char(:new id_fecha, 'dd/mm/yyyy');
end;

Decir q la clave principal es id_tarifa pero es un autonumerico y no el precio del producto ;) y las claves tienes q ser id_tarifa y id_producto porque es debil en existencia
  #8 (permalink)  
Antiguo 29/05/2009, 01:39
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Ayuda con triggers

Hola dani.
Veo que ahora estás usando la select que te dije...
Muy bien, peeeeeeeeero, si la usas, tendrás qeu usar las variables qeu en ella te indicaba. (Léase la variable contador)

Cita:
CREATE or replace trigger tarifas_concurrentes
before insert on tarifas_djg
for each row
DECLARE
inicial date;
contador number;
BEGIN
SELECT count(1) into contador
FROM tarifas_djg a
WHERE a.id_producto = :new id_producto
and to_char(a.fecha,'dd/mm/yyyy')= to_char(:new id_fecha, 'dd/mm/yyyy');
END;
Pero hecho esto lo unico que consigues es saber si existe un producto que cumple eso.
Ahora te falta la cláusula IF para tratar el error. (tal y como tenias)

Todo junto seria algo asi:

Cita:
CREATE or replace trigger tarifas_concurrentes
before insert on tarifas_djg
for each row
DECLARE
inicial date;
contador number;
BEGIN
SELECT count(1) into contador
FROM tarifas_djg a
WHERE a.id_producto = :new id_producto
and to_char(a.fecha,'dd/mm/yyyy')= to_char(:new id_fecha, 'dd/mm/yyyy');

if contador>0 then
--si es >0 quiere decir que existe algun registro que cumple eso, por lo tanto
raise_application_Error(-20001,'tarifas concurrentes');
end if;
END;
A ver si ahora te va bien!!!!

ya nos dices
  #9 (permalink)  
Antiguo 29/05/2009, 03:39
 
Fecha de Ingreso: agosto-2008
Mensajes: 73
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda con triggers

Buenos dias, muxas gracias por contestarme el trigger a compilado bien pero no ace del todo la funcion q deseo. El objetivo del trigger es que la fecha_inicio de la nueva tupla no puede estar comprendidad entre la fecha_inicio y fecha_fin de otra tupla ya existente del mismo producto.
¿Podriamos contactar via messenger para aclarar mas rapido y mejor las dudas?
Sin mas, muchas gracias por todo!
  #10 (permalink)  
Antiguo 29/05/2009, 04:07
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Ayuda con triggers

Hola Dani, siento decirte qeu no uso el messenger.
Lo tengo, pero me obliga a instalar la ultima version, y me da muchas pereza (aunque algún dia tendre qeu hacerlo....)

Respecto a lo que me ddices, efectivamente no es lo qeu buscas, ya que lo que estamso buscando en la select que hacemos, son aquellos productos cuya fecha sea igual a la introducida.

para arreglarlo, basta con poner la condicion que te falta.
Seria esto:

Cita:
CREATE or replace trigger tarifas_concurrentes
before insert on tarifas_djg
for each row
DECLARE
inicial date;
contador number;
BEGIN
SELECT count(1) into contador
FROM tarifas_djg a
WHERE a.id_producto = :new id_producto
and to_char(a.fecha_inicio,'dd/mm/yyyy')< to_char(:new id_fecha, 'dd/mm/yyyy')
and to_char(a.fecha_fin,'dd/mm/yyyy')> to_char(:new id_fecha, 'dd/mm/yyyy')

if contador>0 then
--si es >0 quiere decir que existe algun registro que cumple eso, por lo tanto
raise_application_Error(-20001,'tarifas concurrentes');
end if;
END;
si te das cuenta, hemos puesto una nueva condicion (y cambiado la anterior)
Ahora nos interesa buscar aquellos registros que cumplen que la fecha de inicio es menor que la introducida, y la fecha fin es mayor que la introducida. (es decir, que la introducida esté entre medias)
Si existe registro que cumple esto, PEEEEEEEEEEEEEEEEEEEE, error.

A ver qué tal ahora
  #11 (permalink)  
Antiguo 29/05/2009, 05:10
 
Fecha de Ingreso: agosto-2008
Mensajes: 73
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda con triggers

Ola javi de nuevo muxas gracias pero sigue sin funcionar del todo bien aunque visto el trigger tiene su logica pero no me deja meter un producto con una fecha mayor que la fecha inicial del mismo producto ya existente ;)
  #12 (permalink)  
Antiguo 29/05/2009, 05:59
 
Fecha de Ingreso: enero-2008
Mensajes: 268
Antigüedad: 16 años, 3 meses
Puntos: 11
Respuesta: Ayuda con triggers

Hola Dani.

Un notita lo primero. Por favor, cuando escribas un post, usa los signos de puntuación, etc etc etc, para que así, cuando leamos tus mensajes, podamos entenderlos correctamente.

Al tema:

Efectivamente no te deja. Por qué, porque en la cláusula WHERE de ls select del trigger, le hemos dicho que si la fecha que introduces es mayor que la de inicio, y menor que la de final, te de un error. (seguro que esto está ocurriendo, verdad??. Fíjate bien en los campos)

Me equivoco??
Si estoy en lo cierto, a ver si se te ocurre como arreglarlo. Si no, nos cuentas.
  #13 (permalink)  
Antiguo 29/05/2009, 07:38
 
Fecha de Ingreso: agosto-2008
Mensajes: 73
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Ayuda con triggers

Hola javi, ya hemos solucionao el problema te dejo aqui el trigger:



CREATE or replace trigger tarifas_concurrentes
before insert on tarifas_djg
for each row
DECLARE
inicial date;
contador number;
BEGIN
SELECT count(*) into contador
FROM tarifas_djg a
WHERE a.id_producto = :new.id_producto
and a.fecha_fin> :new.fecha_inicio;


if contador>0 then
--si es >0 quiere decir que existe algun registro que cumple eso, por lo tanto
raise_application_Error(-20001,'tarifas concurrentes');
end if;
END;


Muchas gracias y haber si los otros 3 triggers que tengo que hacer no me dan tanto problemas!
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 13:26.