SET TERM ^ ; CREATE OR ALTER procedure PEPS_SAIDA ( CODVENDA integer, ITEM integer, PRO_CODIGO integer, QTDE_A_BAIXAR NUMERICO_15_4) as declare variable QTDE_BAIXA NUMERICO_15_4; declare variable QTDE NUMERICO_15_4; declare variable CUSTO NUMERICO_15_4; declare variable ID_PEPS integer; declare variable VALIDA_QTDE char(1); begin qtde_baixa = :qtde_a_baixar; while (qtde_baixa >0) do begin qtde = 0; custo = 0; id_peps = 0; if (exists(select saldo_qtde_movi, saldo_valor,id_peps from prod_estoque_peps where saldo_qtde_movi > 0 and pro_codigo =:pro_codigo)) then begin valida_qtde = 'S'; select first 1 saldo_qtde_movi, saldo_valor,id_peps from prod_estoque_peps where saldo_qtde_movi > 0 and pro_codigo =:pro_codigo order by data into :qtde, :custo, :id_peps; end else if (exists( select first 1 saldo_qtde_movi, saldo_valor,id_peps from prod_estoque_peps where entrada_valor > 0 and pro_codigo =:pro_codigo)) then begin valida_qtde = 'N'; select first 1 saldo_qtde_movi, saldo_valor,id_peps from prod_estoque_peps where entrada_valor > 0 and pro_codigo =:pro_codigo order by id_peps desc into :qtde, :custo, :id_peps; end else begin valida_qtde = 'N'; select first 1 saldo_qtde_movi, saldo_valor,id_peps from prod_estoque_peps where saldo_valor > 0 and pro_codigo =:pro_codigo and id_peps_movi is null order by id_peps desc into :qtde, :custo, :id_peps; end if ((:qtde < qtde_baixa) and (valida_qtde = 'S')) then begin insert into prod_estoque_peps ( id_peps, codvenda, codvenda_item, pro_codigo, data, saida_qtde, saida_valor, saida_total, id_peps_movi, saldo_qtde, saldo_valor, saldo_total) values ( gen_id(gen_id_peps,1), :codvenda, :item, :pro_codigo, current_date, :qtde, :custo, cast(:qtde * :custo as numeric(15,2)), :id_peps, 0, :custo, 0 ); update prod_estoque_peps set saldo_qtde_movi= saldo_qtde_movi-:qtde where id_peps=:id_peps; qtde_baixa = :qtde_baixa - :qtde; end else begin insert into prod_estoque_peps ( id_peps, pro_codigo, codvenda, codvenda_item, data, saida_qtde, saida_valor, saida_total, saldo_qtde, saldo_valor, saldo_total, id_peps_movi) values ( gen_id(gen_id_peps,1), :pro_codigo, :codvenda, :item, current_date, :qtde_baixa, :custo, cast(:qtde_baixa * :custo as numeric(15,2)), :qtde - :qtde_baixa, :custo, cast((:qtde - :qtde_baixa) * :custo as numeric(15,2)), :id_peps ); /* if (valida_qtde = 'S') then*/ update prod_estoque_peps set saldo_qtde_movi= saldo_qtde_movi-:qtde_baixa where id_peps=:id_peps; qtde_baixa = 0; end end end^ SET TERM ; ^