UDF ile aklınıza gelebilecek her türlü kolaylıgı saglayabilirsiniz. Mesala Eger kişi veritabanı alanına dogum tarihini girerse ve siz yaşını hesaplamak isterseniz bunu veritabanına yaptırabilirsiniz.Aksi durumda bunu programınızdan kod yazarak yapmak zorunda kalacaktınız. Peki, gerçekte kod yazmak dogru mu? Her ikisi de aynı işlemi yapmasına ragmen kod yazmak dogru degildir. Neden? Çünkü, SQL Explorer ya da başka programlar ile veri girilmek istendiginde sizin programınız çalışmadıgından yaş hesaplanmayacaktır oysa ki, UDF Kullanıldıgında başka programlardan dogum tarihi girilmesine ragmen yaş hesaplama işlemi yapılır. Bu da bizim Veritabanımızın daha stabil çalışması anlamına gelecektir. UDF Kullanırken bazı noktalara dikkat edilmesi gerekir bunlardan en önemlisi Null (Degersiz veya boş veri) alan kullanılmamasıdır.
Bir UDF oluşturup kullanmak için öncelikle udf nin kullanacağı, içinde fonksiyon bulunan bir dll lemiz olmalı
Dll hazırlamak için önce File-New menüsünden Other seçeneğini seçtikten sonra çıkan pencerenin New sekmesindeki DLL Wizad’ı seçin.
Bu işlemden sonra File-New menüsünden Unit' Tıklayıp Projeye yeni bir unit ekliyoruz.
Unit1 i aşağıdaki gibi Düzenleyin

Unit1 i yukarıdaki gibi tasarladıktan dll bölümüne geçip aşağıdaki Düzenlemeyi yapalım

DLL'yi Derlemeden Öncce Projeyi UDF_TOPLA ismiyle Kaydedin
> Dll dosyaları F9 tuşu ile çalıştırılmazlar. Derlemek için Project-Build UDF_TOPLA seçeneğini kullanmalısınız. Bu işlem sonrasında proje exe olarak değil dll uzantısına sahip olacaktır. Derlediğinizde herhangi bir hata yoksa projeyi kaydettiğiniz yerde UDF_TOPLA.DLL Dosyasını Gööreceksiiniz.
Oluşturduğunuz DLL'yi firebirdin yada interbasenin udf klasörüne kopyalayın.
benim pc de firebird dizini C:\Program Files\Firebird\Firebird_1_5\UDF
interbase udf dizini C:\Program Files\Borland\InterBase\UDF de bulunuyor
udf yi interbaseye tanıtmak için aşağıdaki kodu kullaanıyoruz.
Kod: Tümünü seç
DECLARE EXTERNAL FUNCTION UDFEM
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Topla' MODULE_NAME 'UDF_TOPLA'
Daha sonra RETURNS yazıp fonksiyon tipini integer seçiyoruz. returnstan sonraki tip tanımına udf den dönen değer eklenir. udf den tek değeröner. tıpkı fonksiyon gibi. zaten buda IB / FB fonksiyonu.. daha sonra BY VALUE yazıyoruz. BY VALUE yerine BY reference yazabiliriz. siz BY VALUE kuullanın. sonra ENTRY_POINT tırnak arasında dll de kullandığımız fonksiyon ismini yazıyoruz. son olarak MODULE_NAME yazıp tırnak arasında dll ismini uzantısını kullanmadan yazıyoruz.
Tools> SQL Editörü açıp oraya şu kodu yazarak etkisini görebilirsiniz
select UDFEM (1001,202) from rdb$database
rdb$database > UDF bilgilerini tutan sistem tablolarından biridir.
Kod: Tümünü seç
Pointer Tipli UDF
bunun için yukarıdaki projeye ekleme yapabileceğimiz gibi yeni bir projeyede başlaabiliriz.ben varolan projeye ekleme yaptım.

Aynı Fonksiyonu Aşağıdaki şekildede yazabiliriz.ib / fb ye tanıtma şekli aynıdır.
Kod: Tümünü seç
function Pointer_Topla_2 (Width,Height:PInteger):Integer;
begin
Result:=Width^+Height^;
end;
Kod: Tümünü seç
type
PInteger = ^Integer;
Aşağıdaki kodla ib / fb ye tanıtın.
Kod: Tümünü seç
DECLARE EXTERNAL FUNCTION UDFEM_2
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Pointer_Topla' MODULE_NAME 'UDF_TOPLA'

Tools> SQL Editörü açıp oraya şu kodu yazarak etkisini görebilirsiniz
Kod: Tümünü seç
select_2 UDFEM (1001,202) from rdb$database
String Tipli UDF
String tipli UDFler yazabilmek için IB / FB nin ib_util.dll ve ib_util.pas dosyalının yolunu Delphinin Library Path ına eklemeniz gerekecek. daha sonra ib_util.dll dosyasını Windowsun SYSTEM Dizinine Kopyalayın.
yine benim pc mde ib_util.dll dosyası firebird C:\Program Files\Firebird\Firebird_1_5\bin
interbase C:\Program Files\Borland\InterBase\bin
ib_util.pas dosyası firebird C:\Program Files\Firebird\Firebird_1_5\include
interbase C:\Program Files\Borland\InterBase\SDK\include dizinlerinde bulunuyor.
Bu işlemden sonra untinin interface deyiminden sonra uses SysUtils,ib_util; unit isimlerini ekliyoruz.
Şimdi Bir örnek yapalım. Aşağıdaki fonksiyon stringin sonundaki boşlukları atıyor.
sz parametresine stringinizi CNT parametresinede stringin uzunluğunu atayın. UDF DLL lerimizde Pchar String tip anlamına gelir..
Kod: Tümünü seç
function strornek (sz: PChar; var Cnt: Integer): PChar;
var
i: Integer;
begin
if (sz = nil) then
result := nil
else begin
i := 0;
while ((sz <> #0) and (i < cnt)) do Inc(i);
result := ib_util_malloc(i+1);
Move(sz[0], result[0], i);
result := #0;
end;
end;
udf yi ib/ fb ye tanıtma kodu aşağıdaki gibi olmalı.
Kod: Tümünü seç
DECLARE EXTERNAL FUNCTION UDFEM_4
CSTRING(64),
INTEGER
RETURNS CSTRING(64) FREE_IT
ENTRY_POINT 'strornek' MODULE_NAME 'UDF_TOPLA'
Burada farklı olartak gördüğümüz CSTRING(64) string tipini işaret ediyor. 64 stringin uzunluğu.FREE_IT ise udf çalıştıktan sonra dll yi hafızadan siliyor. String tiplr için bunu mutlaka yapmalısınız.Diğer Tiplerde kullanmıyoruz.
Karakter uzunlugunu hesaplama Delphi Dll Kodu:
Kod: Tümünü seç
function TEST_TrimLen (val: PChar): integer; stdcall;
begin
Result := -1;
if val[0] = #0 then Exit;
Inc(val);
Result := Length(Trim(val));
end;
DECLARE EXTERNAL FUNCTION TEST_TRIMLEN
CSTRING(20)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'TEST_TrimLen' MODULE_NAME 'UDF_Ornek';