Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/04/2005, 16h24   #1
Nouveau Membre du Club
 
Inscription : août 2002
Messages : 130
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 130
Points : 25
Points : 25
Par défaut UDF en Delphi

bonjour,

je veux creer une petite UDF en delphi me permettant de renvoyer un float . Le parametre passée à l'UDF est également un float. j'ai fait un test en ecrivant une fonction qui ramene la valeur absolu. ça donne cela :
declaration UDF
Code :
1
2
3
4
5
 
DECLARE EXTERNAL FUNCTION ABS_1 
    FLOAT
    RETURNS FLOAT BY VALUE
    ENTRY_POINT 'UDF_abs' MODULE_NAME 'maDLL'
fonction delphi
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
FUNCTION UDF_abs(avaleur: double): double; cdecl; export;
 
var
wval : string;
begin
//wval := floattostr(avaleur);
//MessageDlg('DLL  ' + wval, mtWarning, [mbOK], 0);
IF avaleur < 0 then
  result := avaleur*(-1)
else
  result := avaleur;
end;
voila rien de bien compliqué...Pourtant si j'effectue la requete suivante
Code :
1
2
 
SELECT abs_1(4) FROM rdb$database
j'obtiens 0,000 ??? La valeur passée semble correspondre à l'adresse mémoire ...pourtant j'ai trouvé des exemples d'UDF avec return FLOAT by value...?????
Qqun peut il m'éclairer ?
pram est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2005, 10h15   #2
Membre éclairé
 
Inscription : décembre 2004
Messages : 379
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 379
Points : 304
Points : 304
le problème est que les paramètres sont transmis par pointeur, c'est pour cela que tu n'as pas les résultats escomptés.

voici un exemple fonctionnel (qu'il l'était en tout cas)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
//      **********************************
//      *** ARRONDI MONETAIRE EN CENTS ***
//      **********************************
{
      DECLARE EXTERNAL FUNCTION RoundCent
      DOUBLE PRECISION
      RETURNS DOUBLE PRECISION BY VALUE
      ENTRY_POINT "FRoundCent" MODULE_NAME "UDFSys.DLL";
}
FUNCTION FRoundCent( var Value: Double ): Double; cdecl;
begin
  Result := Trunc( ( Value * 100 ) + 0.5 ) / 100;
end;
l'instruction "var" permet justement de "convertir" la valeur en pointeur, tu n'aura qu'a remplacer "trunc" par "abs"

je ne suis pas sûr que cela soit encore nécessaire, mais à l'époque, j'avais placé en fin de la source le code suivant:
si cela t'intéresse, j'ai encore le code d'une "veille" udf écrite en delphi d'où j'ai extrait le code de ci-dessus, si tu veux, je peux te la transmettre.
jean-jacques varvenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h30.


 
 
 
 
Partenaires

Hébergement Web