1. Anasayfa
  2. Dynamics 365

Dynamics CRM 2015 Kodlama Mimarisi – Bölüm 2 – FetchXML ile Aggregate Toplama Sorguları işlemleri


0

Bir önceki bolumde FetchXML ile neler yapabileceğimize değindik. Eğer istersek FetchXML ile grouping ve aggregate işlemlerini de yapabilmekteyiz. FetchXML ile aşağıdaki işlemler desteklenmektedir;

  • sum
  • avg
  • min
  • max
  • count(*)
  • count(attribute name)

 

Aggregate yapabileceğimiz sorgu örneği standart olarak bildiğimiz fetchXML kurgusundan farklı değil burada sadece attribute kısmında aggregate ile ilgili keyword yer almakta. Aggregate=true diyerek bu şekilde bir sorgulama yapacağımızı sisteme söylüyoruz. Sonrasında ise sırasıyla hangi alan üzerinden işlem yapılacağını, alias yani etiketin ne olacağını ve aggregate türümüzün ne olacağını sisteme söylüyoruz.

<fetch distinct=’false’ mapping=’logical’ aggregate=’true’>

<entity name=’opportunity’>

<attribute name=’name’ alias=’opportunity_count’ aggregate=’count’/>

</entity>

</fetch>

Bu şekilde oluşturduğumuz bir sorgu ile aslında şunu demek istiyoruz : “select count(‘name’) as opportunity_count from opportunity” yani standart bir count işleminden fazlası değil yaptığımız.

Bu fetchXML’i çalıştırmak için ise aşağıdaki gibi bir kod hazırladım;

string opportunity_count = @” <fetch distinct=’false’ mapping=’logical’ aggregate=’true’>

<entity name=’opportunity’>

<attribute name=’name’ alias=’opportunity_count’ aggregate=’count’/>

</entity>

</fetch>”;

EntityCollection opportunity_count_result = ServiseBaglan().RetrieveMultiple(new FetchExpression(opportunity_count));

foreach (var c in opportunity_count_result.Entities)

{

Int32 aggregate2 = (Int32)((AliasedValue)c[“opportunity_count”]).Value;

System.Console.WriteLine(“Count of all opportunities: ” + aggregate2);

}

Burada dikkat edilmesi gereken nokta geriye EntityCollection döndürmesi. Bir önceki makalemden hatırlarsanız normalde bu tarz sorgulama ile biz geriye account, contact gibi sitem içerisindeki nesnelerden oluşmuş bir dizi alıyoruz. FetchXML yapısı gereği tek bir metod kullanıyoruz ve bu metod sonucunda yukarıdaki örnekte olduğu gibi tek bir satır dahi dönecek olsa bile yine sonucu bir collection içerisinde almaktayız. Bu nedenle mecbur foreach içerisinde dönüyoruz ya da collection’un 0. üyesini alıyoruz. Ben örneğimde foreach ile collection içinde döndüm ve gördüğünüz gibi değeri aldım.

Yine bir önceki makalemde ileri düzey sorgular bölümünde anlattığım gibi eğer nesne üzerinden direkt bir değer döndürmeyeceksek sonuç her zaman AliasedValue olarak gelmekte. işte bu nedenden dolayı şu şekilde bir convert işlemi yapıyoruz;

Int32 aggregate2 = (Int32)((AliasedValue)c[“opportunity_count”]).Value

Bu işlem sonucunda bu koddan aşağıdaki gibi çıktımızı alabiliyoruz.


Resim-1

Eğer distinct yapmak istersek de fetchXML içerisine yerleştireceğimiz bir distinct=”true” ifadesiyle ile sisteme bunu belirletebiliriz.

Aşağıda ise distinct yapılmış bir kod örneği bulunmakta;

<fetch distinct=’false’ mapping=’logical’ aggregate=’true’>

<entity name=’opportunity’>

<attribute name=’name’ alias=’opportunity_distcount’ aggregate=’countcolumn’ distinct=’true’/>

</entity>

</fetch>

Bu FetxhXML’i de aşağıdaki kodla çalıştırabiliriz.

string opportunity_distcount = @”

<fetch distinct=’false’ mapping=’logical’ aggregate=’true’>

<entity name=’opportunity’>

<attribute name=’name’ alias=’opportunity_distcount’ aggregate=’countcolumn’ distinct=’true’/>

</entity>

</fetch>”;

EntityCollection opportunity_distcount_result = ServiseBaglan().RetrieveMultiple(new FetchExpression(opportunity_distcount));

foreach (var c in opportunity_distcount_result.Entities)

{

Int32 aggregate4 = (Int32)((AliasedValue)c[“opportunity_distcount”]).Value;

System.Console.WriteLine(“Distinct name count of all opportunities: ” + aggregate4);

}

Console.ReadLine();

Bu kod sonucunda da aşağıdaki gibi bir cevap alabiliriz sistemden;


Resim-2

Gelin olayı biraz renklendirelim. Bu sefer de bir sorgu içerisinde birden fazla aggregate seçeneğinin cevabını isteyelim. Böyle bir işlem için standart fetchXML’in içerisinde sırasıyla hangi özelliklerin bize geri döneceğini belirtiyoruz tabii unutulmaması gereken nokta ise hepsi için ayrı birer alias olması gerektiğidir.

<fetch distinct=’false’ mapping=’logical’ aggregate=’true’>

<entity name=’opportunity’>

<attribute name=’opportunityid’ alias=’opportunity_count’ aggregate=’count’/>

<attribute name=’estimatedvalue’ alias=’estimatedvalue_sum’ aggregate=’sum’/>

<attribute name=’estimatedvalue’ alias=’estimatedvalue_avg’ aggregate=’avg’/>

</entity>

</fetch>

Bu sorgu için ise aşağıdaki kodu hazırladım;

string estimatedvalue_avg2 = @”

<fetch distinct=’false’ mapping=’logical’ aggregate=’true’>

<entity name=’opportunity’>

<attribute name=’opportunityid’ alias=’opportunity_count’ aggregate=’count’/>

<attribute name=’estimatedvalue’ alias=’estimatedvalue_sum’ aggregate=’sum’/>

<attribute name=’estimatedvalue’ alias=’estimatedvalue_avg’ aggregate=’avg’/>

</entity>

</fetch>”;

EntityCollection estimatedvalue_avg2_result = ServiseBaglan().RetrieveMultiple(new FetchExpression(estimatedvalue_avg2));

foreach (var c in estimatedvalue_avg2_result.Entities)

{

Int32 aggregate8a = (Int32)((AliasedValue)c[“opportunity_count”]).Value;

System.Console.WriteLine(“Count of all opportunities: ” + aggregate8a);

decimal aggregate8b = ((Money)((AliasedValue)c[“estimatedvalue_sum”]).Value).Value;

System.Console.WriteLine(“Sum of estimated value of all opportunities: ” + aggregate8b);

decimal aggregate8c = ((Money)((AliasedValue)c[“estimatedvalue_avg”]).Value).Value;

System.Console.WriteLine(“Average of estimated value of all opportunities: ” + aggregate8c);

}

Console.ReadLine();

İşte bu şekilde aynı anda count, sum ve avg işlemlerini yapabilmekteyim. Sonuç ise aşağıdaki gibi;


Resim-3

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

https://www.mshowto.org

Bu İçeriğe Tepkin Ne Oldu?
  • 0
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Barış Kanlıca firmalara CRM ve yazılım konusunda danışmanlık yapmaktadır ve yazılım eğitimleri vermektedir. Dynamics CRM alanında yaptığı çalışmalarından dolayı Microsoft kendisine bu alanda sadece 55 kişide olan MVP(Most Valuable Professional) unvanını ve ödülünü vermiştir. Barış Kanlıca birçok üniversite ve seminerde konuşmacı olmaktadır. Kendisi INETA topluluğunun bir konuşmacısıdır. Ayrıca www.yazgelistir.com, www.yazilimgunlugu.com ve www.nedirtv.com sitelerinde bölüm editörüdür.Uzunca bir süredir Londra'da yaşayan Barış Kanlıca ve kurucusu olduğu Mawens Business Solution'da danışmanlık hizmeti vermeye devam etmektedir.

Yazarın Profili

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir