[firebase-br] UDF para arredondamento financeiro

Francisco Thiago jeandeadlucky em yahoo.com.br
Sex Mar 3 16:53:08 -03 2006


Caros amigos

Sei que estou meio sumido, mas ainda assim gostaria de lhes fazer uma 
pergunta.

Estou tentando intalar uma udf no meu banco... tudo funciona quase que 
corretamente.
O problema é que, não importa o valor passado como parametro, a udf retorna 
0.000
Ela está no diretório udf do Firebird

Eis o código da procedure

library plug_udf;
uses
  SysUtils,
  Classes,
  funcoes in 'funcoes.pas';
{$R *.res}

exports RoundFinanc;

begin
end.

unit funcoes;

interface

  function RoundFinanc(Value: Double; Decimals: integer): double;cdecl; 
export;

implementation

uses Math, SysUtils;
(*
   Arredonda valores
   @param Value: Valor a ser arredondado
   @param Decimals: Qtd de casas decimais a serem retornadas
   @return: Valor arredondado
*)
function RoundFinanc(Value: Double; Decimals: integer): double;
var
  Factor, Fraction: Extended;
begin
  Factor := IntPower(10, Decimals);
  { A conversão para string e depois para float evita
    erros de arredondamentos indesejáveis. }
  Value := StrToFloat(FloatToStr(Value * Factor));
  Result := Int(Value);
  Fraction := Frac(Value);
  if Fraction >= 0.5 then
    Result := Result + 1
  else if Fraction <= -0.5 then
    Result := Result - 1;
  Result := Result / Factor;
end;

end.

Eu declaro no banco assim

declare external function f_RoundFinanc
double precision, integer
returns
double precision by value
entry_point 'RoundFinanc' module_name 'plug_udf';

E testo assim

select F_ROUNDFINANC(9.6,2)
from rdb$database


		
_______________________________________________________
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