CREATE PROCEDURE ze_ProdutoCustoContabil( nIdProduto INT(11) )
BEGIN
DECLARE nQtde, nValor, nThisValor, nThisQtde, nQtdResta, nSaldoQtde, nSaldoValor DECIMAL(16,4) DEFAULT 0;
DECLARE dDatLan DATE;
DECLARE cReacao VARCHAR(50);
DECLARE nIdEstoque INT(11) DEFAULT 0;
DECLARE nCursorEOF INT(11) DEFAULT 0;
DECLARE SP_CURSOR CURSOR FOR
SELECT
IDESTOQUE, ESDATLAN, ESQTDE, ESVALOR, TRREACAO
FROM JPESTOQUE
LEFT JOIN JPTRANSACAO ON ESTRANSACAO = IDTRANSACAO
WHERE ESPRODUTO = nIdProduto AND ESTIPLAN = '2'
AND DATE( ESDATLAN ) > DATE( DATE_ADD( CURDATE(), INTERVAL -90 DAY ) )
AND ESNUMDEP = '1' AND TRREACAO LIKE '%CUSCON%'
ORDER BY ESDATLAN DESC, IDESTOQUE DESC LIMIT 100;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET nCursorEOF = 1;
SELECT
IEQTD1 + IEQTD2 + IEQTD3 + IEQTD4
INTO nQtdResta
FROM JPITEM
WHERE IDPRODUTO = nIdProduto;
OPEN SP_CURSOR;
THIS:WHILE nCursorEOF != 1 DO
FETCH SP_CURSOR INTO nIdEstoque, dDatLan, nQtde, nValor, cReacao;
SET nThisQtde := LEAST( nQtdResta, nQtde );
SET nThisValor := nThisQtde * nValor;
IF nQtdResta <= 0 THEN
LEAVE THIS;
END IF;
SET nSaldoValor := nSaldoValor + nThisValor;
SET nSaldoQtde := nSaldoQtde + nThisQtde;
SET nQtdResta := nQtdResta - nThisQtde;
END WHILE;
CLOSE SP_CURSOR;
IF nQtdResta > 0 THEN
SET nSaldoQtde := nSaldoQtde + nQtdResta;
SET nSaldoValor := nSaldoValor + ( nThisValor * nQtdResta );
END IF;
IF nSaldoQtde <= 0 THEN
SET nSaldoValor := nThisValor;
END IF;
SELECT nSaldoValor / GREATEST( nSaldoQtde, 1 ) AS CUSTOCONTABIL;
END
O que a rotina faz?
Ela pega o saldo atual de produtos, e considera os valores das últimas entradas, até completar o saldo.
tipo tem 30 de saldo, as ultimas compras foram 20 e 20, pega 20 de uma nota pelo preço dessa nota e 10 da outra com o preço da outra.
Soma tudo e divide por 30. O resultado é o que foi pago por essa quantidade nas últimas compras, a média disso.
Acho que por SELECT sozinho complicaria, porque precisaria select de select, por causa da ordem, e sei lá mais o que.
Agora é só fazer outra, processando cada produto e chamando essa.
Estou começando a achar que, quando precisar disso em DBF, não vou mais saber fazer.
quase esqueci... divulgar valor de cliente pode ser problema. cobri um pouco o valor.
Ia até colocar nota a nota, pra ver de onde veio o valor mas... complica... porque ficaria claro que se trata de combustÃvel.