Newsgroup: it.comp.lang.delphi
Titolo: [Delphi7][Firebird 1.5] Creazione UDF In Firebird

Ciao a tutti,
 
dato che non riesco a trovare una udf che trasformi un campo stringa in numerico ho deciso di farmela da me. Purtroppo sto impazzendo e non ne vengo fuori, ho cercato in lungo ed in largo su google prendendo spunto dagli esempi forniti ma nulla, quando la eseguo ( tramite ibexpert ) mi esce l'errore "Connection was lost to database", di conseguenza devo chiudere ibexpert.
 
Qui di seguito il dpr
 
library MyUdf;
 
{ 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
  Classes,
  U_MyUDF in 'U_MyUDF.pas';
 
exports
     My_ValStringa;
 
{$R *.res}
 
begin
end.
 
Qui di seguito la unit relativa :
 
unit U_MyUDF;
 
 
interface
 
     function My_ValStringa(var cValore:PChar):Double;cdecl;export;
 
implementation
 
uses SysUtils;
 
 
function My_ValStringa(var cValore:PChar):Double;cdecl;export;
var
    nIndice : integer;
    lString : boolean;
begin
    lString := false;
 
    for nIndice :=1 to Length(cValore) do
        begin
          if (NOT (cValore[nIndice] in ['0'..'9'])) then
             lString := true;
        end;
 
    if not lString then
       result := StrToFloat(cValore)
    else
       result := 0;
end;
 
end.
 
Infine la relativa dichiarazione sql :
 
DECLARE EXTERNAL FUNCTION f_MyValStringa
CString(255)
RETURNS double precision
entry_point 'My_ValStringa' module_name 'MyUdf.dll'
 
Chiaramente la dll creata l'ho copiata sia in \Firebird_1_5\bin che \Firebird_1_5\udf.
 
C'e' qualche anima pia che mi potrebbe aiutare a risolvere tale problema ?
Sarei anche disposto ad utilizzare una udf già fatta, purtroppo sia la rFunc che FreeAdHocUdf non contengono la funzione che fa per me.
 
Un grazie sentito a tutti.
 
Ciao da Enrico Giudici c/o Anthelios
 

Ciao,
  guarda qui se ti puo' essere utile ...
 
http://www.volny.cz/iprenosil/interbase/ip_ib_code_string.htm
 
 
http://www.borlandforum.com/impboard/attach/0000081043/3130_Building_UDF_Libraries.htm
 
 
http://www.firebirdfaq.org/faq83/
 
 
Se no ..... mi spiace ..
 
Ciao
 
Daniele 
 
 

 
 
Ciao Daniele,
 
intanto ti ringrazio moltissimo per la tua disponibilità.
Il primo link non contiene la funzione che cerco.
Il terzo link l'avevo già visto, ma la funzione ritorna una stringa mentre la mia dovrebbe ritornare un double, e poi non sono riuscito proprio a capire la funzione "ib_util_malloc".
Il secondo link mi sembra interessante speriamo di ricavarci qualcosa.
 
Grazie ancora per i suggerimenti.


 entry_point 'My_ValStringa' module_name 'MyUdf.dll'
 
diventa così :
 
DECLARE EXTERNAL FUNCTION f_MyValStringa
CString(255)
RETURNS double precision by value
entry_point 'My_ValStringa' module_name 'MyUdf.dll'

     except
 
si puo' scrivere anche cosi:
 
 
var
  TempFloat: double;
 
 
begin
  Result := TryStrToFloat(cValore, TempFloat)
 
end;
 
A.

 
 
Alberto sei un grande !!!
 
[OT] Spero di rivederti insieme a Marco Breveglieri alla prossima presentazione.


 presentazione.
 
..e quale crimine contro l'umanità avresti commesso   grave al punto da meritarti la punizione di rivedermi...?  :-D
Molto meglio vedere qlc hostess 90-60-90, non trovi? ;-P
 
A.


 
 
Quoto in pieno dall'esperto in materia, comunque mi mancano le tue hostess ;-P
 
Albe, forse è meglio chiudere qui, anche se mi dispiace, ma siamo troppo OT e questi discorsi non inrteressano a nessuno.
 
Ciao da Enrico.