Arşiv Anasayfa Firebird / Interbase
Sayfalar: 1
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 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..

:
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şturma

UDFsa 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.