UniDAC Makro Özelliği ve Kullanım alanları

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
ertank
Üye
Mesajlar: 1171
Kayıt: 11 Eyl 2015 11:45

UniDAC Makro Özelliği ve Kullanım alanları

Mesaj gönderen ertank » 25 Tem 2018 01:21

Günümüzde Delphi kullanıcıları arasında database bağlantı alternatifleri arasında bilindik bir yeri olan Devart firmasının ürünü UniDAC (Universal Database Connection Components) özellikleri arasında belki çok duyulmamış olan Makro (Macro) hakkında bilgi vermeye çalışacağım.
Macro tanımı UniDAC için SQL cümlesini parametre kullanmadan dinamik olarak değiştirmek şeklinde açıklanabilir. İlk etapta akla çok fazla kullanım alanı gelmiyor olsa da ya da parametre ile farkı yok gibi geliyor olsa da gerçek anlamda oldukça faydalı bir özelliktir.
En basit kullanım şekli aşağıdaki gibi olabilir:

Kod: Tümünü seç

select * from &tablename
Yukarıdaki SQL cümlesi içinde &tablename ifadesi UniDAC içinde bir makro tanımıdır. Bu makro değeri çalışma zamanında dinamik olarak programcı tarafından değiştirilebilir. Mesela kullandığımız database içinde isimleri cari, stok, stokhareket olan tablolar olsun. Biz tek bir TUniQuery bileşeni ve yukarıdaki gibi içinde makro tanımı olan bir SQL cümlesi yardımı ile bu tabloların herhangi birini SQL cümlesinde hiç değişiklik yapmadan kullanabiliriz.

Kod: Tümünü seç

Query1.SQL.Text := 'select * from &tablename';
Query1.MacroByName('tablename').Value := 'stok';
Query1.Open();
Yukarıdaki örnek ile Query1 bileşeni stok tablosunun içeriğini gösterecektir. Eğer SQL cümlesini Delphi IDE içinde dizayn zamanında yazar isek bu defa aşağıdaki gibi bir kullanım yeterli olacaktır

Kod: Tümünü seç

Query1.MacroByName('tablename').Value := 'stok';
Query1.Open();
Eğer aynı bileşeni kullanarak stokhareket tablosunu açmak istersek SQL kodunu hiç değiştirmeden aşağıdaki gibi bir kod kullanabiliriz

Kod: Tümünü seç

Query1.Close();
Query1.MacroByName('tablename').Value := 'stokhareket';
Query1.Open();
UniDAC içinde makro kullanımı sadece farklı tabloları açma ile sınırlı değildir. Bu özellik yardımı ile uygulamanızın birden fazla farklı database sistemini desteklemesini sağlamanız mümkün.

TUniConnection Makro Kullanımı
Yukarıdaki örnekler TUniQuery içindeki makro kullanımını gösteren örneklerdi. Bunun dışında TUniConnection bileşeni içinde de makro kullanımı mümkün. TUniConnection içinde kullanılan makrolar tüm TUniQuery, TUniSQL bileşenlerinde çalışacaktır.
Örneğin, eski ve halen geliştirmekte olduğumuz uygulamamız daha önce FirebirdSQL database sunucusu kullanıyor idi ancak yeni sürümünde artık MySQL database sistemini kullanacağız. Bununla birlikte bazı tablo isimlerini de değiştirmek zorunda kaldık. UniDAC Makro özelliği ile bunu kontrol etmek aşağıdaki şekilde mümkün olacaktır.

Kod: Tümünü seç

UniConnection1.Open();
UniConnection1.Macros.Add('caritablosu', 'standart_sema.cari', 'MySQL');  // MySQL içinde tablo isimleri şema adı ile kullanılır
UniConnection1.Macros.Add('caritablosu', 'cari', 'Interbase');  // UniDAC içinde Interbase Provider Name FirebirdSQL için ortak kullanılır
Yukarıdaki makro tanımı "UniConnection1" kullanan tüm TUniQuery ve benzeri bileşenler için geçerli olacaktır. Kullanımı aşağıdaki gibidir

Kod: Tümünü seç

UniQuery1.SQL.Text := 'SELECT Count(*) FROM {caritablosu}';
UniQuery1.Open();
Fark edileceği gibi. Yukarıdaki SQL cümlesi içinde artık database sistemi bağımsız olarak sadece genel makro adı kullanılarak hangi database sistemini kullanıyor isek UniDAC bizim için doğru tablo adını SQL cümlesinde değiştirecek ve sunucuya komutu gönderir iken olması gerektiği gibi gönderecektir.
FirebirdSQL için SQL komutu aşağıdaki şekilde database sunucusuna iletilecek

Kod: Tümünü seç

SELECT Count(*) from cari
MySQL için SQL komutu aşağıdaki şekilde database sunucusuna iletilecek

Kod: Tümünü seç

SELECT Count(*) from standart_sema.cari
Genel tanımlı makroları iç içe şekilde tanımlama imkânımız da var. Bunu örnek ile açıklamak gerekir ise;

Kod: Tümünü seç

// Uygulama içinde maksimum 5 kayıt ile sınırlı gösterim alanlarımız için aşağıdaki şekilde genel makro tanımı yapılabilir
UniConnection1.Macros.Add('limit', 'LIMIT 0,5', 'MySQL');
UniConnection1.Macros.Add('limit', 'LIMIT 5 OFFSET 0', 'PostgreSQL');
//Standart FROM kelimesi tanımı yapıyoruz. Aşağıdaki tanım tüm database sunucularda çalışacaktır. UniConnection1.Macros.Add('from', 'FROM {caritablosu}', '');
// Aşağıdaki tanımda ise SQL içinde eğer limit makro tanımı var ise ekstra limit makrosu eklenmesini sağlıyoruz. 
UniConnection1.Macros.Add('from', 'FROM {caritablosu} {limit}', 'limit');
Bu tanımlardan sonra kullanımı aşağıdaki şekilde olacaktır

Kod: Tümünü seç

UniQuery1.SQL.Text := 'SELECT kodu,unvani {from}';
UniQuery1.Open();
Yukarıdaki kullanımda UniDAC MySQL sunucusuna aşağıdaki komutu gönderecek

Kod: Tümünü seç

SELECT kodu,unvani FROM standart_sema.cari LIMIT 0,5
Aynı şekilde yukarıdaki kullanımda UniDAC PostgreSQL sunucusuna aşağıdaki komutu gönderecek

Kod: Tümünü seç

SELECT kodu,unvani FROM cari LIMIT 5 OFFSET 0
Sunuculara giden SQL komutlarını ve var ise parametrelerini, uygulamamız içindeki hangi bileşenin bu komutu gönderdiğini görmek için ücretsiz Devart dbMonitor uygulaması kullanılabilir. Bu uygulamayı kullanabilmek için UniDAC bileşenleri olan DataModule veya Form üzerine bir adet TUniSQLMonitor bileşeni eklememiz ve Active özelliğini True yapmamız yeterlidir. dbMonitor uygulaması aşağıdaki bağlantıdan indirilebilir
https://www.devart.com/dbmonitor/download.html

Gerçek Hayat Kullanım Örneği
Buraya kadar anlatılanlar ağırlıklı olarak teorik bilgiler idi. Ancak bazı database sistemlerinde yukarıdaki gibi bir from ve limit makro tanımı yapmak mümkün olmayabiliyor. Mesela SQL Server TOP kelimesini kullanıyor ve FROM ifadesinden sonra değil SELECT ifadesinden önce kullanıyor.
Böyle durumlar için aşağıdaki şekilde bir yaklaşım kullanılabilir (Sadece aşağıdaki genel makro tanımları yapılacaktır. Yukarıdaki örneklerden bağımsızdır)

Kod: Tümünü seç

UniConnection1.Macros.Add('limitmysql', 'LIMIT 0,5', 'MySQL');
UniConnection1.Macros.Add('limitsql', 'TOP 5', 'SQL Server');
UniConnection1.Macros.Add('caritablosu', 'standart_sema.cari', 'MySQL'); 
UniConnection1.Macros.Add('caritablosu', '[dbo].cari', 'SQL Server');
Kullanımı aşağıdaki gibi olacaktır

Kod: Tümünü seç

UniQuery.SQL.Text := 'select {limitsql} * from {caritablosu} {limitmysql}';
Dikkat edileceği üzere SQL Server için tanımlı limitsql isimli makroyu SQL Server kullanımına uygun yere yazdık. MySQL için tanımlı limitmysql isimli makroyu da MySQL kullanımına uygun yere yazdık.
Yukarıdaki gibi bir tanımdan sonra UniDAC eğer SQL Server kullanılıyor ise

Kod: Tümünü seç

select TOP 5 from [dbo].cari
MySQL kullanılıyor ise

Kod: Tümünü seç

select * from standart_sema.cari LIMIT 5,0
komutlarını sunuculara gönderecektir.

Son olarak, genel makro tanımını TUniConnection bileşenine çift tıklayıp "Macro" sekmesine gelerek veya ilgili bileşen için makro tanımını ise yine bileşen üzerinde çift tıklayıp "Macro" sekmesine gelerek IDE içinden dizayn zamanında yapmak mümkün.

UniDAC ile ilgili daha fazla bilgi için:
https://www.devart.com/unidac/download.html

Cevapla