18 Eylül 2014 Perşembe

Query Nesneleri (Queries) 1. Bölüm

Bu makalemizde Dynamics AX’ta veri tabanına erişime nesne tabanlı bir çözüm sunan Query nesnelerini tanıtacağuz. Konu uzun olduğu için parçalara ayırarak yazacağım.

Bakınız : Query nesneleri 2Query nesneleri, Query nesneleri 4

Ancak öngereksinim olarak Dynamics AX’taki table buffer kavramını bilmemiz gerekmektedir. Bu konunun detayları için Table Buffer konulu makaleleri inceleyiniz.

Dynamics AX’ta veri tabanına erişmenin ilk ve en kolay yolunun select cümlecikleri yazmak  olduğunu biliyoruz. Ancak Queryler select cümleciklerinden daha esnektir. Çünkü sorgular (Query) nesne yönelimli olarak düzenlenebilir. Böylece kullanıcıdan alınan değerlere göre dinamik sorgular oluşturulabilir. Basit bir sorguyu select ile yapmak çok daha kolay olmakla birlikte, kullanıcı ile etkileşime girerek dinamik sorgular oluşturmak söz konusu olduğunda query’ler kesin bir üstünlüğe sahiptir.
Query nesneleri ile ilgili en temel nesneler Query, QueryRun, QueryBuildDataSource, QueryBuildRange nesneleridir. Bu nesneler aracılığı ile select cümleciği ile yapabildiğimiz herşeyi ve hatta daha fazlasını yapabiliriz. Bu nesnelerin kısaca açıklamaları alttaki gibidir:
1. Query : select cümleciği ile temsil edilen sorgunun tamamını ifade eder.
2. QueryRun : select cümlecğinin çalışan halidir. Veriye erişimi asıl sağlayan nesne de budur.
3. QueryBuildDataSource : select cümleciğindeki tabloyu temsil eder.
4. QueryBuildRange : where ile ifade edilen şart cümleciklerini ifade eder.
Query ile yapılan sorgu sonucunda elde edilen veri kümesinden istenen değerler qr.get(tableId _tableId) metodu ile bir tableBuffer’a alınmalıdır.
Birkaç örnekle bu nesnelerin nasıl kullanıldığını inceleyelim. Alttaki örnekte (queries1) select cümleciği ile yapılan işlem query ile yapılan işleme denktir. Ancak qr.prompt() satırı sayesinde kullanıcının karşısına sorgu ekranı çıkar ve kullanıcı sorguda istediği gibi kriter belirtebilir. Ayrıca sıralama yapmak da mümkündür.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
static void queries1(Args _args)
{
    CustTable   custTable;
    Query       q;
    QueryRun    qr;
    QueryBuildDataSource qbds;
    ;
    setPrefix("query ile");
    q = new Query();
    qbds = q.addDataSource(TableNum(CustTable)); //buraya breakpoint koyarak qbds nesnesini inceleyiniz.
    qr = new QueryRun(q);
    if(qr.prompt())   //Dikkat bu kısımda kullanıcıya sorgu ekranı açılır.
    {
        while(qr.next())
        {
            custTable = qr.get(tableNum(CustTable)); //table bufferı doldur
            info(strFmt("%1 %2", custTable.AccountNum, custTable.Name)); //tablebufferı kullan
        }
    }
    //--------------------------------------------------------------------
    setPrefix("select ile");
    while select custTable
    {
        info(strFmt("%1 %2", custTable.AccountNum, custTable.Name));
    }
}
ikinci örneğimizde ise where cümleciğinin querylerdeki karşılığını görelim; bu işlem içinQueryBuildRange nesnesini kullanabiliriz.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
static void queries2(Args _args)
{
    CustTable   custTable;
    Query       q;
    QueryRun    qr;
    QueryBuildDataSource qbds;
    QueryBuildRange     qbr;
    ;
    setPrefix("query ile");
    q = new Query();
    qbds = q.addDataSource(TableNum(CustTable));
    qbr = qbds.addRange(fieldNum(CustTable, Currency));
    qbr.value(sysQuery::value(companyInfo::standardCurrency()));
    qbr.status(RangeStatus::Locked);
    //bir range lock edilirse kullanıcı tarafından değiştirilemez
    qr = new QueryRun(q);
    if(qr.prompt())
    {
        while(qr.next())
        {
            custTable = qr.get(tableNum(CustTable));
            info(strFmt("%1 %2", custTable.AccountNum, custTable.Name));
        }
    }
    //--------------------------------------------------------------------
    setPrefix("select ile");
    while select custTable
        where custTable.Currency == companyInfo::standardCurrency()
    {
        info(strFmt("%1 %2", custTable.AccountNum, custTable.Name));
    }
}


Hiç yorum yok:

Yorum Gönder