18 Eylül 2014 Perşembe

Query nesneleri (Queries)-2 : Sıralama ve Gruplama (Ordering, grouping and aggregation)

Konu ile ilgili ilk yazıda Query nesneleri ile sorgulama yapmanın avantajlarından bahsetmiştik. 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 de demiştik. Bu konuları ilgili yazıya havale ederek Sıralama ve Gruplama (Ordering, grouping and aggregation) konularına değinelim. Bu konu için önce Select cümlesi ile, daha sonra da Query ile işlemin nasıl yapılacağını göreceğiz.
1. Index ya da index hint : Tabloda varolan bir indexi kullanmak için index anahtar sözcüğü kullanılabilir. Bu sözcük kullanıldığında sorguda kesinlikle belirtilen indexe göre sıralama yapılır. Index hint ise önerilen indeks olarak anılabilir. SQL Server’ın tuttuğu istatistiklerde belirtilen indeks uygun bulunursa kullanılır, aksi taktirde yoksayılır. Bu konudaki best practise where kriterindeki alanları barındıran indeksleri kullanmaya çalışmaktı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
CustTable custTable;
;
while select custTable
    index AccountIdx
    {
        info(strFmt("%1 %2", custTable.AccountNum, custTable.Name));
    }
//----- Query ile -----
    q = new Query();
    qbdsTable = q.addDataSource(tableNum(CustTable));
    qbdsTable.addSortIndex(IndexNum(CustTable, AccountIdx));
    qr = new QueryRun(q);
    if(qr.prompt())
    {
        qbdsTable = qr.query().dataSourceTable(tableNum(CustTable));
        while(qr.next())
        {
            custTable = qr.get(tableNum(CustTable));
            info(strFmt("Hesap No : %1, Adı : %2",
                    CustTable.AccountNum,
                    CustTable.Name));
        }
    }
2. Order By : Bilinen en eski sıralama şeklidir. Tabloda bulunan herhangibir alan order by ile kullanılarak sıralanabilir. Bu konudaki best practise kullanılacak alan indekslenmiş olmasıdı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
while select custTable
    order by custTable.AccountNum
    {
        info(strFmt("%1 %2", custTable.AccountNum, custTable.Name));
    }
//----- Query ile -----
    q = new Query();
    qbdsTable = q.addDataSource(tableNum(CustTable));
    qbdsTable.addOrderByField(fieldNum(CustTable, AccountNum)); //4.0 için addSortField kullanılmalıdır
    qr = new QueryRun(q);
    if(qr.prompt())
    {
        qbdsTable = qr.query().dataSourceTable(tableNum(CustTable));
        while(qr.next())
        {
            custTable = qr.get(tableNum(CustTable));
            info(strFmt("Hesap No : %1, Adı : %2",
                    CustTable.AccountNum,
                    CustTable.Name));
        }
    }
3. Group By : Gruplama fonksiyonu genellikle kümeleme fonksiyonları ile birlikte kullanılır. Kümeleme fonksiyonları sum, count, avg, maxof ve minof (sırasıyla; topla, say, ortalama, en büyük, en küçük) ile ifade edilir. Grup by kullanıldığında kullanılabilecek alanlar sadece tablodaki gruplama ve kümeleme alanlarıdır. Bir sorguda bir alan sadece bir kümeleme için kullanılabilir. Yani bir sorguda aynı alan hem sum, hem count yapılamaz.

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
36
37
38
CustTrans custTrans;
;
while select sum(AmountMst), count(recId) from custTrans
    group by Accountnum
    {
       info(strFmt("Müşteri hesabı : %1, Bakiye : %2, İşlem adedi : %3",
                             custTrans.AccountNum,
                             custTrans.AmountMst,
                             custTrans.RecId));
    }
//Dikkat : sadece accountNum, AmountMst ve RecId alanında bulunur.
//----- Query ile -----
    q = new query();
    qbdsTrans = q.addDataSource(tableNum(CustTrans));
    qbdsTrans.addGroupByField(fieldNum(CustTrans, AccountNum));
    qbdsTrans.addSelectionField(fieldNum(CustTrans, AmountMst), SelectionField::Sum);
    qbdsTrans.addSelectionField(fieldNum(CustTrans, RecID), SelectionField::Count);
    qr = new QueryRun(q);
    if(qr.prompt())
    {
        qbdsTrans = qr.query().dataSourceTable(tableNum(CustTrans));
        while(qr.next())
        {
            custTable = CustTable::find(custTrans.AccountNum);
            custTrans = qr.get(tableNum(CustTrans));
            info(strFmt("Hesap No : %1, Tutar : %2, Kayıt sayısı : %3, ",
                    custTrans.AccountNum,
                    custTrans.AmountMST,
                    custTrans.RecId));
        }
    }
//Dikkat : sadece accountNum, AmountMst ve RecId alanında veri bulunur.
Ali Güç - 2014

Hiç yorum yok:

Yorum Gönder