Fórum firebird Procedure calculo #56068

28/05/2006

0

Bom dia!
Utilizo o firebird 1.5.3

Tenho um procedure que calcula o valor de cada parcela em funcao do valor da venda.
Exemplo
Valor da venda 11.89 PVRVENDA
Plano 2 parcelas PPLANO

Defini uma variavel mvrparcela numeric(12,2)

Faco a divisão

MVRPARCELA = (PVRVENA / PPLANO

O RESULTADO DA DIVISÃO DA O VALOR 5.945 OU SEJA NO MOMENTO DA INSERÇÃO
O SISTEMA ESTA GERANDO DUAS PARCELAS DE 5.95 ESTA GRAVANDO 1 CENTAVO A MAIS...
A MINHA DÚVIDA É A SEGUINDA COMO FAZER PARA UU GRAVAR SOMENTE 5.94 NA PRIMEIRA PARCELA E 5.95 NA SEGUNDA PARCELA
TENTEI USAR A FUNÇÃO (CAST), MAS NAO CONSEGUI...

GRATO

PLACIDO


Placido

Placido

Responder

Posts

28/05/2006

Thomaz_prg

usando a divisão, você encontraria o valor da primeira parcela. Daí faça a substração desse valor, do valor total da conta. Daí você teria exatamente o valor que quer.


Responder

Gostei + 0

29/05/2006

Placido

Bom dia meu amigo Tomaz..
Acho que você não entendeu a minha explicação....eu quero utilizar um metodo para trabalhar com as duas casas decimais
faço uma divisão 10.57 / 2 o resultado é 5.285 eu quero utililizar um metodo para salvar o valor 5.28
Tentei utilizar o cast mas não consegui....
Grato
Plácido


Responder

Gostei + 0

29/05/2006

Thomaz_prg

Creio não ter me expressado direito... o que eu havia proposta era pra você fazer assim:

DECLARE VARIABLE PARC_1 AS NUMERIC(15,2);
DECLARE VARIABLE PARC_2 AS NUMERIC(15,2);


PARC_1 = CAST( (PVRVENDA / PPLANO ) AS NUMERIC(15,2) )
PARC_2 = CAST( (PVRVENDA - PARC_1) AS NUMERIC(15,2) )

Dessa forma, você teria o valor correto. Porém, para a inserção, sugiro que use um laço while.


Responder

Gostei + 0

30/05/2006

Placido

Tomaz bom dia....
Fiz isto que você falou e o problema persiste....

VALOR4 = CAST( (:VALOR / :PPLANO ) AS NUMERIC(15,2));

defini a variavel como numeric(15,2) e o resultado da divisão da 5.285 e o sistema gra duas parcelas de 5.29 a minha pergunta é a seguinte eu quero usar um metodo que eu salve somente 5.28, a forma como você fez não resolveu....

Grato pela atenção

Placido


Responder

Gostei + 0

30/05/2006

Sremulador

você pode fazer isto diretamente em seu próprio sistema e não no banco de dados...


Responder

Gostei + 0

30/05/2006

Thomaz_prg

Amigo, creio que você não entendeu o espírito da coisa... fiz uma procedure que, você lança o valor da conta e a quantidade de parcelas,e e a procedure irá te mostrar os valores de vada parcela:

SET TERM ^ ;

CREATE PROCEDURE VLR_PARCELAS (
    VALOR NUMERIC(15,2),
    PARCELAS INTEGER)
RETURNS (
    VALORES DECIMAL(15,2))
AS
DECLARE VARIABLE VPARCELAS NUMERIC(15,2);
DECLARE VARIABLE VUPARCELA NUMERIC(15,2);
DECLARE VARIABLE I INTEGER;
begin
  VPARCELAS = (:VALOR / :PARCELAS ) * 100;
  VPARCELAS = CAST( (:VPARCELAS  ) AS INTEGER );
  VPARCELAS = :VPARCELAS / 100;
  I = 1;
  VUPARCELA = 0;
  WHILE (:I < :PARCELAS) DO BEGIN
    VALORES = :VPARCELAS;
    VUPARCELA = :VUPARCELA + :VALORES;
    I = :I + 1;
    SUSPEND;
  END
  VALORES = :VALOR - :VUPARCELA;
  suspend;
end^

SET TERM ; ^


Para usar, basta fazer assim:

SELECT * FROM VLR_PARCELAS( 11.89 , 2 )


Teste, veja se é o que você quer, e se for, é só alterar para funcionar com seu bando de dados.


Responder

Gostei + 0

04/06/2006

Placido

Thomaz boa tarde...
Obrigado pela diga, mas não consegui resolver o problema, acho que expressei mal.....
Tenho o seguinte problema, tenho uma procedure calcula o valor de cada parcela baseado no valor da venda e o plano de venda ex.

Valor da Venda = 11.70 MvrVenda
Plano = 3 Mplano
Valor de cada parcela = MvrVenda / 3 MvrParcela (3.9633333)

Quero salvar sempre o valor 3.96, p]ou seja somente 2 casas decimais
3.96
Fazendo o processo ao contrario eu vou saber se tem valor para somar na ultima parcela exemplo
Valor de cada parcela MvrParcela * Mplano = Mparcelax (11.88)
Valor da venda VvrVenda - Mparcelax = 0.01 , ou seja tenho que gravar
na primeira parcela o valor de 3.96
na segunda parcela o valor de 3.96
na terceira parcela o valro de 3.97 que da o valor total da venda 11.89
Quero que voce me ajede a resolver este problema.

Grato


Placido


Responder

Gostei + 0

05/06/2006

Thomaz_prg

Amigo... se vc prestar atenção no código da procedure que postei, ela faz isso... ela pega unicamente os 2 dígitos esquecendo os demais. No trecho:

  VPARCELAS = (:VALOR / :PARCELAS ) * 100; 
  VPARCELAS = CAST( (:VPARCELAS  ) AS INTEGER ); 
  VPARCELAS = :VPARCELAS / 100; 


ela faz justamente o que você quer. Por exemplo, se o resultado da divisão do valor pela quantidade de parcelas der 1,84966 a vonta faria o seguinte, multiplicaria por 100, e teria o valor 184,966 então ao se transformar isso em um inteiro, o que está após a vírgula seria descartado ficando 184. Depois, divido novamente por 100 e tenho o valor 1,84 que era o desejado.


Responder

Gostei + 0

11/06/2006

Placido

Thomaz boa tarde!
Realmente tudo funcionou perfeito, muito obrigado pela ajuda.
Fique com Deus.
Grato

Plácido


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar