Custo do produto baseado nas últimas compras

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Custo do produto baseado nas últimas compras

Mensagem por JoséQuintas »

Acho que não dá pra fazer de outro jeito, por um SELECT único por exemplo, ou dá?

Código: Selecionar todos

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.
custocontabil.png
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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Ana Mitoooo
Usuário Nível 3
Usuário Nível 3
Mensagens: 118
Registrado em: 17 Out 2018 10:00
Localização: Sobradinho/DF

Custo do produto baseado nas últimas compras

Mensagem por Ana Mitoooo »

Como ter lucro nas operações de Venda
Simulando em uma Planilha
CalcVenda.JPG
*Em se tratando de combustíveis (icms chega a até 33% no RJ) é necessário multiplicar o preço de custo em no mínimo 3x para começar a ter alguma lucratividade
**Quem quiser, fique a vontade para Ajustar/Adequar os cálculos que foram feitos por estimativa pessoal
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Custo do produto baseado nas últimas compras

Mensagem por JoséQuintas »

Ana Mitoooo escreveu:*Em se tratando de combustíveis (icms chega a até 33% no RJ) é necessário multiplicar o preço de custo em no mínimo 3x para começar a ter alguma lucratividade
Depende, se o custo já inclui os impostos pagos antecipadamente, a margem não precisa incluir novamente os impostos.
Pelo menos aqui em SPaulo, as distribuidoras já cobram tudo antecipado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Custo do produto baseado nas últimas compras

Mensagem por JoséQuintas »

A PROCEDURE durou pouco kkkkk

Hoje alterei pra FUNCTION.

Pra que perder tempo atualizando essa merd. a cada pedido, se pode fazer só na hora que precisar ?

Código: Selecionar todos

SELECT JPITEM.*, ze_ProdutoCustoContabil( 10 ) AS FUNCUSCON
Sei lá se vou mudar isso, mas usei o prefixo FUN pra indicar que vém de função.
Talvez altere depois pra CAL, indicando valor calculado.

Acho que vou fazer isso pra outras coisas também, como o último preço/última compra.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder