Autor Beitrag
dirkil2
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Mo 27.12.04 23:06 
Ich habe in einer Tabelle eine Spalte mit einer Jahreszahl und eine Spalte mit einer Kalenderwoche. Ich will in einem Grid statt in 2 Spalten nur eine Spalte anzeigen und zwar im Format JJJJ-WW und das Ganze sortierbar machen. Die Kalenderwoche (KW) ist ein Integer und wenn ich beide Spalten einfach konkateniere mit

SELECT JAHR||'-'||KW AS COL1 FROM ...

dann klappt das mit dem Sortieren nicht, da zB 2004-41 vor 2004-7 wäre. Wenn es eine Formatierungsfunktion gäbe derart

SELECT JAHR||'-'||Format(KW,2) AS COL1 FROM ...

dann würde ich 2004-07 und 2004-41 erhalten, was richtig sortiert würde. Bin ich zu blind oder gibt es sowas nicht.
Falls es so eine Funktion nicht gibt, komme ich wohl nicht drum herum, eine UDF zu schreiben.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 28.12.04 09:26 
Hallo!

In der IB_UDF.dll ist bereits die Funktion "lpad" enthalten, die dir weiterhilft, du musst sie nur entsprechend registrieren (siehe "ib_udf.sql").

Edit: Ich habe Firebird installiert, aber ich denke, das sollte auch bei dir vorhanden sein.

Cu,
Udontknow
dirkil2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Di 28.12.04 12:26 
@Andreas

Wie immer - perfekte Antwort. Genau was ich gesucht habe. Danke!

Leider habe ich Probleme, das zum Laufen zu bekommen. Ich habe das ib_udf.sql Skript ausgeführt und in IBExpert kann ich die UDFs auch sehen.

Wenn ich aber

select LPAD(KW,2,'0') from <tbl> ausführen möchte bekomme ich folg. Fehlermeldung:

Invalid token.
invalid request BLR at offset 63.
function LPAD is not defined.
module name or entrypoint could not be found.

Ich nehme an, er findet die dazugehörige DLL nicht. Ich habe schon versucht, sie in WINDOWS\system32 zu kopieren oder ins Wurzelverzeichnis von Firebird. Leider ohne Erfolg.

Was mache ich falsch?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 28.12.04 12:51 
Was für eine Version nutzt du denn? Benutzt du Firebird?

Schau dir mal im IBExpert die in der DB registrierte UDF an, achte auf Groß-/Kleinschreibung des Module Entry Points. Bei mir ist er "IB_UDF_lpad". Die DLL muss bei Firebird im UDF-Verzeichnis sein.

Edit: Du musst das SQL-Skript in jeder DB laufen lassen, in der du die UDF nutzen möchtest.

Cu,
Udontknow
dirkil2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Di 28.12.04 13:37 
Zitat:
Was für eine Version nutzt du denn? Benutzt du Firebird?

Ich benutze sowohl Interbase 7.1 als auch Firebird 1.5.2. Dieses Problem muss ich aber für Firebird lösen.

Zitat:
Schau dir mal im IBExpert die in der DB registrierte UDF an, achte auf Groß-/Kleinschreibung des Module Entry Points. Bei mir ist er "IB_UDF_lpad".


So heißt sie auch bei mir.

Zitat:
Die DLL muss bei Firebird im UDF-Verzeichnis sein.


Im UDF Verzeichnis sind bei mir zwei DLLS: fbudf.dll und ib_udf.dll. Letztere sollte wohl den Code enthalten.

Zitat:
Edit: Du musst das SQL-Skript in jeder DB laufen lassen, in der du die UDF nutzen möchtest.

Ich habe nur eine Datenbank momentan; daran kann es also nicht liegen.

Hm, mir scheint, ich habe soweit alles richtig gemacht. Irgendeine Idee, was ich machen/testen könnte, um den Grund des Problems zu finden?
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 28.12.04 13:41 
Hmmm, wirklich merkwürdig. Du bist sicher, daß du Firebird nutzt? :) Die Unterscheidung ist ja mitunter knifflig, wenn man beides auf dem System hat.

Gehen denn die anderen registrierten Funktionen?

Probiere es mal in der Form:

ausblenden Quelltext
1:
select LPAD('98',4,'0') from RDB$DATABASE					


Cu,
Udontknow
dirkil2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: Di 28.12.04 13:53 
Das Statement von Dir geht auch nicht: selber Fehler.

Was z.B. funktioniert ist:
select SUBSTR('ABC',1,1) from RDB$DATABASE
select ABS(4.4) from RDB$DATABASE
select PI() from RDB$DATABASE
select LTRIM(' JJ') from RDB$DATABASE
select ASCII_CHAR(67) from RDB$DATABASE

Ich habe die Registrierung der UDF direkt in IBExpert gemacht und nicht isql verwendet. Das sollte aber kein Problem sein, oder?
dirkil2 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130



BeitragVerfasst: So 02.01.05 01:34 
Wenn ich Interbase deinstalliere und nur Firebird, dann funktioniert LPAD.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 03.01.05 12:35 
Das ist ja nun wirklich merkwürdig. Naja, Hauptsache, es klappt nun.

Cu,
Udontknow