Fórum firebird Procedure calculo #56068
28/05/2006
0
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
Curtir tópico
+ 0Posts
28/05/2006
Thomaz_prg
Gostei + 0
29/05/2006
Placido
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
Gostei + 0
29/05/2006
Thomaz_prg
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.
Gostei + 0
30/05/2006
Placido
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
Gostei + 0
30/05/2006
Sremulador
Gostei + 0
30/05/2006
Thomaz_prg
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.
Gostei + 0
04/06/2006
Placido
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
Gostei + 0
05/06/2006
Thomaz_prg
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.
Gostei + 0
11/06/2006
Placido
Realmente tudo funcionou perfeito, muito obrigado pela ajuda.
Fique com Deus.
Grato
Plácido
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)