[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