Buenos día amigos foreros, hace algún tiempo tomé el código de Atexto y lo puse en una dll para utilizarla en una base de datos firebird.
Me funcionó sin ningún problema, pero hace poco la quise utilizar nuevamente y me muestra el siguiente error:
Código SQL
[-]Invalid token.
invalid request BLR at offset 480.
function A_LETRAS is not defined.
module name or entrypoint could not be found.
Luego volví a compilar el proyecto utilizado lazarus y todo me fue perfectamente bien, hasta que monté la udf en un equipo con XP.
la udf la compilé en un equipo con win7 utilizando Delphi y Lazarus, en ambos casos me funcionó bien.
Mi pregunta es qué estoy haciendo mal?
El código en Delphi es el siguiente:
Código Delphi
[-]unit Conversiones;
interface
uses ib_util, SysUtils, Classes;
function NumeroALetra(var fNumero: Double; FMoneda: PChar): PChar; cdecl; export;
implementation
function NumeroALetra(var fNumero: Double; FMoneda: PChar): PChar;
function Cambiar_na_a_masculino(Texto: String): String;
var
P: Integer;
begin
Result:= Texto;
P:= Pos('na', Result);
while P > 0 do begin
Delete(Result, P+1, 1);
P:= Pos('na', Result);
end;
end;
function Cambiar_as_a_masculino(Texto: String): String;
var
P: Integer;
begin
Result:= Texto;
P:= Pos('as', Result);
while P > 0 do begin
Result[P]:='o';
P:= Pos('as', Result);
end;
end;
function Unidades(numero:Integer): String;
begin
case numero of
0: Result:='';
1: Result:='un';
2: Result:='dos';
3: Result:='tres';
4: Result:='cuatro';
5: Result:='cinco';
6: Result:='seis';
7: Result:='siete';
8: Result:='ocho';
9: Result:='nueve';
end;
end;
function Decenas(numero:integer): String;
begin
Case numero of
0:Result:='';
1..9:Result:=Unidades(numero);
10: Result:='diez';
11: Result:='once';
12: Result:='doce';
13: Result:='trece';
14: Result:='catorce';
15: Result:='quince';
16: Result:='dieciséis';
17: Result:='diecisiete';
18: Result:='dieciocho';
19: Result:='diecinueve';
20: Result:='veinte';
21,24,25,27..29: Result:='veinti'+Unidades(numero mod 10);
22: Result:='veintidós';
23: Result:='veintitrés';
26: Result:='veintiséis';
30: Result:='treinta';
40: Result:='cuarenta';
50: Result:='cincuenta';
60: Result:='sesenta';
70: Result:='setenta';
80: Result:='ochenta';
90: Result:='noventa';
else Result:=Decenas(numero - numero mod 10)+' y '+ unidades(numero mod 10);
end;
end;
function Centenas(numero:integer): String;
begin
case numero of
0: Result:='';
1..99: Result:=Decenas(numero);
100: Result:='cien';
101..199: Result:='ciento '+Decenas(numero mod 100);
500: Result:='quinientos ';
700: Result:='setecientos ';
900: Result:='novecientos ';
501..599,
701..799,
901..999: Result:= Centenas(numero - numero mod 100)+Decenas(numero mod 100);
else Result:=Unidades(numero div 100)+'cientos'+' '+Decenas(numero mod 100)
end;
end;
function Millares(numero: Longint): String;
begin
if numero > 999 then begin
if numero > 1999
then Result:= Centenas(numero div 1000)+' mil '+Centenas(numero mod 1000)
else Result:= 'mil '+Centenas(numero mod 1000);
end else
Result:= Centenas(numero);
end;
function Millones(numero: Extended):String;
var tmp : String;
A, B: Longint;
begin
A:= Trunc(numero * 0.000001);
B:= Trunc(numero - (A / 0.000001));
if A = 1 then
Result:= 'un millón '+Millares(B)
else begin
tmp:= Millares(A);
if Trim(tmp) <> '' then begin
tmp:= Cambiar_as_a_masculino(tmp);
tmp:= Cambiar_na_a_masculino(tmp);
Result:= tmp+' millones '+Millares(B);
end else
Result:= Millares(B);
end;
end;
function Billones(numero: Extended):String;
var tmp: String;
A: Longint;
B: Extended;
begin
A:= Trunc(numero * 0.000000000001);
B:= numero - (A / 0.000000000001);
if A = 1 then
Result:= 'un billón '+Millones(B)
else begin
tmp:= Millares(A);
if Trim(tmp) <> '' then begin
tmp:= Cambiar_as_a_masculino(tmp);
tmp:= Cambiar_na_a_masculino(tmp);
Result:= tmp+' billones '+Millones(B);
end else
Result:= Millones(B);
end;
end;
function Trillones(numero: Extended):String;
var tmp: String;
A: Longint;
B: Extended;
begin
A:= Trunc(numero * 0.000000000000000001);
B:= numero - (A / 0.000000000000000001);
if A = 1 then
Result:= 'un trillón '+Billones(B)
else begin
if A <= 9 then begin
tmp:= Millares(A);
if Trim(tmp) <> '' then begin
tmp:= Cambiar_as_a_masculino(tmp);
tmp:= Cambiar_na_a_masculino(tmp);
Result:= tmp+' trillones '+Billones(B);
end else
Result:= Billones(B);
end else
Result:= '# # # # # # # # #';
end;
end;
function CorrigeTexto(Frase: String): String;
var
P: Integer;
begin
Result:= LowerCase(Frase);
P:= Pos(' ', Result);
while P > 0 do begin
Delete(Result, P, 1);
P:= Pos(' ', Result);
end;
end;
var
S: String;
Num_Ctvs : Integer;
Num_Largo : Extended;
begin
FNumero := Abs(FNumero);
Num_Largo := Int(FNumero);
if Num_Largo < 1000000000000000.0 then begin
S:= FormatFloat('0.00', FNumero);
Num_Ctvs := StrToInt(Copy(S, Length(S)-1, 2));
end else
Num_Ctvs := 0;
S:= Trillones(Num_Largo);
if (Num_Ctvs > 0)
then Result:= pchar(Decenas(Num_Ctvs))
else Result:= pchar('');
if (Trim(S) <> '') then begin
if (Result <> '')
then Result:= pchar(Trim(S) +' ' +FMoneda +' con '+ Result)
else Result:= pchar(Trim(S) +' ' +FMoneda);
end;
Result:= PChar(CorrigeTexto(Result));
end;
end.
El proyecto
Código Delphi
[-]library g_udf;
uses
SysUtils,
Classes,
Conversiones in 'Conversiones.pas',
ib_util in 'ib_util.pas';
{$R *.res}
exports
NumeroALetra;
begin
end.
Gracias por vuestro tiempo
GustavoCruz