![]() |
Datenbank: FB 1.5 • Zugriff über: blubb
[IB/FB] UDFs ?
Hi,
habe mir mal die UDFs vorgeknöpft. Wenn hier auch was von Computername steht, hat das mit dem anderen Thread nicht viel zu tun ! Hiermit erstelle ich die DLL :
Delphi-Quellcode:
library TestUdf;
uses SysUtils, Classes, TestUtils in 'TestUtils.pas'; {$R *.res} exports ComputerName; end.
Delphi-Quellcode:
Diese DLL habe ich mit IBexpert importiert. In der DB ist sie zu sehen :
function ComputerName: PChar;
begin ComputerName := PChar ('TEST'); end;
SQL-Code:
Nun die Preisfrage : wie nutze ich das jetzt überhaupt ? Über UDFs ist hier so guut wie gar nichts zu finden und sonstwo hörts auch an diesem Punkt auf. 8)
DECLARE EXTERNAL FUNCTION COMPUTERNAME
RETURNS CSTRING(255) FREE_IT ENTRY_POINT 'COMPUTERNAME' MODULE_NAME 'TESTUDF' |
Re: [IB/FB] UDFs ?
Hallo Hansa,
Die Entrypoints sind casesensitive. Im Import mußt du es genauso schreiben, wie im Export der Dll. Verwenden kann man das wie die Builtin-Funktionen. |
Re: [IB/FB] UDFs ?
Wie normale Funktion verwenden. Was ist denn dann hiermit :
SQL-Code:
Innerhalb BI-Trigger. ANGELEGT und BEZ sind Tabellen-Felder. current_timestamp ist wohl eine eingebaute Funktion und Computername die UDF. Letzere erzeugt die Fehlermeldung "unknown variable : COMPUTERNAME". Die UDF müßte doch "TEST" zurückliefern und dadurch BEZ auf TEST setzen. :gruebel:
new.ANGELEGT = current_timestamp;
new.BEZ = COMPUTERNAME; |
Re: [IB/FB] UDFs ?
Zitat:
SQL-Code:
Wobei ich nicht weiss, ob Parameterlose Funktionen erlaubt sind.
select COMPUTERNAME() from ...
|
Re: [IB/FB] UDFs ?
Das interessanteste sind die drei ... :-D Und für was sollen die stehen bei der UDF ? :shock:
|
Re: [IB/FB] UDFs ?
wie mkinzler schon sagte, UDFs sind casesensitive, das heißt:
wenn in deiner export deklaration steht
Delphi-Quellcode:
solltest Du Deine UDF so einbinden:
exports
ComputerName;
SQL-Code:
Siehst Du den Unterschied? :wink:
DECLARE EXTERNAL FUNCTION COMPUTERNAME
RETURNS CSTRING(255) FREE_IT ENTRY_POINT 'ComputerName' MODULE_NAME 'TESTUDF' |
Re: [IB/FB] UDFs ?
Zitat:
SQL-Code:
alle Werte als Ergebnis zurückgeliefert. mit
select wert from tabelle;
SQL-Code:
halt das Doppelte ( wenn in Funktion so implementiert).
select verdopple(Wert)from Tabelle;
Aber
SQL-Code:
könnte auch funktionieren, da
new.BEZ = ComputerName();
SQL-Code:
auch in Triggern direkt aufgerufen werden kann.
ja GEN_ID( ...);
|
Re: [IB/FB] UDFs ?
So, etwas rumgespielt. UDF heißt jetzt COMPUTERNAMEFUNC.
Bezieht sich das Case-sensitive auf den Delphi Teil ? Der ist jetzt vorsichtshalber so :
Delphi-Quellcode:
Trigger :
exports
COMPUTERNAMEFUNC;
SQL-Code:
UDF :
as
begin if (new.ID is null) then new.ID = gen_id(GEN_ART_ID, 1); if (new.angelegt is null) then new.ANGELEGT = current_timestamp; new.BEZ = COMPUTERNAMEFUNC (); end
SQL-Code:
Was jetzt genau die Ursache dafür war, daß es nicht compiliert wurde ? :shock: signifikante Änderung wurde allerdigs duch das () ausgelöst. Allerdings war die UDF in IBExpert genauso grün und unterstrichen, wie das gen_id. Der Trigger braucht in diesem Fall offensichtlich das (). Denn der wird jetzt auch compiliert. Beim Commit kommt aber noch das :
DECLARE EXTERNAL FUNCTION COMPUTERNAMEFUNC
RETURNS CSTRING(255) FREE_IT ENTRY_POINT 'COMPUTERNAME' MODULE_NAME 'TESTUDF' Zitat:
Edit : wo genau muß die DLL eigentlich hin ? Ist momentan überall. :mrgreen: |
Re: [IB/FB] UDFs ?
Zitat:
[edit] Edit : wo genau muß die DLL eigentlich hin ? Ist momentan überall. Mr. Green [/edit] Kommt darauf an was in deiner fbconf steht. |
Re: [IB/FB] UDFs ?
Weiß nicht genau wieso, aber jetzt geht alles ! :thumb: Sieht so aus, daß ich immer die falsche DLL geändert, bzw. am falschen Ort hatte. Der Trigger erzeugt nun einen Feldinhalt, der von der UDF geliefert wurde. Muß das mal mit dem jetzigen Kenntnisstand von Anfang an neu machen. War vielleicht nicht schlecht, das Thema UDFs hier mal durchzukauen. IMHO sind die vorhandenen UDFs zwar mit Vorsicht zu genießen, aber wenn man weiß, wie man die selber machen kann, dann eröffnen sich schon interessante neue Perspektiven ! Allerdings bleiben noch 2 Fragen : 1. reicht die Angabe von FREE_IT aus, Speicherlecks zu vermeiden ? 2. Habe ja absichtlich deswegen kein simples integer verwendet. Allerdings vermisse ich bei Anzeige der DDL das BY REFERENCE. Obwohl in der Grid-Anzeige der UDF rechts bei "Return Mechanism" "By Reference" drin steht. 8)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz