Eki 9, 2014 - Query, X++    2 Yorumlar

Query Nesneleri ile Sıralama ve Gruplama

Bir önceki konumuzda Query nesneleriyle sorgu oluşturma ve range(filitre) verebilme konularından bahsetmiştik bu konumuzda ise Querylerle sıralama ve gruplama yapma işlemlerinden bahsedeceğiz.

Select cümlecikleriyle olduğu gibi query nesneleriyle de sıralama, gruplama veya var olan indexi kullanma gibi işlemler yapılabilir.

İndex kullanımı : Tabloda tanımlanan indexi kullamak için addShortIndex() methodu kullanılır. Bu method bir index numarası alır. Index anahtar sözcüğü kullanıldığında da sıralama bu indexe göre yapılır.

static void Erkn_QueryIndex(Args _args)
{
    InventTable          inventTable;
    Query                q;
    QueryRun             qr;
    QueryBuildDataSource qbds;
    QueryBuildRange      qbr;

    q = new Query();
    qbds = q.addDataSource(tableNum(InventTable)); //burada querye InventTable tablosu eklenir.
    qbds.addSortIndex(IndexNum(InventTable, ItemIdx)); //Tablodaki index tanımı buraya eklenir.

    qr = new QueryRun(q);
    if(qr.prompt())   //Bu kısımda kullanıcıya sorgu ekranı açılır.
    {
        while(qr.next())
        {
            inventTable = qr.get(tableNum(InventTable)); //tablo değişkenine sorgunun ilk satırı atanır.
            info(strFmt("%1 %2", inventTable.ItemId, inventTable.itemName())); //tablo değişkeni kullanılır.
        }
    }
}

Order By kullanımı : Select cümleciklerinde kullandığımız order by yönteminin aynı işlevlisidir. Tabloda bulunan her hangi bir alana göre sıralama yapılır. Sıralama yapmak için addOrderByField methodu kullanılır. Method sıralanacak alan ve istenirse sıralama şekli verilecek query sıralama işlemi yapılır.

static void Erkn_QueryOrderBy(Args _args)
{
    InventTable          inventTable;
    Query                q;
    QueryRun             qr;
    QueryBuildDataSource qbds;
    QueryBuildRange      qbr;

    q = new Query();
    qbds = q.addDataSource(tableNum(InventTable)); //burada querye InventTable tablosu eklenir.
    qbds.addOrderByField(fieldNum(InventTable, ItemId),SortOrder::Ascending);//Sıralamak için kullanılır kullanılır sortOrder kısmı zorunlu olmamakla beraber default olarak Ascending'dir
    //qbds.addOrderByField(fieldNum(InventTable, ItemId),SortOrder::Descending); //Tersten sıralamak için Descending kullanılır.

    qr = new QueryRun(q);
    if(qr.prompt())   //Bu kısımda kullanıcıya sorgu ekranı açılır.
    {
        while(qr.next())
        {
            inventTable = qr.get(tableNum(InventTable)); //tablo değişkenine sorgunun ilk satırı atanır.
            info(strFmt("%1 %2", inventTable.ItemId, inventTable.itemName())); //tablo değişkeni kullanılır.
        }
    }
}

Group By kullanımı : Group by fonksiyonu gruplama, kümeleme fonksiyonlarıyla birlikte kullanılır. Bu gruplama fonksiyonları Sum(topla), count(say), avg(ortalama), maxof(en büyük), minof(en küçük) gibi fonksiyonlardan oluşur. Group By fonksiyonlarında gruplama işlemleri sadece tablodaki alanlar üzerinden yapılır ve sadece bir alan için bir gruplama fonksiyonu kullanılabilir. Yani aynı alan için hem sum hemde count aynı anda kullanılamaz. 

static void Erkn_QueryGroupBy(Args _args)
{
    InventTrans          inventTrans;
    Query                q;
    QueryRun             qr;
    QueryBuildDataSource qbds;
    QueryBuildRange      qbr;

    q = new Query();
    qbds = q.addDataSource(tableNum(InventTrans)); //burada querye InventTable tablosu eklenir.
    qbds.addGroupByField(fieldNum(InventTrans, ItemId));//ItemId ye göre grup alınıp
    qbds.addSelectionField(fieldNum(InventTrans, Qty), SelectionField::Sum); //Qty alanır toplanır.
    qbds.addSelectionField(fieldNum(InventTrans, RecID), SelectionField::Count);//RecId alanı sayılarak kayıt sayısı bulunur.

    qr = new QueryRun(q);
    if(qr.prompt())   //Bu kısımda kullanıcıya sorgu ekranı açılır.
    {
        while(qr.next())
        {
            inventTrans = qr.get(tableNum(InventTrans)); //tablo değişkenine sorgunun ilk satırı atanır.
            info(strFmt("Madde Adı :%1 - Miktar :%2 - Kayıt Sayısı :%3", inventTrans.ItemId, inventTrans.Qty, inventTrans.RecId)); //tablo değişkeni kullanılır.
        }
    }
}

**GroupBy yaparken dikkat edilecek nokta gruplamaya veya kümeleme fonksiyonuna katılmayan alanlarda veri bulunmaz.(Örnekte sadece ItemId,Qty ve RecId alanlarında veri vardır.)

Bir sonraki konumuzda da join işlemlerinden bahsederek Queryle nesneleri yapılacak işlemleri sonladıracağız.

Erkan OĞUZ


		
					

Önceki Konu->

<- Sonraki Konu

Benzer yazılar

2 Yorumlar

  • Merhabalar,

    Query nesneleri ile ilgili verdiğiniz örnekler için teşekkür ederim.Örnek kodlarınız daha önce de olduğu gibi yine hayat kurtaracak cinsten :) sade ve kolay okunabilmesi ayrıca güzel. Düzenli olarak takip ediyorum paylaşımlarınızı. Bir sonraki konuyu merakla bekliyorum. Sitenizin amacına ulaştığını söyleyebilirim.
    Başarılar,

    • Merhaba Filiz hanım,

      Elimden geldiğince anlaşılabilir ve işe yarar kodlar yazmaya dikkat ediyorum. Sizinde işinize yaradığına çok sevindim. İş yoğunluğunu azalttığım da konuların devamı gelecektir. İlgiiniz için çok teşekkür ederim.

Yorum Yazın...