Procedure com erro no calculo! (RESOLVIDO)

3 respostas
R

Olá pessoal, espero que possam me ajudar, estou com um problema com uma procedure,
a ideia é que ela faça um rateio do preço a cada nova compra... muito bem... aqui esta a procedure:

SET TERM ^ ;  
  
create or alter procedure RATEIA_PRECO (  
    COD_PRODUTO integer,  
    QTDE_NOVA numeric(10,2),  
    VALOR_NOVO numeric(10,2))   
as  
declare variable VALOR_ATUAL numeric(10,2);  
declare variable QTDE_ATUAL numeric(10,2);  
declare variable QTDE_TOTAL numeric(15,2);  
declare variable VALOR_TOTAL_ATUAL numeric(10,2);  
declare variable VALOR_RATEADO numeric(10,2);  
begin  
  select T_PRODUTO.QTDE_ATUAL_PRO   
  from T_PRODUTO   
  where T_PRODUTO.COD_PRO = :COD_PRODUTO   
  into :QTDE_ATUAL;  
  
  select T_PRODUTO.PRECO_UNI_PRO   
  from T_PRODUTO   
  where T_PRODUTO.COD_PRO = :COD_PRODUTO   
  into :VALOR_ATUAL;  
  
  VALOR_TOTAL_ATUAL =(QTDE_ATUAL * VALOR_ATUAL);  
  QTDE_TOTAL =(QTDE_NOVA + QTDE_ATUAL);  
  VALOR_RATEADO =((VALOR_NOVO + VALOR_TOTAL_ATUAL) / QTDE_TOTAL);  
  
  if (VALOR_TOTAL_ATUAL = 0) then  
  begin  
    VALOR_RATEADO =(VALOR_RATEADO * 2);  
  end   
  
  update T_PRODUTO   
  set T_PRODUTO.PRECO_UNI_PRO = :VALOR_RATEADO   
  where T_PRODUTO.COD_PRO = :COD_PRODUTO;  
end^  
  
SET TERM ; ^  
  
GRANT SELECT,UPDATE ON T_PRODUTO TO PROCEDURE RATEIA_PRECO;  
  
GRANT EXECUTE ON PROCEDURE RATEIA_PRECO TO SYSDBA;

Muito bem, supondo que eu esteja fazendo uma compra, e quando salvar, para cada item de compra eu chamo esta procedure
passando como parâmetro o código do produto, a quantidade que foi comprada, e o valor total do item, exemplo:

Tabela Produto.
Código: 1
Nome: X
Qtde.: 150
Preço Unitario: 63,20

Compra.
Código Produto: 1
Qtde.: 150
Preço Unitário: 100,00
Preço total: 15.000,00

Agora seguindo a procedure, ela busca os dados da tabela e guarda os dados nas variáveis QTDE_ATUAL e VALOR_ATUAL logo
ela pega a variável VALOR_TOTAL_ATUAL e atribui à essa variável o resultado da multiplicação da QTDE_ATUAL * VALOR_ATUAL.

Após isso ela atribui o resultado de QTDE_NOVA + QTDE_ATUAL para a variável QTDE_TOTAL, Ok.

Somente agora ela faz a conta que irá ratear o valor para o produto, que seria atribuir o resultado de ((VALOR_NOVO + VALOR_TOTAL_ATUAL) / QTDE_TOTAL)
à variável VALOR_RATEADO sendo que a variável VALOR_NOVO corresponde ao valor que eu passo como parametro, muito bem, seguindo o exemplo anterior
ficaria assim:

//   VALOR_NOVO = 15.000,00;
//   QTDE_NOVA = 150;
  
//   QTDE_ATUAL = 150;
//   VALOR_ATUAL = 63.20;

  VALOR_TOTAL_ATUAL =(150 * 63.20);  // = 9480  
  QTDE_TOTAL =(150 + 150);  // = 300 
  VALOR_RATEADO =((15.000 + 9480) / 300);  // = 81,60

O novo valor unitário deveria ser 81,60, más não é o que está acontecendo, o novo valor está vindo como: 75,47

por isso não estou entendendo o que esta acontecendo...

se alguém puder me ajudar eu agradeço!

3 Respostas

R

desculpem, mas como demoraram para responder acabei achando o problema, e agora já esta resolvido…

xD’

Andre_Rosa

Seria interessante se você postasse como resolveu.

R

muito bem, é um pouco humilhante mas vamos lá:

a procedure está correta, mas eu a estava chamando depois de salvar os dados,
e tenho uma trigger que atualiza a quantidade do produto assim que inserido um item de compra,
e assim quando executava a procedure ela pegava a quantidade nova, e não a que antiga que era o que
me interessava... muito bem, mas acabei dando uma limpada no código para deixa-la mais apresentável....

SET TERM ^ ;

create or alter procedure RATEIA_PRECO (
    COD_PRODUTO integer,
    QTDE_NOVA numeric(10,2),
    VALOR_NOVO numeric(10,2)) 
as
declare variable VALOR_ATUAL numeric(10,2);
declare variable QTDE_ATUAL numeric(10,2);
declare variable QTDE_TOTAL numeric(15,2);
declare variable VALOR_TOTAL_ATUAL numeric(10,2);
declare variable VALOR_RATEADO numeric(10,2);
begin
  select T_PRODUTO.QTDE_ATUAL_PRO, T_PRODUTO.PRECO_UNI_PRO 
  from T_PRODUTO 
  where T_PRODUTO.COD_PRO = :COD_PRODUTO 
  into :QTDE_ATUAL, :VALOR_ATUAL;

  VALOR_TOTAL_ATUAL =(QTDE_ATUAL * VALOR_ATUAL);
  QTDE_TOTAL =(QTDE_NOVA + QTDE_ATUAL);
  VALOR_RATEADO =((VALOR_NOVO + VALOR_TOTAL_ATUAL) / QTDE_TOTAL);

  update T_PRODUTO 
  set T_PRODUTO.PRECO_UNI_PRO = :VALOR_RATEADO 
  where T_PRODUTO.COD_PRO = :COD_PRODUTO;
end^

SET TERM ; ^

GRANT SELECT,UPDATE ON T_PRODUTO TO PROCEDURE RATEIA_PRECO;

GRANT EXECUTE ON PROCEDURE RATEIA_PRECO TO SYSDBA;
Criado 3 de julho de 2011
Ultima resposta 4 de jul. de 2011
Respostas 3
Participantes 2