create or alter procedure SP_INSERE_INVENTARIO ( CODINVENTARIO integer, D1 date, D2 date) as declare variable PARAR_LACO char(1); declare variable V_CODPRODUTO integer; declare variable V_INICIAL numeric(15,3); declare variable V_ENTRADA numeric(15,3); declare variable V_SAIDA 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 (with ES as ( select IVI_CODPRODUTO as CODPROD, IVI_ESTOQUE as INICIAL, 0 as ENTRADA, 0 as SAIDA from TBINVENTARIO_ITENS where IVI_CODINVENTARIO = (select max(INV_CODIGO) from TBINVENTARIO where INV_DATAFINAL < :D2 and INV_CONFIRMADO = 'S') union select PIT_CODPRODUTO as CODPROD, 0 as INICIAL, 0 as ENTRADA, sum(iif(PED_FINALIDADE in ('1', '4'), (PIT_QTDE), 0)) as SAIDA from TBPEDIDO_ITENS inner join TBPEDIDO on (PED_CODIGO = PIT_CODPEDIDO) where PED_CODIGO > 1 and PED_SITUACAO in ('FATURADO', 'DEVOLUCAO') and PED_TIPO = '2' and PED_REGISTRO = 'S' and PIT_REGISTRO = 'S' and PED_DATAFATURA between :D1 and :D2 group by PIT_CODPRODUTO union select PIT_CODPRODUTO as CODPROD, 0 as INICIAL, sum(iif(PED_FINALIDADE in ('1', '4'), (PIT_QTDE), 0)) as ENTRADA, 0 as SAIDA from TBPEDIDO_ITENS inner join TBPEDIDO on (PED_CODIGO = PIT_CODPEDIDO) left join TBPRODUTO on (PROD_CODIGO = PIT_CODPRODUTO) where PED_CODEMP = 1 and PED_SITUACAO in ('FATURADO', 'DEVOLUCAO') and PED_TIPO = '1' and PED_REGISTRO = 'S' and PIT_REGISTRO = 'S' and PED_DATASAIDA between :D1 and :D2 group by PIT_CODPRODUTO) select PROD_CODIGO, sum(ES.INICIAL) as INICIAL, sum(iif(PROD_TIPOCONVERSAO = 'M', ES.ENTRADA * PROD_FATORCONVERSAO, ES.ENTRADA / PROD_FATORCONVERSAO)) as ENTRADA, sum(ES.SAIDA) as SAIDA, PROD_CUSTOESTOQUE as PROD_PRECOCUSTO --iif(coalesce(prod_codestoque,0) > 0,prod_codestoque, prod_codigo) as prod_codestoque, from ES left join TBPRODUTO on (ES.CODPROD = PROD_CODIGO) where PROD_CODTIPOITEM not in (7, 8, 9, 10, 99) group by 1, 5); BEGIN OPEN CRSR; PARAR_LACO = 'N'; WHILE (PARAR_LACO = 'N') DO BEGIN FETCH CRSR INTO V_CODPRODUTO, V_INICIAL, V_ENTRADA, V_SAIDA, V_CUSTO; IF (ROW_COUNT = 1) THEN BEGIN INSERT INTO tbinventario_itens(IVI_CODINVENTARIO,IVI_CODPRODUTO, IVI_INICIAL, IVI_ENTRADA, IVI_SAIDA, IVI_CUSTO, IVI_ESTOQUE, IVI_TOTAL) VALUES(:CODINVENTARIO, :V_CODPRODUTO, :V_INICIAL, :V_ENTRADA, :V_SAIDA, :V_CUSTO, (:V_INICIAL + :V_ENTRADA - :V_SAIDA),(:V_INICIAL + :V_ENTRADA - :V_SAIDA) * :V_CUSTO ); END ELSE PARAR_LACO = 'S'; END CLOSE CRSR; END