Bu yazımızda daha önceden select cümlecikleri ile yaptığımız sorgulamaları query nesneleri ile yapacağız. Ama öncelikle Sıralama ve gruplama ile ilgili konuların başlangıcı için Select Cümlecikleri ve Table Buffer kavramı : Sıralama ve Gruplama (Ordering, grouping and aggregation) konulu makaleyi inceleyebilirsiniz.
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