Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-09-2011
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
UDF no funciona en xp

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;
     (*** NUEVA ***)
     (*** Ej: 'treinta y una millones' --> 'treinta y un millones' ***)
     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;

     (*** NUEVA ***)
     (*** Ej: 'quinientas millones' --> 'quinientos millones' ***)
     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;

     (*** Optimizada ***)
     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;

     (*** Optimizada ***)
     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;

     (*** Optimizada ***)
     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;

     (*** NUEVA ***)
     (*** Esta funcion traduce los números menores a un millón ***)
     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;

     (*** NUEVA ***)
     (*** Esta funcion traduce los números menores a un billón ***)
     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;

     (*** NUEVA ***)
     (*** Esta funcion traduce los números menores a un trillón ***)
     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;

     (*** NUEVA ***)
     (*** Esta funcion traduce los números menores a 10 trillones, no he
       podido traducir cifras superiores por la simple razon de que los
       números EXTENDED sólo tienen 19 cifras significativas y la traducción
       sale herrada, además, no creo que las necesite  ***)
     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;

     (*** NUEVA ***)
     (*** Suprime los caracteres [espacio] que se encuentren junto a otros
       caracteres [espacio].
       Ej: 'mil  cien' --> 'mil cien' ***)
     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);

  //si es menor que mil billones... tomamos en cuenta los decimales,
  //de lo contrario no podemos tomarlos en cuenta... por aquello de
  //las cifras significativas... uds. saben...
  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;

  //Se traduce la cifra sin decimales
  S:= Trillones(Num_Largo);

  //Se traducen los decimales
  if (Num_Ctvs > 0)
  then Result:= pchar(Decenas(Num_Ctvs))
  else Result:= pchar('');



  //Compactamos en un solo texto
  if (Trim(S) <> '') then begin
    if (Result <> '')
    then Result:= pchar(Trim(S) +' ' +FMoneda +' con '+ Result)
    else Result:= pchar(Trim(S) +' ' +FMoneda);
  end;

  //quitamos los caracteres [espacio] junto a otros caracteres [espacio]
  Result:= PChar(CorrigeTexto(Result));
end;

end.

El proyecto

Código Delphi [-]
library g_udf;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes,
  Conversiones in 'Conversiones.pas',
  ib_util in 'ib_util.pas';

{$R *.res}
  exports    
    NumeroALetra;

begin

end.

Gracias por vuestro tiempo



GustavoCruz
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
funciona bien en windows 7 64b pero en XP no funciona ASAPLTDA Varios 5 06-05-2011 16:24:50
IDE funciona mal dfarias Varios 2 10-02-2009 11:04:26
No funciona PHP silviodp PHP 6 07-06-2008 21:51:29
¿Así funciona el BETWEEN? Faust Firebird e Interbase 4 13-05-2008 01:58:40
like no funciona ! dmasson Conexión con bases de datos 9 23-03-2004 14:10:50


La franja horaria es GMT +2. Ahora son las 10:57:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi