firebird Procedure calculo
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
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
Curtidas 0
Respostas
Thomaz_prg
28/05/2006
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.
GOSTEI 0
Placido
28/05/2006
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
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
Thomaz_prg
28/05/2006
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.
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
Placido
28/05/2006
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
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
Sremulador
28/05/2006
você pode fazer isto diretamente em seu próprio sistema e não no banco de dados...
GOSTEI 0
Thomaz_prg
28/05/2006
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:
Para usar, basta fazer assim:
Teste, veja se é o que você quer, e se for, é só alterar para funcionar com seu bando de dados.
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
Placido
28/05/2006
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
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
Thomaz_prg
28/05/2006
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:
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.
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
Placido
28/05/2006
Thomaz boa tarde!
Realmente tudo funcionou perfeito, muito obrigado pela ajuda.
Fique com Deus.
Grato
Plácido
Realmente tudo funcionou perfeito, muito obrigado pela ajuda.
Fique com Deus.
Grato
Plácido
GOSTEI 0