PDA

Ver la Versión Completa : Procedimiento almacenado ejecutado desde un trigger.


Gabichu
30-09-2008, 17:39:45
hola a todos...
tengo el siguiente procedimiento AGREGAR_PENDIENTE , realmente no estoy segura de que tenga la estructura correcta, se ejecuta sin problemas desde un trigger, la cuestion es que se ejecuta la linea del insert sin importar si se cumple o no la condicion del if
CREATE PROCEDURE AGREGAR_PENDIENTE (
COD_PRESUP INTEGER)
AS
DECLARE VARIABLE CODCLIENTE INTEGER;
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CLIENTE VARCHAR(150);
DECLARE VARIABLE CODPRESUP INTEGER;
DECLARE VARIABLE CANTIDAD INTEGER;
begin
/*Insertar fecha, cod_cliente, cliente, cod_presupuesto */
select count(pendientes.cod_presup) from pendientes where pendientes.cod_presup=:codpresup into :cantidad;
if (:cantidad=0) then
begin
for
select presupuestos.cod_presup, presupuestos.cod_cliente,clientes.nombre||' '||clientes.apellido AS CLIENTE,fecha
from presupuestos, CLIENTES
where presupuestos.cod_presup=:cod_presup AND PRESUPUESTOS.cod_cliente=CLIENTES.cod_cliente into :CODpresup, :codcliente, :cliente,:fecha
do
begin
insert into pendientes(cod_cliente,FECHA_AT,cliente,cod_presup) values(:codcliente,:fecha, :cliente,:codpresup);
end
end

end

cualquier sugerencia es bienvenida...
este es el trigger
CREATE TRIGGER AU_PRESUPUESTO FOR PRESUPUESTOS
ACTIVE AFTER UPDATE POSITION 0
AS
begin
if (old.deposito='SI') then
execute procedure AGREGAR_PENDIENTE(old.cod_presup);
end

La idea es que si en la tabla PRESUPUESTOS el campo deposito (que puede tener dos valores, 'SI' y 'NO') cambia de NO a SI entonces se debe insertar un nuevo campo en la tabla PENDIENTES, el problema es que por cada vez que modifico la tabla de PRESUPUESTOS se inserta un nuevo registro en la tabla PENDIENTES, por lo tanto si modifico cualquier campo de la tabla presupuestos 10 veces, voy a tener 10 nuevos registros en PENDIENTES..

Espero no haberlos mareado, por favor ayudenme a resolver esto!!!
gracias...

maeyanes
30-09-2008, 18:04:11
Hola...

Prueba haciendo esto:


if ((cantidad = 0) or (cantidad is null)) then
/* Ejecutas el insert */



Saludos...

jhonny
30-09-2008, 18:05:02
Esque la variable :codpresup siempre tiene valor NULL cuando haces el primer "select", debido a que no le estas pasando ningun valor, para mi que estas un poco "confundida" por el parecido del nombre de la variable :codpresup con el parametro de entrada :cod_presup, por lo que la cosa en teoria debería quedar de la siguiente manera:


CREATE PROCEDURE AGREGAR_PENDIENTE (
COD_PRESUP INTEGER)
AS
DECLARE VARIABLE CODCLIENTE INTEGER;
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE CLIENTE VARCHAR(150);
DECLARE VARIABLE CODPRESUP INTEGER;
DECLARE VARIABLE CANTIDAD INTEGER;
begin
/*Insertar fecha, cod_cliente, cliente, cod_presupuesto */
select count(pendientes.cod_presup) from pendientes where pendientes.cod_presup=:COD_PRESUP into :cantidad;
if (:cantidad=0) then
begin
for
select presupuestos.cod_presup, presupuestos.cod_cliente,clientes.nombre||' '||clientes.apellido AS CLIENTE,fecha
from presupuestos, CLIENTES
where presupuestos.cod_presup=:cod_presup AND PRESUPUESTOS.cod_cliente=CLIENTES.cod_cliente into :CODpresup, :codcliente, :cliente,:fecha
do
begin
insert into pendientes(cod_cliente,FECHA_AT,cliente,cod_presup) values(:codcliente,:fecha, :cliente,:codpresup);
end
end
end

Gabichu
30-09-2008, 18:51:11
Gracias!!! Me causa gracia pensar que perdi tanto tiempo probando tantas cosas y el problema era tan sencillo de solucionar..

Aca esta el procedimiento y funciona correctamente!!!!

begin
/*Insertar fecha, cod_cliente, cliente, cod_presupuesto */
select count(pendientes.cod_presup) from pendientes where pendientes.cod_presup=:cod_presup into :cantidad;
if (:cantidad=0 or (:cantidad is NULL) ) then
begin
for
select presupuestos.cod_presup, presupuestos.cod_cliente,clientes.nombre||' '||clientes.apellido AS CLIENTE,fecha
from presupuestos, CLIENTES
where presupuestos.cod_presup=:cod_presup AND PRESUPUESTOS.cod_cliente=CLIENTES.cod_cliente into :CODpresup, :codcliente, :cliente,:fecha
do
begin
insert into pendientes(cod_cliente,FECHA_AT,cliente,cod_presup) values(:codcliente,:fecha, :cliente,:codpresup);
end
end

end