[firebase-br] Arredondamento no Firebird!

Antonio Carlos a.lima.silva em terra.com.br
Ter Ago 30 09:04:03 -03 2005


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
>
> 






Mais detalhes sobre a lista de discussão lista