create or alter procedure SP_ATUALIZA_PRODUTO_CUSTESTOQUE ( CAMPO varchar(10), D1 date, D2 date, C1 integer, C2 integer) as declare variable PARAR_LACO char(1); declare variable V_CODPRODUTO integer; declare variable V_QTDE numeric(15,3); declare variable V_FRETE numeric(15,3); declare variable V_TOTAL numeric(15,3); declare variable V_CUSTO numeric(15,3); declare variable V_FATOR numeric(15,4); declare variable V_TCONVERSAO char(1); declare CRSR cursor for ( select PIT_CODPRODUTO, PROD_FATORCONVERSAO, PROD_TIPOCONVERSAO, sum(iif(PED_FINALIDADE in ('1', '4'), coalesce(PIT_QTDE, 0), 0)) QTDE, sum(iif(PED_SITFRETE = '1', coalesce(PIT_VALORFRETE, 0), 0)) as FRETE, cast(sum(((PIT_TOTAL - coalesce(PIT_VALORDESCONTO, 0)) + coalesce(PIT_IPI, 0) + coalesce(PIT_ICMSST, 0) + coalesce(PIT_OUTRAS, 0))) as numeric(13,2)) as TOTAL, cast(sum((PIT_TOTAL - coalesce(PIT_VALORDESCONTO, 0) + coalesce(PIT_IPI, 0) + coalesce(PIT_ICMSST, 0) + coalesce(PIT_ACRESCIMO, 0) + coalesce(PIT_OUTRAS, 0))) / sum(iif(PED_FINALIDADE <> '2', coalesce(PIT_QTDE, 0), 0)) as numeric(13,2)) as CUSTO from TBPEDIDO_ITENS inner join TBPEDIDO on PIT_CODPEDIDO = PED_CODIGO left join TBPRODUTO on PROD_CODIGO = PIT_CODPRODUTO where PED_TIPO = '1' and PED_REGISTRO = 'S' and PED_REGISTRO = 'S' and PED_SITUACAO = 'FATURADO' and PED_DATASAIDA between :D1 and :D2 and PIT_CODPRODUTO >= :C1 and PIT_CODPRODUTO <= :C2 group by 1, 2, 3); BEGIN OPEN CRSR; PARAR_LACO = 'N'; WHILE (PARAR_LACO = 'N') DO BEGIN FETCH CRSR INTO V_CODPRODUTO, V_FATOR, V_TCONVERSAO, V_QTDE, V_FRETE, V_TOTAL, V_CUSTO ; IF (ROW_COUNT = 1) THEN BEGIN if (v_fator <> 1) then BEGIN IF (V_TCONVERSAO = 'M') THEN V_CUSTO = (:V_CUSTO + :V_FRETE) / :V_FATOR; IF (V_TCONVERSAO = 'D') THEN V_CUSTO = (:V_CUSTO + :V_FRETE) * :V_FATOR; END if (campo = 'FISCAL') then UPDATE TBPRODUTO SET PROD_CUSTOESTOQUE = :V_CUSTO WHERE PROD_CODIGO = :V_CODPRODUTO; if (campo = 'AUX') then UPDATE TBPRODUTO SET PROD_AUX = :V_CUSTO WHERE PROD_CODIGO = :V_CODPRODUTO; END ELSE PARAR_LACO = 'S'; END CLOSE CRSR; END