AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[IB/FB] UDFs ?

Ein Thema von Hansa · begonnen am 25. Mär 2006 · letzter Beitrag vom 27. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

[IB/FB] UDFs ?

  Alt 25. Mär 2006, 18:54
Datenbank: FB 1.5 • Zugriff über: blubb
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:
function ComputerName: PChar;
begin
  ComputerName := PChar ('TEST');
end;
Diese DLL habe ich mit IBexpert importiert. In der DB ist sie zu sehen :

SQL-Code:
DECLARE EXTERNAL FUNCTION COMPUTERNAME
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'COMPUTERNAME' MODULE_NAME 'TESTUDF'
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)
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 18:57
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 19:13
Wie normale Funktion verwenden. Was ist denn dann hiermit :

SQL-Code:
  new.ANGELEGT = current_timestamp;
  new.BEZ = COMPUTERNAME;
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 19:30
Zitat:
Innerhalb BI-Trigger. ANGELEGT und BEZ sind Tabellen-Felder. current_timestamp ist wohl eine eingebaute Funktion und Computername die UDF.
CURRENT_TIMESTAMP ist eine Kontextvariable. MIN(), Max() usw. sind Funktionen. Aufrufe etwa so: select COMPUTERNAME() from ... Wobei ich nicht weiss, ob Parameterlose Funktionen erlaubt sind.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 19:39
Das interessanteste sind die drei ... Und für was sollen die stehen bei der UDF ?
Gruß
Hansa
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#6

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 19:47
wie mkinzler schon sagte, UDFs sind casesensitive, das heißt:
wenn in deiner export deklaration steht
Delphi-Quellcode:
exports
   ComputerName;
solltest Du Deine UDF so einbinden:
SQL-Code:
DECLARE EXTERNAL FUNCTION COMPUTERNAME
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'ComputerName' MODULE_NAME 'TESTUDF'
Siehst Du den Unterschied?
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 19:48
Zitat:
Das interessanteste sind die drei ... Very Happy Und für was sollen die stehen bei der UDF ? Shocked
das Beispiel mit der parameterlosen Funktion ist vielleich schlecht gewählt. Nehemen wir mal an du hättest eine Tabellen mit einem Feld Wert. Un eine Funktion Verdopple() in der UDF. Dann würde mit der Abfrage select wert from tabelle; alle Werte als Ergebnis zurückgeliefert. mit select verdopple(Wert)from Tabelle; halt das Doppelte ( wenn in Funktion so implementiert).

Aber new.BEZ = ComputerName(); könnte auch funktionieren, da ja GEN_ID( ...); auch in Triggern direkt aufgerufen werden kann.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 20:36
So, etwas rumgespielt. UDF heißt jetzt COMPUTERNAMEFUNC.

Bezieht sich das Case-sensitive auf den Delphi Teil ? Der ist jetzt vorsichtshalber so :

Delphi-Quellcode:
exports
  COMPUTERNAMEFUNC;
Trigger :

SQL-Code:
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
UDF :

SQL-Code:
DECLARE EXTERNAL FUNCTION COMPUTERNAMEFUNC
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'COMPUTERNAME' MODULE_NAME 'TESTUDF'
Was jetzt genau die Ursache dafür war, daß es nicht compiliert wurde ? 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 :

Zitat von IBExpert:
Invalid token.
invalid request BLR at offset 69.
function COMPUTERNAMEFUNC is not defined.
module name or entrypoint could not be found.
Habe mich jetzt wohl mit den Bezeichnern verhackstückelt. Welche Rolle spielt genau der Name der UDF und insbesondere der Entry-Point ? Was geht da genau vor sich ?

Edit : wo genau muß die DLL eigentlich hin ? Ist momentan überall.
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 20:43
Zitat:
Welche Rolle spielt genau der Name der UDF und insbesondere der Entry-Point ?
Der EntryPoint bezeichnet die Funktion, welche aus der DLL geladen wird. Und exportierst eine Funktion COMPUTERNAMEFUNC versuchst aber eine mit dem Namen COMPUTERNAME zu importiere. das Funktioniert leider so nicht.

[edit]
Edit : wo genau muß die DLL eigentlich hin ? Ist momentan überall. Mr. Green [/edit] Kommt darauf an was in deiner fbconf steht.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10

Re: [IB/FB] UDFs ?

  Alt 25. Mär 2006, 21:17
Weiß nicht genau wieso, aber jetzt geht alles ! 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)
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz