[firebase-br] Arredondamento no Firebird!

Francisco Thiago jeandeadlucky em yahoo.com.br
Seg Ago 29 16:50:50 -03 2005


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/





Mais detalhes sobre a lista de discussão lista