Guten Morgen und zuerst einmal vielen Dank für die Rückmeldungen!
@hoika:
stdcall?
Die Deklaration der Funktionen erfolgt mit "cdecl" analog zu vielen Beispielen im Netz. Sorry, hatte ich vergessen mit zu kopieren.
Deklaration von "Gewicht" als var:
Ich ging davon aus dass das so korrekt ist da die Übergabe "by reference" erfolgt.
0 Zurückgeben:
Die Rückgabe funktioniert nur bei dieser Funktion nicht, bei allen anderen jedoch einwandfrei.
Auch wenn ich in der Funktion direkt 0 zurückgebe und und diese direkt beende funktioniert es nicht.
@IBExpert:
Warum (noch) nicht FB3?
Weil das ein recht großes Projekt mit knapp 300 Tabellen ist und ich im Moment keine Zeit habe es auf Kompatibilität zu testen.
Außerdem bedient der Server noch ein paar andere Anwendungen / Datenbanken.
Warum nicht als stored function?
Es gibt diese Funktion funktionsfähig bereits als stored function.
Da ich diese jedoch innerhalb von Aggregatfunktionen (i.d.R. SUM) einsetzen muss, erhoffe ich mir von der UDF Variante eine bessere Performance.
Speichermanager ib_util.dll?
Wie verwendet man den denn? Ich verwende aktuell Delphi 10.3 mit Zielplattform Win64.
Hier mal mein aktueller Code:
Gruß,
Micha
Code:
library myUDF64;
uses SysUtils, Classes, UDF.Functions in 'UDF.Functions.pas';
{$R *.res}
exports GetGewichtAs, GetGewichtAs2;
begin
end.
Code:
unit UDF.Functions;
interface
uses SysUtils, Classes;
const M_KG = 0; // Standard
M_LBS = 1;
function GetGewichtAs(var Gewicht: double; const VonEinheit, NachEinheit: PAnsiChar): double; cdecl;
function GetGewichtAs2(var Gewicht: double; var VonEinheit, NachEinheit: integer): double; cdecl;
implementation
function GetGewichtAs(var Gewicht: double; const VonEinheit, NachEinheit: PAnsiChar): double;
var kg: double;
v, n: string;
begin
if (Gewicht=0) or
(VonEinheit=nil) or
(NachEinheit=nil) then
result:= Gewicht
else begin
v:= String(VonEinheit);
n:= String(NachEinheit);
if SameText(v, n) then
result:= Gewicht
else begin
if SameText(v, 'LBS') then
kg:= Gewicht/2.20462
else
kg:= Gewicht;
if SameText(n, 'LBS') then
result:= kg*2.20462
else
result:= kg;
end;
end;
end;
function GetGewichtAs2(var Gewicht: double; var VonEinheit, NachEinheit: integer): double;
var kg: double;
begin
if Gewicht=0 then
result:= Gewicht
else begin
if VonEinheit=NachEinheit then
result:= Gewicht
else begin
if VonEinheit<>M_KG then
kg:= Gewicht/2.20462
else
kg:= Gewicht;
if NachEinheit<>M_KG then
result:= kg*2.20462
else
result:= kg;
end;
end;
end;
end.
Nachtrag:
Generell kann ich sagen dass die
FB Installation nicht das Problem ist, denn wenn ich folgende UDF einrichte, bekomme ich ein Ergebnis.
Daher denke ich, dass das Problem bei meiner
DLL zu suchen ich.
Code:
DECLARE EXTERNAL FUNCTION STRLEN
CSTRING(80)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';