[firebase-br] Arredondamento no Firebird!
benjamim
benjamimo em agesul.ms.gov.br
Ter Ago 30 12:38:33 -03 2005
Olá Francisco,
Eu peguei isto nas respostas encontradas neste forum, só não tenho os nomes
dos colegas que responderam, para dar o direito. Espero que resolva.
Benjamim
Cast( ( 26,58*1.05678 *100 ) as Integer ) /100
Eu, para truncar, subtraio 5x10e-(N-1) e utilizo o cast, que arredonda.
Simplificando:
Se quero duas casas decimais, arrendo (valor-0.005).
Uma casa, (valor - 0.05).
Nenhuma casa, (valor - 0.5)
Exemplos:
Select
cast(1.9999999999 - 0.005 as numeric(15,2)) as DUAS,
cast(1.9999999999 - 0.05 as numeric(15,1))as UMA,
cast(1.9999999999 - 0.5 as integer) as NENHUMA
from rdb$database
DUAS | UMA | NENHUMA
----------|------------|----------------
1.99 | 1.9 | 1
----- Original Message -----
From: "Francisco Thiago" <jeandeadlucky em yahoo.com.br>
To: "Antonio Carlos" <a.lima.silva em terra.com.br>; "FireBase"
<lista em firebase.com.br>
Sent: Tuesday, August 30, 2005 9:34 AM
Subject: Re: [firebase-br] Arredondamento no Firebird!
> Os testes estão sendo feitos no IBExpert
>
>
> ----- Original Message -----
> From: "Antonio Carlos" <a.lima.silva em terra.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Tuesday, August 30, 2005 9:04 AM
> Subject: Re: [firebase-br] Arredondamento no Firebird!
>
>
> Caro Francisco :
>
> Voce esta usando qual componente de acesso seria DBExpress e o
> SQLStoreProc
> ?
>
> ----- Original Message -----
> From: "Francisco Thiago" <jeandeadlucky em yahoo.com.br>
> To: "FireBase" <lista em firebase.com.br>
> Sent: Monday, August 29, 2005 4:50 PM
> Subject: [firebase-br] Arredondamento no Firebird!
>
>
>> Pessoal!!!
>>
>> Estamos com um probleminha aqui.
>>
>> Meu amigo, Ademar, está escrevendo uma SP para cálculos financeiros. No
>> entantdo, a aproximação feita pelo firebird não está... digamos... muito
>> correto... E gostaria de saber como fazer para sanar este problema...
>> Imagino que tenha alguma coisa relativa a declaração no campo na SP...
>>
>> Estamos retornando valores Numeric(12,2), Numeric(7,4)
>>
>>
>> O código da SP segue no final do e-mail....
>>
>> Obrigado a todos que puderem nos ajudar
>>
>>
>>
>> []'s
>>
>> Francisco Thiago de Almeida
>> Enter & Plug Informática
>> Divisão: Desenvolvimento e Banco de dados
>> Franca / SP
>> msn: thiago em enterplug.com.br
>>
>>
>> CREATE PROCEDURE RESUMOOPERACAO (
>> P_OPER_CODIGO INTEGER)
>> RETURNS (
>> OPER_TOTAL NUMERIC(12,2),
>> OPER_TOTFATOR NUMERIC(12,2),
>> OPER_TOTADVALOREN NUMERIC(12,2),
>> OPER_TOTIOF NUMERIC(12,2),
>> OPER_TOTCPMF NUMERIC(12,2),
>> OPER_TOTCHEQUE NUMERIC(12,2),
>> OPER_SUBTOTAL NUMERIC(12,2),
>> OPER_TOTLIQ NUMERIC(12,2)
>> )
>> AS
>> DECLARE VARIABLE V_OPER_CPMF NUMERIC(7,4);
>> DECLARE VARIABLE V_OPER_IOF NUMERIC(7,4);
>> DECLARE VARIABLE V_OPER_FATOR_CHEQUE_ACIMA NUMERIC(7,4);
>> DECLARE VARIABLE V_OPER_CHEQUE_ACIMA NUMERIC(12,2);
>> DECLARE VARIABLE V_OPIT_DIAS INTEGER;
>> DECLARE VARIABLE V_OPIT_VALOR NUMERIC(12,2);
>> DECLARE VARIABLE V_OPER_PERCFATORCOMPRA NUMERIC(7,4);
>> DECLARE VARIABLE V_OPIT_ADVALOREN NUMERIC(12,2);
>> DECLARE VARIABLE V_OPIT_CPMF NUMERIC(12,2);
>> DECLARE VARIABLE V_OPIT_IOFTOT NUMERIC(7,4);
>> DECLARE VARIABLE V_OPIT_VALORIOF NUMERIC(12,2);
>> DECLARE VARIABLE V_OPIT_FATOR NUMERIC(12,2);
>> begin
>>
>> /*ZERO OS RETORNOS*/
>>
>> OPER_SUBTOTAL = 0;
>> OPER_TOTAL = 0;
>> OPER_TOTFATOR = 0;
>> OPER_TOTADVALOREN = 0;
>> OPER_TOTIOF = 0;
>> OPER_TOTCPMF = 0;
>> select
>> OPERACAO.OPER_CPMF,
>> OPERACAO.OPER_IOF,
>> OPERACAO.OPER_FATOR_CHEQUE_ACIMA,
>> OPERACAO.OPER_CHEQUE_ACIMA,
>> OPERACAO.OPER_PERCFATORCOMPRA
>> from
>> OPERACAO
>> where
>> OPERACAO.OPER_CODIGO = :P_OPER_CODIGO
>> into
>> :V_OPER_CPMF,
>> :V_OPER_IOF,
>> :V_OPER_FATOR_CHEQUE_ACIMA,
>> :V_OPER_CHEQUE_ACIMA,
>> :V_OPER_PERCFATORCOMPRA;
>>
>> if (V_OPER_CPMF IS NULL) then V_OPER_CPMF = 0;
>> if (V_OPER_IOF IS NULL) then V_OPER_IOF = 0;
>> if (V_OPER_FATOR_CHEQUE_ACIMA IS NULL) then V_OPER_FATOR_CHEQUE_ACIMA
>> = 0;
>> if (V_OPER_CHEQUE_ACIMA IS NULL) then V_OPER_CHEQUE_ACIMA = 0;
>> if (V_OPER_PERCFATORCOMPRA IS NULL) then V_OPER_PERCFATORCOMPRA = 0;
>>
>> for select
>> OPERACAO_ITEM.OPIT_DIAS,
>> OPERACAO_ITEM.OPIT_VALOR,
>> OPERACAO_ITEM.OPIT_ADVALOREN
>> from
>> OPERACAO_ITEM
>> join OPERACAO on OPERACAO.OPER_CODIGO = OPERACAO_ITEM.OPER_CODIGO
>> where
>> OPERACAO_ITEM.OPER_CODIGO = :P_OPER_CODIGO
>> into
>> :V_OPIT_DIAS,
>> :V_OPIT_VALOR,
>> :V_OPIT_ADVALOREN
>> do
>> begin
>> if (V_OPIT_DIAS IS NULL) then V_OPIT_DIAS = 0;
>> if (V_OPIT_VALOR IS NULL) then V_OPIT_VALOR = 0;
>> if (V_OPIT_ADVALOREN IS NULL) then V_OPIT_ADVALOREN = 0;
>>
>> /*SOMO O VALOR DAS DUPLICATAS*/
>> OPER_TOTAL = OPER_TOTAL + V_OPIT_VALOR;
>>
>> /*ACHO O VALOR DO FATOR DE COMPRA*/
>>
>> V_OPIT_FATOR = ((V_OPIT_VALOR * ((V_OPER_PERCFATORCOMPRA/30)
>> * V_OPIT_DIAS))/100);
>>
>> if (V_OPIT_FATOR IS NULL) then
>> V_OPIT_FATOR = 0;
>>
>> OPER_TOTFATOR = OPER_TOTFATOR + V_OPIT_FATOR;
>>
>> /*ACHO O VALOR DO CPMF*/
>>
>> V_OPIT_CPMF = ((V_OPIT_VALOR - V_OPIT_FATOR - V_OPIT_ADVALOREN) *
>> (V_OPER_CPMF)/100);
>>
>> IF (V_OPIT_CPMF IS NULL) THEN
>> V_OPIT_CPMF = 0;
>>
>> OPER_TOTCPMF = OPER_TOTCPMF + V_OPIT_CPMF;
>>
>> /*ACHO O VALOR IOF*/
>> V_OPIT_IOFTOT = V_OPER_IOF * V_OPIT_DIAS;
>>
>> V_OPIT_VALORIOF = ((V_OPIT_VALOR - V_OPIT_FATOR - V_OPIT_ADVALOREN)
>> *
>> (V_OPIT_IOFTOT)/100);
>>
>> if (V_OPIT_VALORIOF IS NULL) then
>> V_OPIT_VALORIOF = 0;
>>
>> OPER_TOTIOF = OPER_TOTIOF + V_OPIT_VALORIOF;
>>
>> /*ACHO O TOTAL ADVALOREN*/
>> OPER_TOTADVALOREN = OPER_TOTADVALOREN + V_OPIT_ADVALOREN;
>>
>> V_OPIT_VALOR = 0; V_OPIT_FATOR = 0; V_OPIT_CPMF = 0;
>> V_OPIT_IOFTOT = 0; V_OPIT_VALORIOF = 0; V_OPIT_ADVALOREN = 0;
>> end
>>
>> OPER_SUBTOTAL = OPER_TOTAL - OPER_TOTFATOR - OPER_TOTADVALOREN -
>> OPER_TOTIOF -
>> OPER_TOTCPMF;
>> if (OPER_SUBTOTAL >= V_OPER_CHEQUE_ACIMA) then
>> begin
>> OPER_TOTCHEQUE = (OPER_SUBTOTAL *
>> V_OPER_FATOR_CHEQUE_ACIMA)/100;
>> OPER_TOTLIQ = OPER_SUBTOTAL - OPER_TOTCHEQUE;
>> end
>> else
>> begin
>> OPER_TOTCHEQUE = 0;
>> OPER_TOTLIQ = OPER_SUBTOTAL;
>> end
>> suspend;
>> end
>>
>>
>>
>>
>>
>> _______________________________________________________ Yahoo! Acesso
>> Grátis - Internet rápida e grátis. Instale o discador agora!
>> http://br.acesso.yahoo.com/
>>
>>
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
>> Para editar sua configuração na lista, use o endereço
>> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>>
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
>
>
>
>
> _______________________________________________________ Yahoo! Acesso
> Grátis - Internet rápida e grátis. Instale o discador agora!
> http://br.acesso.yahoo.com/
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço
> http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
Mais detalhes sobre a lista de discussão lista