Makale Özeti

Bu yazımızda eski adıyla Microsoft Axapta, yeni adıyla Dynamics AX'ta temel veritabanı işlemlerini, bu uygulamanın geliştirme dili olan X++ diliyle nasıl yapabileceğimizi göreceğiz. X++ dili C, Sql ve Java karışımı bir kodlama sintaksına sahiptir.

Makale

Select işleminin sql sorgusuna benzemekle birlikte bir takım farklılıkları da mevcuttur. Select işlemine geçmeden önce TableBuffer'ın ne olduğunu biliyor olmamız gerekecektir. TableBuffer, bir tablonun referansını tutmaya yarar. Bir bakıma X++ ile kod yazarken veritabanına direk erişebiliriz. CustTable tablosunu kullanarak örnek bir TableBuffer tanımlayalım :

//CustTable tablosunun referansı
CustTable customerTable;

TableBuffer'ın ne işe yaradığını gördükten sonra Select işleminin genel yapısını görelim ve bu genel yapıyı açıklayalım.

select <FindOptions>
          <TableBuffer or { FieldList from [TableBuffer] }>
          <Aggregate(field identifier)>
          <Sorting Options field identifier [Direction]>
          <index clause(index)>
where <selection criteria>
          <Join clause join>
 

Yukarıda belirtilen Select yapısı bloğundaki her parça kullanılmak zorunda değildir. Bazı kısımlar seçimliktir. Şimdi bu seçimlik kısımların neler içerebileceği hakkında biraz fikir sahibi olalım :

FindOptions         - Genel anlamda select işleminin ne şekilde yapılacağını belirten parametreleri alır. Bu parametreleri inceleyelim:
a) Reverse             : Select işleminin sonucunu ters sırada döndürür.
b) FirstFast           : Select işlemi sonucunda dönen kayıtlardan ilkini daha hızlı getirir, ancak bu hızlandırma işlemi için harcanan zamandan dolayı sorgu sonucunda dönen diğer kayıtları çekmek için harcanan süre artarak, sorgunun toplam çalışma zamanını arttırır.
c) FirstOnly           : Select işlemi sonucunda dönen kayıtlardan sorgu kriterlerini sağlayan ilk kaydı döndürür.
d) ForUpdate        : Select işlemi sonucunda dönen kaydı / kayıtları güncellemek için getirir.

CustTable customerTable;
//CustTable tablosundan sadece ilk kaydı çeker
select firstonly customerTable;
 

Aggregate         - Dönen kayıtlar üzerinde seçilen belli bir saha üzerinde aynen sql sorgularında olduğu gibi bütün kayıtlar dolaşılmadan tek seferde özel fonksiyonların çalıştırılmasını sağlar. Bu fonksiyonlar :
a) Sum                 : Select sorgusu sonucunda dönen kayıtlardan belirtilen sahanın değerini toplayarak çıkan sonucu döndürür.
b) Avg                : Select sorgusu sonucunda dönen kayıtlardan belirtilen sahanın değerlerini toplayarak dönen kayıt sayısı değerine bölüp bu sahanın ortalama değerini döndürür.
c) Minof               : Select sorgusu sonucunda dönen kayıtlar içerisinde belirtilen saha değeri en küçük olan değeri bulur.
d) Maxof              : Select sorgusu sonucunda dönen kayıtlar içerisinde belirtilen saha değeri en büyük olan değeri bulur.
e) Count               : Select sorgusu sonucunda dönen kayıtlar içerisinden belirtilen sahanın kaç kayıtta olduğunu döndürür.

CustTable customerTable;
//CustTable tablosundan AccountNum sahasının sayısını çeker.
select count(AccountNum) from customerTable;
print customerTable.AccountNum; 
pause;

Sorting Options - Select sorgusunun sıralama özelliğini belirler. Varsayılan sıralama yönü ascending(artan)'tir. Eğer azalan yönde sıralama yapılması isteniyorsa desc anahtar sözcüğü ile sıralama yapılacak olan saha adından sonra eklenir.

CustTable customerTable;
// CustTable tablosundaki kayıtları azalan sıralada sıralar ve
// AccountNum ve Name sahalarını yazdırır.

while select customerTableorder by AccountNum desc
{
       print customerTable.AccountNum, ' ', customerTable.Name; 
}

Index Clause     - Select sorgusunun çalışacağı tablo üzerinde hangi indeksi kullanarak çalışması gerektiğini belirterek çalıştıracağımız sorgunun daha performanslı çalışmasını sağlayabiliriz. Belirtilmezse sistem sorgu çalıştırılması için var olan indekslerden uygun olanına çalışma esnasında karar verir.

CustTable customerTable;
//CustTable tablosundaki kayıtları döndürürken AccountIdx indeksini
//kullanır ve dönen kayıtlardan AccountNum ve Name sahalarını yazdırır.

while select customerTableindex AccountIdx
{
       print customerTable.AccountNum, ' ', customerTable.Name; 
}

Select Criteria    - Select sorgusunun çalışacağı tablo üzerinde belirtilen kriterleri uygulayarak belirtilen koşul kriterlerine uygun kayıtların dönmesini sağlar.

CustTable customerTable;
//CustTable tablosundan AccountNum değeri 4007'ye
//eşit olan kaydı çekmeye yarar.

select customerTable where customerTable.AccountNum = '4007';
 


Join Clause      - Birbirleri ile ilişkili tablolar üzerinde çalışırken bu tabloları birleştirerek sorgu çalıştırmaya izin verir. Dört farklı Join türü vardır :
a) InnerJoin        : Inner Join ifadesi iki tablodaki ortak bir veriye göre bu iki tabloyu birleştirip tek bir sonuç almada kullanılır.
b) OuterJoin     : Outer Join ifadesinde ise iki tablodaki ortak sahadaki değerler uyuşmasa bile bu ortak sahadaki değerler birleştirilerek sonuçlar tak tabloda döndürülür.
c) ExistsJoin       :  İkinci tabloda belirtilen sahada en az bir değer olması halinde iki tabloyu birleştirip tek tablo olarak sonuçları döndürür.
d) NotExistsJoin : İkinci tabloda belirtilen sahada değer yoksa iki tabloyu birleştirip tek tablo halinde döndürür.

Dynamics Ax'ta Join işleminin türü belirtilmezse Join türü olarak varsayılan değer Inner Join'e göre işlem yapılır.

CustTable customerTable;
CustTrans customerTrans;
// CustTable tablosundaki AccountNum değeri 4000 olan kaydı CustTrans
// tablosundaki AccountNum değeri CustTable tablosundaki AccountNum
// değerine eşit olan kayıtla birleştirip döndürür
.
while select AccountNum, Name from customerTable
join * from ctr where
(customerTrans.AccountNum == customerTable.AccountNum) && customerTable.AccountNum == '4000'
{
       print customerTable.AccountNum, ' ', customerTable.Name, ' ', customerTrans.Voucher; 
}

Dynamics Ax'ta kayıtları dolaşmak için while döngüsü kullanılır ve bu döngü içerisinde yapılması istenen işlemler "{" ile "}" blokları arasına alınarak kodlanır.

Bu yazımızda Select sorgusunun temel kullanım şekillerini gördük. Bu yazının devamında ise veri güncelleme, silme ve kaydetme sorgularını nasıl yazabileceğimizi göreceğiz. Buraya kadar aklınıza takılan veya anlaşılmayan kısımlar için e-mail adresim : aytac.ozay@msakademik.net

Aytaç ÖZAY

Bilgisayar Mühendisi