Selamlar ;

Microsoft Dynamics CRM konusunda ki tips & tricks çalışmalarımıza devam ediyoruz.

Biliyorsunuz CRM içerisinde yer alan bütün viewler için belli bir sayıda kayıt gösterme dışında ne yazık ki dinamik olarak ayarlanabilir bir yapı bulunmamakta.

İşte tam bu noktada Microsoft ve haliyle .NET'in olanaklarını kullanarak CRM'e bu fonksiyonalitenin nasıl kazandırılabileceğini sizlere gösteriyor olacağım.

Öncelikle sorunumuza bir göz atalım ,

Gördüğünüz gibi sayfa başına gösterilmek istenen kayıt sayısını kullanıcı bazlı olarak değiştirebiliyoruz lakin ne yazık ki manuel olarak belli bir değere set edilemiyor.(Dropdown list)

Çözüm için Ayarlar / Özelleştirme / Varlıkları Özelleştir / Kullanıcı (systemuser) entity'sini bulup bunu özelleştirmek için açıyoruz ve yeni bir attribute ekliyoruz.Eklenen attibute'ün ismi pagerecordcount olsun .Zorunlu ve int türünde bir alan olarak işaretleyelim ve kaydedelim.

Daha sonra ekledğimiz bu alanı kullanıcı ana formu üzerine ekleyelim.

Sıra geldi plug'inimizi yazmaya.Bu plug'in sayesinde CRM'in internal pipeline 'ına entegre olarak sistemde gerçekleşen istediğimiz event'i yakalayıp akabininde kullanıcı bazlı bu değeri alarak gridlerde sayfa bazında gösterilecek olan kayıt sayısını set edebileceğiz.Geriye kalan en önemli unsur handle ettiğimiz bu integer değere göre her grid için oluşturulan fetchXML bilgisini editleyerek istediğimiz şekilde bir görünüm oluşturma işlemini tamamlamak..

   17 using System;

   18 using System.Collections.Generic;

   19 using System.Text;

   20 using Microsoft.Crm.Sdk;

   21 using System.Xml;

   22 using Microsoft.Crm.SdkTypeProxy;

   23 using Microsoft.Crm.Sdk.Query;

   24 

   25 namespace RecordPerPage

   26 {

   27     public class PageRecordCountUtility : IPlugin

   28     {

   29         #region IPlugin Members

   30 

   31         public void Execute(IPluginExecutionContext context)

   32         {

   33             if (context.MessageName == "Execute" && context.InputParameters.Contains("FetchXml"))

   34             {

   35                 //crmservice bilgisi context üzerinden oluşturuluyor.

   36                 ICrmService crmservice = context.CreateCrmService(true);

   37 

   38                 //Login olan kullanıcımız için sayfa başına gösterilecek olan kayıt sayısı bilgisini

   39                 //DynamicEntity üzerinden sorgulayacağız.

   40                 TargetRetrieveDynamic target = new TargetRetrieveDynamic();

   41                 target.EntityId = context.UserId;

   42                 target.EntityName = EntityName.systemuser.ToString();

   43 

   44                 RetrieveRequest request = new RetrieveRequest();

   45                 request.ColumnSet = new ColumnSet(new string[] { "new_pagerecordcount" });

   46                 request.Target = target;

   47                 request.ReturnDynamicEntities = true;

   48 

   49                 //İlgili kaydı retrieve ediyoruz.

   50                 DynamicEntity currentuser = (DynamicEntity)((RetrieveResponse)crmservice.Execute(request)).BusinessEntity;

   51 

   52                 //Eğer new_pagerecordcount'ı bulunamazsa bizim için bir anlamı yok ,

   53                 //alanın varlığı kontrol ediliyor.

   54                 if (currentuser.Properties.Contains("new_pagerecordcount"))

   55                 {

   56                     //Var olan request'e ait XML query'sini editlemek için handle ediyoruz

   57                     XmlDocument indoc = new XmlDocument();

   58                     indoc.LoadXml((string)context.InputParameters["FetchXml"]);

   59 

   60                     //VOLA!count attribute olmazsa olmaz!bu değeri arıyoruz.

   61                     if (indoc.DocumentElement.Attributes["count"] != null)

   62                     {

   63                         //Bulabildiysek kullanıcı için tanımlanan değer üzerinden dinamik olarak set ediyoruz.

   64                         indoc.DocumentElement.Attributes["count"].Value = ((CrmNumber)currentuser["new_pagerecordcount"]).Value.ToString();

   65                         //editlediğimiz FetchXML değerini editleyerek context'i set ediyoruz.Burası önemli.

   66                         context.InputParameters["FetchXml"] = indoc.OuterXml;

   67                         //yukarıdaki değeri set etmezseniz yapılan bir işe yaramayacaktır!

   68                     }

   69                 }

   70             }

   71         }

   72         #endregion   

   73     }

   74 }

 

Yukarıda açıklamalarıyla birlikte yazdığımız plug'ini olabildiğince ifade etmeye çalıştım.Geriye kalan adımımıız bu plugini crmserver'a register etmek.Bunun normal yolu oldukça meşakatli fakat Plugin Registration Tool projesini internetten indirip test server'inizda bir kez derleyip çalıştırdığınızda bu adımların aslında çok rahat yapılabildiğini görebiliyoruz.Projeyi http://code.msdn.microsoft.com/crmplugin/Release/ProjectReleases.aspx?ReleaseId=2010 linkinden indirebilirsiniz..

Aşağıda aynı entity'in tüm kayıtlarının görüntülendiğini görüyoruz.Sayfa başına 250 kayıt olarak ayarlanmış olarak görünüyor.

Şimdide şu an sistemde aktif görünen kullanıcının sayfa başına görüntülenebilir kayıt bilgisini 45 olarak set ediyoruz.(Opsiyonel değerler 25,50,100,250)

Evet şimdide plugin registration işlemi sonrası görüntüleyelim.

Gördüğümüz gibi olay Fetch XML de bitiyor.

Crm Server üzerindek yapılan geliştirmelerde yazılan plugin ya da custom action (buna ayrı bir ipuçu/makale 'de değiniyor olacağım önümüzdeki günlerde.) debug edilmeden publish edilirse tüm sistemin durmasına sebep olabilecek hatalara sebebiyet verebilir ki nitekim benzer bir olayı daha önce bir müşterimizde yaşamıştık.Müşterimizde yazılan plug'inin register edildiği yer aynen bu örneğimizde olduğu gibi pipeline üzerinde Pre Stage ve tüm entityler için "Execute" mesajının yayınlanmasından hemen önce çalıştığı için tüm sistem tabiri caizse saçmalamaya başladı bir anda :) Biraz zahmetli olsada bulduk :)

Sorularınız olursa lütfen çekinmeyin , görüşmek üzere.

Sevgiler.

E2