UDF Oluşturma Firebird / Interbase Gönderen: Fatih Tarih: 10 October 2005 00:27:27
UDF, kısacası database ile yaptıramadagımız matematiksel yada parse etme işlemlerimizi rahatlıkla yaptırmamızı yarayan dll dosyalarıdır. Bunları Delphi ile rahatlıkla yazabilirsiniz.UDF ile neler yaptırabiliriz?
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.
DECLARE EXTERNAL FUNCTION UDFEM
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Topla' MODULE_NAME 'UDF_TOPLA'
DECLARE EXTERNAL FUNCTION Udf Yi Tanımlamayı Sağlıyor. Bundan Sonra Bir Ad Seçiyoruz. Ben Udfem Yaptım. Daha Sonra Dll'de Kullandığımız Parametrelerin Tipini Hyazıyoruz. Fonksiyonda İ Ve J Adında İki Parametremmiz Olduğu İçin Ve Tipleride İnteger Olduğu İçin İki Nteger Tipi Göseriyoruz. Birden Fazlaysa Parametre Sayısı Tiplerin Arasına Virgül Ekliyoruz.
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.
Pointer Tipli UDF
Yukarıda gördüğümüz sonuç olarak integer tipte değer döndürüyor. şimdi pointer tipte bir fonksiyon yazalım.
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.
function Pointer_Topla_2 (Width,Height:PInteger):Integer;
begin
Result:=Width^+Height^;
end;
buı şekilde herhangi bir hata verirse interface hemen sonra fonksiyon tanımından hemen önce
type
PInteger = ^Integer;
şeklinde tip tanımı yapın
Aşağıdaki kodla ib / fb ye tanıtın.
DECLARE EXTERNAL FUNCTION UDFEM_2
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'Pointer_Topla' MODULE_NAME 'UDF_TOPLA'
Projenin DLL Sekmesi aşağıdaki şekilde olmalı

Tools> SQL Editörü açıp oraya şu kodu yazarak etkisini görebilirsiniz
select_2 UDFEM (1001,202) from rdb$database
String Tipli UDFString 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..
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ı.
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:
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';
UDF Oluşturma Firebird / Interbase Gönderen: Fatih Tarih: 10 October 2005 00:28:57
IB Expert'le UDF OluşturmaUDFsa sağ tıklayıp New UDF dediğinizde aşağıdaki gibi bir pencere gelecektir

Ynt: UDF Oluşturma Firebird / Interbase Gönderen: nedimtrc Tarih: 05 May 2007 12:43:10
üstad ben yeni başladım udf yazmaya makalenizi okudum zaten tamamen burdan öğrendim ve burdaki bilgiler doğrultusunda yaptım yalnız söyle bir sorun yaşadım unit kısmında currency olarak tanımladığım bir değişkeni udf tanımlarken ki karşılığını numeric(10,2) diye kullanıyorum fakat değer 0.00 dönüyor sürekli birde yine unitte pchar tanımladığım stringimi udfde cstring(10) olarak tanımlıyorum unit kımında string değişkenimi kullanamıyorum.