Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Procedimiento almacenado ejecutado desde un trigger. (https://www.clubdelphi.com/foros/showthread.php?t=60382)

Gabichu 30-09-2008 17:39:45

Procedimiento almacenado ejecutado desde un trigger.
 
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
Código SQL [-]
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
Código SQL [-]
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:

Código SQL [-]
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:

Código SQL [-]
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!!!!

Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 01:39:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi