Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Delphi7][Firebird 1.5] Creazione UDF In Firebird

50 views
Skip to first unread message

enrico....@gmail.com

unread,
May 7, 2013, 5:17:33 PM5/7/13
to
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

Daniele

unread,
May 8, 2013, 1:05:57 AM5/8/13
to
Message has been deleted

enrico....@gmail.com

unread,
May 8, 2013, 6:03:48 AM5/8/13
to
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.

enrico....@gmail.com

unread,
May 8, 2013, 5:56:49 PM5/8/13
to
Risolto !!! Ormai non sapevo più a che santo rivolgermi, ma ce ne voluto per capirlo.

Il problema era dovuto al passaggio dei parametri, da così :

> function My_ValStringa(var cValore:PChar):Double;cdecl;export;

diventa così :

function My_ValStringa(cValore:PChar):Double;stdcall;

chiaramente anche la funzione da così :

> 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;

l'ho ottimizzata e diventa così :

function My_ValStringa(cValore:PChar):Double;stdcall;
begin
try
Result := StrToFloat(cValore);
except
on Exception : EConvertError do
Result := 0;
end;
end;

La dichiarazione da così :

> DECLARE EXTERNAL FUNCTION f_MyValStringa
> CString(255)
> RETURNS double precision
> 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'

Alberto Salvati

unread,
May 9, 2013, 2:52:29 AM5/9/13
to
Questa è una cosa che presumo sarà utile anche ad altri.
Cmq, questo codice:

> try
>
> Result := StrToFloat(cValore);
>
> except

si puo' scrivere anche cosi:


var
TempFloat: double;


begin
Result := TryStrToFloat(cValore, TempFloat)

end;

A.

enrico....@gmail.com

unread,
May 9, 2013, 6:09:39 AM5/9/13
to
> si puo' scrivere anche cosi:
>
> var
>
> TempFloat: double;
>
> begin
>
> Result := TryStrToFloat(cValore, TempFloat)
>
> end;
>

Alberto sei un grande !!!

[OT] Spero di rivederti insieme a Marco Breveglieri alla prossima presentazione.

Alberto Salvati

unread,
May 9, 2013, 6:18:16 AM5/9/13
to
> Alberto sei un grande !!!


Effettivamente tra un po sono 45..... :-((
Azz, sembra ieri la 1a volta che ho fatto doppio click per aprire delphi4 per la 1a volta....

> [OT] Spero di rivederti insieme a Marco Breveglieri alla prossima
> 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.

enrico....@gmail.com

unread,
May 9, 2013, 6:47:59 AM5/9/13
to
> Effettivamente tra un po sono 45..... :-((

Sei sempre più giovane di me ;-)

>
> Azz, sembra ieri la 1a volta che ho fatto doppio click per aprire delphi4 per la 1a volta....
>

Bei tempi ehh !?!?

> ..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
>

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.
0 new messages