CRM 2011 - VISUAL RIBBON EDITOR (Forma Buton Ekleme)



Bu makalemizde,Visual Ribbon Editoru kullanarak crm entityleri üzerine nasıl buton eklenecegini anlatacagım.
Visual Ribbon Editoru Crm in kendine has ozellıklerını degıstırmekte kullanılmaz.Custom degısıklıkler uzerınde etkilidir.Crm in ozellıklerını degıstırmek ıstıyorsak entity nin customization.xml dosyasında degısıklık yapmamız gerekır.Aslında bu editor bıze customızatıon.xml dosyasındakı degısıklıklerı form uzerınden secmemızı saglar.
Öncelikle bilgisayarımızda visual ribbon editor programını indirelim.Aşağıdaki verdiğim url den kolayca ulaşabilirsiniz.


Dosyayı bilgisayarımıza indirdikten sonra zip içerisinden çıkarınız.

Cıkarılan klasorun içerisine girerek visualribboneditor.exe dosyasını calıstırın.

Dosya calıstırıldıgında karsınıza asagıdakı ekran goruntusu gelecektir.



Ok  butonuna tıklayalım ve crm imimizle baglantı kurmak için gerekli bilgileri girelim.

Alanları doldurduktan sonra OK butonuna tıklayalım ve crm e baglanmasını bekleyelim.Bu işlem biraz uzun sürebilir.


Baglandıktan sonra ilk bas “Open” butonuna tıklayalım ve cıkan ekrandan hangi entity üzerinde calısacagımızı “Select ribbon to customize” bolumunden secelim.

Biz burada Firma(Account) entity si üzerinde calısacagımızı secelim.Bu işlemınde tamamlanması biraz zaman alabilir.
İşlem tamamlandıktan sonra asagıdakı ekran goruntusu gelir.

“Form” secim listesinden entity üzerinde hangi alanda calısacagımızı belirtelim.
Form,Homepage ve Sub-Grid diye 3 alandan birini secelım.
Form => Entity içerisindekı kayıt acıldıgındakı ekran
HomepageGrid=Entity acıldıgındakı ekran
Biz bu secımden “Form” alanını secelım.
Form secildiginde “Form” uzerındekı gorunum belirir.

Hangi Tab üzerinde calısacagımızı secelim.Ben “MainTab “ kısmını secerek bu alanda işlemlerimi gerceklestırecegim.

Herhangi bir section ı sectıkten sonra “New Button” alanına tıklayalım ve cıkan ekranda Butonumuzun id sini verelim.Bu deger unique olmalıdır.
Ben ekrandakı gıbı Gokhan.Form.account.MainTab.Collaborate.YeniButon id sini verdim.
“OK” butonunu tıkladıktan sonra butonumuzun sectıgımız sectionda olusacagını goreceksınız.

Olusan butonumuzu secerek “Detail” bolumunden butonumuzun iconunu,textini ,butonun boyutlarını vs secebiliriz.
Template alias:butonumuza large,medium ve isv medium boyutlrından birini verebiliriz.
“Show section” kısmından butonumuzun bulundugu section ı degistirebiliriz.
Image bolumunde verilen png leri Visual Ribbon Editor klasorundeki Images klasorunden kolaylıkla secebilirsiniz.

Action” kısmından tıklanınca olusacakları belirleriz.Bu alandan ya url veririz yada javascript dosyamızla ilgili bilgileri gireriz.
Not:Burada belirtigimiz javascript dosyasının crm içerisinde kayıtlı olması gerekır.
Asagıda ornekler bulunmaktadır.

Url verme



“Display Rules” section ından butonumuzun hangı hallerde ekranda gorulecegını seceriz.Bu alana herhangı bir sart gırılmezse buton herzaman gorulecektir.

Örnek Display kuralları:



“Enable Rules” bolumunden butonun ne  zaman enable olacagını belirtiyoruz.

Daha sonra üst kısımdan “Save” butonuna tıklayarak yaptıklarımızın Crm içerisine kaydedilmesini bekleyelim.

İşlem bittikten sonra Crm üzerinde entitymızde form ekranını acalım ve butonumuzun olustugunu goreceksiniz.

CRM 2011 - QUERY EXPRESSİON PAGEINGINFO KULLANIMI




Sistemımızdekı kayıtları sorgularken kayıtların hepsine ihtiyacımız yoksa belli alanları alarız. Bunun içinde  "PAGEINGINFO" yu kullanırız.Bu ifade de verdiğimiz sayfa numarası kadar sayfa donecektır .Ayrıca her sayfadan kac kayıt gelecegını de count ifadesıne yazacagımız rakam belirler.
Aşagıda örnek bir kullanım bulunmaktadır.

Örnek:

QueryExpression query = new QueryExpression(); // sorgu nesnesı olustur.
// sorguda iki sayfa ve sayfa basına bir kayıt doner.
query.PageInfo = new PagingInfo();
query.PageInfo.Count = 1;
query.PageInfo.PageNumber = 2;

CRM 2011 - PLUGIN YUKLEME (ADDING PLUGIN )




Crm 2011 SDK klasörunun içerisinde pluginregistration.exe dosyasını calıstırın.
Sdk//tools//pluginregistration//bin//debug yoluyla ulasabilirsiniz.

RESİM 1:













Karsınıza RESİM 2 deki ekran belirecektir.Bu ekranda baglanacagımız crm ile ilgili birgileri doldurduktan sonra Connect butonuna tıklayınız.
Label:Baglantı isminize vereceğiniz adı giriniz.
Discovery Url:   CRM  inizin bılundugu url yi girin.Örnegın http://localhost:80 (Localhostun 80. Portunda crm oldugunu belirtir.)
User Name=CRM e baglanırken kullandıgınız kullanıcı adı nı girmeniz gerekmektedir.Örnegin:GOKHANM\gokhan
RESİM 2:
Daha sonra o portta bulunan CRM ler Baglantı ismi verdiğimiz alanın altında belirecektir.
Bizim portumuzda bir adet TESTCRM adında CRM bulunmaktadır.
NOT :TESTCRM :CRM in Organization Name idir.
RESİM 3:
TESTCRM i secip Connect Butonuna tekrar bastıgımızda sag taraftakı panelde Crm imize yuklu pluginler listelenir.(bkz RESİM 4)
RESİM 4:


PLUGIN EKLEME

Eger Crm e yeni bir plugin eklemek istersek Register bolumunden Register New Assembly secenegini seceriz.Karsımıza RESİM 5 teki ekran gelir.
RESİM 5:
Cıkan ekrandan Load Assembly butonuna tıklayarak assembly mizi seceriz.Burada dikkat edilmesi gereken assembly mizi Program Files daki CRM klasorunun icerısındek, assembly kalsorunde olması gerekmektedir.
Bu klasore C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly bu sekılde ulasabılırız.
NOT :Assembly mızı buraya kopyalarken alacagımız bazı hataları nasıl duzeltecegımızı anlatımın sonunda paylasacagım.
2.STEP alanında dll ınızın ıcerısındekı hangı pluginınızı secenegınızı belırtın.Burada Select All dememız yeterli olacaktır.
3.STEP alanından None ve Disk butonlarını secın.
4.STEP Sayfanın sonunda bulunan Register Selected Plugins butonunu tıklayın ve plugınızın CRM e yuklenmesını bekleyın.Eger burada hata almazsanız plugınınız CRM e sorunsuz yuklendı demektır.

STEP EKLEME

Şimdi de ekledıgımız pluginimizi hangı durumlarda calısması gerektıgınız sececegız.Bunun için  calısacak plugın dosyamızı sectıkten sonra Register sekmesınden Register New Step secenegını secın.Alttakı resimde ki ekranı goreceksınız.(RESİM 6)
RESİM 6:
 Burada Message kısmında plugının tetıklenecegı anı secın.
Primary entity bolumunden hangı entity uzerınde calısacagınız secın.
Asagıdakı Eventhing Pipeline Stage of Execution bolumunden Pre demı yoksa Post anında mı calısacagını secın.
Diger kısımlar resimde isretlı oldugu gıbı kalır.İstisnai durumlarda degısır.
Resmin sag alt kısmında bulunan Register New Step butonuna tıklayarak step ımızı olusturmus oluruz.

PLUGİN UPDATE

Pluginimizi Update yapmak ıcınse RESİM 7 de oldugu gibi güncellenecek dll i sectıkten sonra Update butonuna basarak cıkan ekrandan plugınımızı secerız.
RESİM 7:
Şimdi de yukarıda bahsettıgımız Crm içerisindekı assembly klasorune plugınımızı kopyalarken alacagımız hataları cozelım.
Burada daha once secılı plugının uzerıne kopyalama ıslemmı ya da silerken hata alırız.
Bunları cozmek ıcın,
Command Prompt u yonetici olarak calıstırın.
services.msc satırını calsıtırın.Karsınıza RESİM 8 dekı HİZMETLER ekranı gelecektır.
RESİM 8:
RESİM 8 dekı ekranda oklarla belırtılen Microsoft Dynamics CRM Asynchronous Processing Service adında 2 adet servisi yukarıda kı restart servise butonuna tıklayarak tekrar baslamasını secın.
Daha sonra yine command prompt yonetıcı modunda acıkken iisreset satırını etkınlestırmemız yeterlı oalcaktır.Simdi kopyalama sılme işlemını sorunsuz yapabılırsınız.

CRM 2011 - ACTIVE DIRECTORY DE KULLANICI OLUSTURMA


public void Create_AD_User(string username, string password, string firstname, string lastname, string emailid, string contactnumber, ITracingService tracingService)
        {
            tracingService.Trace("Inside Create_AD_User");
            try
            {
                //  Step 1: Create a Directory Entry Object, starting at point in the AD Structure that we would like
                //          to add the user to.  This will come from the path that we selected from the Show AD Structure Tab
                //          and DataGrid.
                DirectoryEntry currentADObject = new DirectoryEntry(adrootpath);

                //  Step 2: Make sure that the AD Object that we are adding to is a container.  Meaning that it can
                //          hold other AD Objects (e.g., users, groups, etc.)
                if (currentADObject.SchemaEntry.Name == "container")
                {
                    //  Step 3: Create a User Object of type User, to be added to the Children colllllection of the
                    //          current AD Object that we created in Step 1
                    DirectoryEntry newUserObject = currentADObject.Children.Add("CN=" + username, "User");

                    //  Step 4: Check to see if the user already exists, and if so, we will overwrite it for Demo simplicity.
                    //          In the real world, you could prompt the user to overwrite or not and code accordingly.
                    if (DirectoryEntry.Exists(newUserObject.Path))
                    {
                        // Step 4a: Remove the user object first
                        currentADObject.Children.Remove(new DirectoryEntry(newUserObject.Path));
                    }

                    //  Step 5: Add the user optional and required properties (sAMAccountName is ALWAYS REQUIRED!!)
                    newUserObject.Properties["sAMAccountName"].Add(username);
                    newUserObject.Properties["givenName"].Add(firstname); //Dont change the givenName and sn, they are the actual active directory properties
                    newUserObject.Properties["sn"].Add(lastname);
                    newUserObject.Properties["mobile"].Add(contactnumber);
                    newUserObject.Properties["mail"].Add(emailid);
                 
         
                    //  Step 6: Commit the changes to the AD data store
                    newUserObject.CommitChanges();

                    //  Step 7: Set the password for the new account, which can only be done AFTER the account exists!
                    //          We are using the "Invoke" method on the newUserObject, which uses Native AD Object under the hood to set
                    //          the password.  I've only seen this done, using the Invoke method, which is why I've used it here
                    newUserObject.Invoke("setPassword", password);

                    //  Step 8: Enable the user, if the user wants to, by setting the userAccountControl property
                    //          to the magical value of 0x0200.  The disable-user value is 0x0002
                    newUserObject.Properties["userAccountControl"].Value = 0x0200;
                    newUserObject.CommitChanges();

                    string ad_successvar = "User: " + username + " successfully created in AD!";
                    tracingService.Trace(ad_successvar);
                 
                }
                else
                {
                    string ad_unsuccessvar = "You must select an AD Object that is a container, user creation in AD Failed";
                    tracingService.Trace(ad_unsuccessvar);
                }
            }

            catch (Exception ex)
            {
                string ad_exception = ex.Message + " some exception in creating the user in AD";
                tracingService.Trace(ad_exception);
            }

        }


CRM 2011 JAVASCRIPT- IFRAME ÖZELLİKLERİ


Visible

   Xrm.Page.getControl("IFRAME_quoteproduct").setVisible(false);

Link Verme

IFRAME e link verme crm uzerınden iframe eklenınce verilir.Ama querystring yoluyla veri gondermek ıstersek Formun onload ına iframe e link veren javascript yazabiliriz.

  string url="http://gkhnmnts.blogspot.com&id=12345";
   Xrm.Page.getControl("IFRAME_quoteproduct").setSrc(url);

IFRAME üzerinde acılan sayfada tetiklenme olaylarının olmaması

Acılan sayfadaki aracların tetiklenmesi (butona tıklanması,drop downun secilmesi vs.) için 
"Select whether to restrict cross-frame scripting" bolumundeki seçili işaretini kaldırınız.

C# - SPLİT KULLANIMI



Belli bir sarta gore string imizi parcalara ayırır.Kullanımını asagıda kısa bir örnekle acıklayacagım.

Örnek:
string tarih = DateTime.Now.ToShortDateString(); // gunun tarihini alır. 14/12/2012
string[] tarihDizi = tarih.Split('/'); /*degiskenımı '/' karakterıne gore parcalara boler ve diziye atar.*/

/*Dizi içerisinde donup tarıhtekı '/' karakterını kaldırıp ,tarıhı yıl ay gun olarak yazdırma*/
for (int i = 0; i < tarihDizi.Length; i++) {
    fatura.dgTarih += tarihDizi[tarihDizi.Length - 1 - i];
}
/*Sonuc olarak fatura.dgTarih degiskenıne 20121214 degerı atanır.*/


CRM 2011-Web APPLICATION ISV ALTINA KAYDETME


Yapmak gereken sey web.config dosyamızın ıcerısınde gereklı ayarlamaları yapmaktır.Aşagıdakı satırları config dosyamıza eklersek uygulamamız isv altına page lerimizi atar.


<configSections>
   <remove name="crm.authentication" />
</configSections>

<httpModules>
   <clear/>
</httpModules>

CRM 2011-ENTITY REFERENCE COLLECTION KULLANIMI


Eger entity reference collection kullanmamız gerekıyorsa ;QueryExpression yoluyla sorgumuzu yaptıktan sonra entity collection da tuttugumuz degerlerı asagıdakı kod da oldugu gibi entity reference collection a atarız.

QueryExpression sorgu=new QueryExpression (){

};
EntityCollection ec=null;

ec=service.RetrieveMultiple(sorgu);

EntityReferenceCollection co = new EntityReferenceCollection();
                if (ec != null)
                {
                    if (ec.Entities.Count > 0)
                    {
                        foreach (Entity item in ec.Entities)
                        {
                            co.Add(item.ToEntityReference());
                        }
                        return co;
                    }
                    else
                    {
                        return null;
                    }
                }

CRM 2011 JAVASCRIPT- KULLANICI ROLU (GETUSERROLES)


Entityler üzerinde calısırken kullanıcının rolune gore işlem yapabilme yetkısı verılmesı gerektıgınde oncelıkle kullanıcının rollerını bılmek lazım.Bunu da Xrm.Page.context.getUserRoles() ifadesiyle elde edebiliyoruz.

Xrm.Page.context.getUserRoles() ifadesını kullanınca kullanıcının rollerı bir dizi halınde doner.Bellı bir role gore ıslem yapabilme yetkisi vereceksek tek yapmak gereken dizinin elemanlarında aradıgımız degerle eslestırmek.

Önemli: Dizinin satırları bize kullanıcı rolunun guid degeri verir.Eger kullanıcı rolunun adını almak ıstıyorsak ya fetchxml yoluyla ya da jquery kullanarak elimizdekı guid degere karsılık gelen rolu Crm içerısındekı guvenlık rolu entitysınden cekmemız gerekmektedir.

Asagıda ornek bir kod satırı bulunmaktadır.

Örnek:
Asagıda guid degerıne sahip oldugum bir user rolunu bulup,ona gore belırlı bır alanın enable ozellıgını set edıyorum.


function funk1() {

    var deger= Xrm.Page.getAttribute("attributename").getValue();
    if (deger== 1) {
        var currentUserRoles = Xrm.Page.context.getUserRoles(); // kullanıcının rollerını alma
        if (currentUserRoles != null && currentUserRoles.length != 0)// kullanıcı rollerını tek tek dolasma
            for (var i = 0; i < currentUserRoles.length; i++) {
                var userRole = currentUserRoles[i];
                if (userRole.toString() == 'CF3289F2-2398-E111-9F2C-00155D1A5106') {
                    Xrm.Page.getControl("check").setDisabled(false);
                    break;
                }
                else {
                    Xrm.Page.getControl("check").setDisabled(true);
                    break;
                }

            }

    }

}

CRM 2011 JAVASCRİPT-SAVE METOTLARI (Varlığı javascript ile kaydetme)




Entity i kaydetmek için 3 tip vardır.

1.Entity formundaki SAVE butonu

Xrm.Page.data.entity.save();
2.  Formdaki 'SAVE AND NEW'

Xrm.Page.data.entity.save('saveandnew');

3. 'SAVE AND CLOSE'
Xrm.Page.data.entity.save('saveandclose');


Kaydetme Modları
Save
 Code: 1
 Function: crmForm.Save();

SaveAndClose
 Code: 2
 Function: crmForm.SaveAndClose();

SaveAsCompleted
 Code: 58
 Function: SaveAsCompleted();

SaveAndNew
 Code: 59
 Function: crmForm.SubmitCrmForm(59, true, true, false);

CRM 2011-INVOICE PRICING LOCK and UNLOCK


LOCK:
                    
  LockInvoicePricingRequest lockInvoiceRequest =
                        new LockInvoicePricingRequest()
                    {
                        InvoiceId = _invoiceId
                    };
                    _serviceProxy.Execute(lockInvoiceRequest);

                    Console.WriteLine("Invoice pricing lock.");

UNLOCK:


  UnlockInvoicePricingRequest unlockInvoiceRequest =
                        new UnlockInvoicePricingRequest()
                    {
                        InvoiceId = _invoiceId
                    };
                    _serviceProxy.Execute(unlockInvoiceRequest);

                    Console.WriteLine("Invoice pricing unlocked.");

CRM 2011-ORDER DAN INVOICE OLUSTURMA (Convert the sales order to an Invoice)


ConvertSalesOrderToInvoiceRequest  clasıını kullanarak order dan invoice olusturabiliyoruz.
Gereklı olan hangı order ve hangı sutunlarının invoice a donusecegını vermek.

Örnek:
ColumnSet invoiceColumns =new ColumnSet(){AllColumns=true};//tum kolonları invoice donustur.

ConvertSalesOrderToInvoiceRequest req =
    new ConvertSalesOrderToInvoiceRequest()
    {
        SalesOrderId = new Guid("5481CF89-BFC1-E011-844B-1CC1DEF177B7"),
        ColumnSet = invoiceColumns
    };
ConvertSalesOrderToInvoiceResponse response =
                                                            (ConvertSalesOrderToInvoiceResponse)service.Execute(req);
Invoice invoice = (Invoice)response.Entity;

CRM 2011-TEKLİFİ ACTİVE DURUMUNA GETİRME(QUOTE ACTIVE)


 SetStateRequest activateQuote = new SetStateRequest()
                    {
                        EntityMoniker = quote.ToEntityReference(),// teklifi referans ver
                        State = new OptionSetValue((int)QuoteState.Active),// durumu active yap
                        Status = new OptionSetValue((int)quote_statuscode.InProgress) // bir status ver
                    };
                    _serviceProxy.Execute(activateQuote); // classı calıstır.

CRM içerisinden açılan custom page den açılan crm sayfasının yenilenmesi(Page Refresh)


function xrmpagerefresh() 

{
            window.parent.opener.parent.location.reload();
 }

"window.parent.opener.parent" bu kod ile sayfayı actıgımız crm sayfasına gecıs yaparız ve artık onunla ilgili javascriptler yazabiliriz.

Mesela custom page den  actıgımız crm sayfasıyla ilgili bazı degerleri cekelım.

var serverurl= window.parent.opener.parent.Xrm.Page.context.getServerUrl();
var organizationname= window.parent.opener.parent.Xrm.Page.context.getOrgUniqueName();

Bu gibi örnekleri turetebiliriz.

CRM 2011-SALES ORDER CLOSE İŞLEMİ


FulfillSalesOrderRequest classını kullanarak orderclose olusturarak siparişi kapatabiliriz.Status da bir durum vermek gereklidir.

Örnek;
FulfillSalesOrderRequest request = new FulfillSalesOrderRequest
            {
                OrderClose = new OrderClose
                {
                    SalesOrderId = new EntityReference 
                        { LogicalName = SalesOrder.EntityLogicalName, Id = _salesOrderId.Value }
                    
                },
                Status = new OptionSetValue(newStatus)
            };
FulfillSalesOrderResponse response= (FulfillSalesOrderResponse)crmService.Execute(request);

SAYFANIN QUERY STRINGINI ALMA-JAVASCRİPT


function getQueryStrings() {
    var message = document.getElementById("myOutputArea");
    var dataParameterString, querystring;
    // get data from querystring
    if (window.location.search != "") {
        querystring = window.location.search.substr(1).split("&");
        for (var i in querystring) {
            querystring[i] = querystring[i].replace(/\+/g, " ").split("=");
        }
        //look for the parameter named 'data'
        for (var i in querystring) {
            if (querystring[i][0].toLowerCase() == "data") {
                dataParameterString = querystring[i][1];
                break;
            }
        }

        message.innerText += dataParameterString;

    } else {
        message.innerText = "No details were specified in the querystring.";
        alert("ERROR: " + message.innerText);
    }
}    

ASP #NET de MENU KULLANIMI


<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">
                    <Items>
                        <asp:MenuItem NavigateUrl="~/Default.aspx" Text="Import Tool"/>
                        <asp:MenuItem NavigateUrl="#" Text="Qualification Tool"/>
                    </Items>
                </asp:Menu>

Crm 2011'de Sub Grid'i JavaScript ile Yenilemek

var grid = Xrm.Page.ui.controls.get("subgrid_ismi");
grid.refresh();

// yada bu şekilde kullanabilirsiniz
document.getElementById("subgrid_ismi").control.refresh();

Crm 2011'de Javascript ile Bir Alanın Zorunluluğu Değiştirmek


Crm 2011'de bir alanın zorunlu olup olmadığını javascript ile belirlemek için aşağıdaki kodu kullanabiliriz.
// Zorunlu değil
Xrm.Page.getAttribute("alan_adi").setRequiredLevel("none");
  
// Mecburi
Xrm.Page.getAttribute("alan_adi").setRequiredLevel("required");
  
// Önerilen
Xrm.Page.getAttribute("alan_adi").setRequiredLevel("recommended");

CRM 2011-Teklifi Win Yapma(Quote Win)


WinQuoteRequest classını kullanarak QuoteId property sıne Teklifin reference ını vermek yeterlidir.

WinQuoteRequest winQuoteRequest = new WinQuoteRequest()
                    {
                        QuoteClose = new QuoteClose()
                        {
                            Subject = "Teklif Kapatıldı." + DateTime.Now.ToString(),
                            QuoteId = quote.ToEntityReference() // new EntityReference("quote",quote.Id)
                        },
                        Status = new OptionSetValue(-1)
                    };
                    _serviceProxy.Execute(winQuoteRequest);

CRM 2011-SalesOrder Unlock İşlemi


Eğer order ımız lock ise ,yani ispricelocked ==true, salesorder ı unlock işlemine tabi tutmadan update yapamayız.Eğer bu işlemi yapmazsak "salesorder lock" diye hata alırız.

SalesOrder order=(SalesOrder)_serviceProxy.Retrieve("salesorder",_guidid,new ColumnSet("salesorderid","ispricelocked"));

if(order.IsPriceLocked ==true){
  UnlockSalesOrderPricingRequest unlockOrderRequest =
                                 new UnlockSalesOrderPricingRequest()
                    {
                        SalesOrderId = _salesOrderId // Order ımızın guid id sini veriyoruz.
                    };
                    _serviceProxy.Execute(unlockOrderRequest);
}
Artık salesorder ımızın ispricelocked u false tur.İlgili değişiklikler yapıp update yapabiliriz.

CRM 2011-Query Expression -(Sort İşlemi )


QueryExpression sorgu=new QueryExpression (){
EntityName="product",
ColumnSet=new ColumnSet(){AllColumns=true}
};

OrderExpression order=new  OrderExpresison(){
 AttributeName="name",  // hangı alana gore sıralama yapacagınızı belırlıyorsunuz.
OrderType=OrderType.Ascending // artan sırada sıralama yapar.Mesela bu örnek te isme gore a dan z ye dogru sıralama yapar.
};

sorgu.Orders.Add(order); // sorgumuza sortumuzu eklemeyı unutmayalım.
Yukarıdakı kod da, tum ürünleri isim alanına gore A dan Z ye dogru sıralar.

Not: Birden cok alana gore sıralama yapmak istersek OrderExpression olusturup QueryExpression ımıza eklememiz gerekir.QueryExpression ımıza ekledıgımız sırada sıralama yapar.

Örnek 2:Birden cok alana gore sıralama 

public static BusinessEntityCollection GetDynamicEntitiesWithFiltersOrdered(string entityName, string[] attributes, string[] fields, string[] values, string[] orderfields, bool[] orderAscending, ICrmService serv)
{
    
        var filters = new FilterExpression { FilterOperator = LogicalOperator.And };

        for (int i = 0; i < fields.Length; i++)
        {
            var condition = new ConditionExpression
            {
                AttributeName = fields[i],
                Operator = ConditionOperator.Equal,
                Values = new[] { values[i] }
            };

            filters.Conditions.Add(condition);
        }
        
        var query = new QueryExpression
        {
            EntityName = entityName,
            ColumnSet = new ColumnSet(attributes),
            Criteria = filters
        };

        for (int i = 0; i < fields.Length; i++)
        {
            var oneExpression = new OrderExpression
                 {
                     AttributeName = orderfields[i],
                     OrderType = (orderAscending[i] ? OrderType.Ascending : OrderType.Descending)
                 };

            query.Orders.Add(oneExpression);
        }

        var retrieve = new RetrieveMultipleRequest { Query = query, ReturnDynamicEntities = true };

        var retrieved = (RetrieveMultipleResponse)serv.Execute(retrieve);

        return retrieved.BusinessEntityCollection;
    }
}

CRM 2011-Yönetici Atama( SetParentSystemUserRequest)


private string YoneticiAta(int oracleyoneticiId,Guid userid, IOrganizationService service) {
            string ileti = string.Empty;
            try {
                SystemUser yonetici = Kullanici.SatisTemsilciBul(oracleyoneticiId, service);
                if (yonetici != null && yonetici.Id != Guid.Empty) {
                    try {
                        SetParentSystemUserRequest req = new SetParentSystemUserRequest();
                        req.UserId = userid;
                        req.ParentId = yonetici.Id;
                        req.KeepChildUsers = true;
                        SetParentSystemUserResponse resp = (SetParentSystemUserResponse)crmService.Execute(req);
                    }
                    catch (Exception ex) {
                        ileti= "Yonetici atamada hata olustu.Hata :" + ex.Message;
                    }
                }
            }
            catch (Exception ex) {
                ileti = ex.Message;
            }
            return ileti;
        }

CRM 2011-OptionSetValue Değerlerini Alma


 private string getName(string optionsetName,int val,string entity)
        {
            try
            {
                RetrieveAttributeRequest req = new RetrieveAttributeRequest();
                req.EntityLogicalName = entity;
                req.LogicalName = optionsetName;               
                RetrieveAttributeResponse res = (RetrieveAttributeResponse)XrmContext.Execute(req);
                PicklistAttributeMetadata objPckLstAttMetadata = new PicklistAttributeMetadata();
                ICollection<object> objCollection = res.Results.Values;
                objPckLstAttMetadata.OptionSet = ((EnumAttributeMetadata)(objCollection.ElementAt(0))).OptionSet;
                foreach (var item in objPckLstAttMetadata.OptionSet.Options)
                {
                    if (item.Value==val)
                    {
                        return item.Label.LocalizedLabels[0].Label;
                    }
                }
                return string.Empty;
            }
            catch (Exception)
            {

                return string.Empty;
            }
        }

CRM 2011 -Javascript ile Fetch XML Kullanımı


Crm 2011 ile fetch xml kullanmak için ilk önce fetch xml i calısan javascript dosyamızı webresource lara eklememız lazım.Bu javascript dosyasını sayfanın altında bulabilirsiniz.
Asagıda kullanıcının takımlarına gore işlem yapan bir javascript fonksıyonu vardır.İlk once fetch xml yoluyla kullanıcının takımlarını alır daha sonra ıslemımızı yaparız.
Not=Eklediğimiz fetch xml i calsıtıran javascript dosyasını formumuza eklemek zorundayız.


function CreateOrder() {/*Only,Accounts Team can create order*/
    var formType = Xrm.Page.ui.getFormType();
    if (formType == 4) {
        var userid = Xrm.Page.context.getUserId();
        var url = Xrm.Page.context.getServerUrl();
        var createOrderButton = document.getElementById("Mscrm.Form.quote.CreateOrder");
        if (createOrderButton != null) {
            createOrderButton.disabled = true;
        }
        var _oService;
        var _sOrgName = "";// bos deger atadım cunku asagıda getServerUrl ıcerısınde hazır gelıyor.
        var _sServerUrl = Xrm.Page.context.getServerUrl();

        var sFetch = "<fetch distinct='true' mapping='logical' output-format='xml-platform' version='1.0'><entity name='team'> <attribute name='name'/> <attribute name='businessunitid'/> <attribute name='teamid'/> <order descending='false' attribute='name'/> <link-entity name='teammembership' intersect='true' visible='false' to='teamid' from='teamid'> <link-entity name='systemuser' to='systemuserid' from='systemuserid' alias='aa'> <filter type='and'> <condition attribute='systemuserid' value='" + userid + "' uitype='systemuser'  operator='eq'/> </filter> </link-entity> </link-entity> </entity> </fetch>";
        _oService = new FetchUtil(_sOrgName, _sServerUrl);
//new FetchUtil =>Yukarıda bahsetmıs oldugum fetch xml ı calsıtırmak için ekledıgımız javascript dosyasının //adıdır.
        _oService.Fetch(sFetch, myCallBack);
//Burada myCallBack ismine dikkat edelım.Buraya yazılan isme göre fonksıyona dallanır.Dikkat edersenız //asagıda myCallBack adlı fonksıyon bulunmaktadır.
    }

    function myCallBack(results) {
        if (results != null && results.length != 0) {
            for (var i = 0; i < results.length; i++) {
                if ((results[i].attributes["name"].value).toUpperCase() == "ACCOUNTS") {
//Takım adı ACCOUNTS olan takıma gore islemımı yapıyorum.
                    var createOrderButton = document.getElementById("Mscrm.Form.quote.CreateOrder");
                    if (createOrderButton != null) {
                        createOrderButton.disabled = false;
                    }
                }
            }
        }
    }
}

FetchUtil.js 
var XMLHTTPSUCCESS = 200;
var XMLHTTPREADY = 4;

function FetchUtil(sOrg, sServer) {
    this.org = sOrg;
    this.server = sServer;

    if (sOrg == null) {
        if (typeof (ORG_UNIQUE_NAME) != "undefined") {
            this.org = ORG_UNIQUE_NAME;
        }
    }

    if (sServer == null) {
        this.server = window.location.protocol + "//" + window.location.host;
    }
}

FetchUtil.prototype._ExecuteRequest = function (sXml, sMessage, fInternalCallback, fUserCallback) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open("POST", this.server + "/XRMServices/2011/Organization.svc/web", (fUserCallback != null));
    xmlhttp.setRequestHeader("Accept", "application/xml, text/xml, */*");
    xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");

    if (fUserCallback != null) {
        //asynchronous: register callback function, then send the request.
        var crmServiceObject = this;
        xmlhttp.onreadystatechange = function () {
            fInternalCallback.call(crmServiceObject, xmlhttp, fUserCallback)
        };
        xmlhttp.send(sXml);
    } else {
        //synchronous: send request, then call the callback function directly
        xmlhttp.send(sXml);
        return fInternalCallback.call(this, xmlhttp, null);
    }
}

FetchUtil.prototype._HandleErrors = function (xmlhttp) {
    /// <summary>(private) Handles xmlhttp errors</summary>
    if (xmlhttp.status != XMLHTTPSUCCESS) {
        var sError = "Error: " + xmlhttp.responseText + " " + xmlhttp.statusText;
        alert(sError);
        return true;
    } else {
        return false;
    }
}

FetchUtil.prototype.Fetch = function (sFetchXml, fCallback) {
    /// <summary>Execute a FetchXml request. (result is the response XML)</summary>
    /// <param name="sFetchXml">fetchxml string</param>
    /// <param name="fCallback" optional="true" type="function">(Optional) Async callback function if specified. If left null, function is synchronous </param>

    var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    request += "<s:Body>";

    request += '<Execute xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services">' + '<request i:type="b:RetrieveMultipleRequest" ' + ' xmlns:b="http://schemas.microsoft.com/xrm/2011/Contracts" ' + ' xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' + '<b:Parameters xmlns:c="http://schemas.datacontract.org/2004/07/System.Collections.Generic">' + '<b:KeyValuePairOfstringanyType>' + '<c:key>Query</c:key>' + '<c:value i:type="b:FetchExpression">' + '<b:Query>';

    request += CrmEncodeDecode.CrmXmlEncode(sFetchXml);

    request += '</b:Query>' + '</c:value>' + '</b:KeyValuePairOfstringanyType>' + '</b:Parameters>' + '<b:RequestId i:nil="true"/>' + '<b:RequestName>RetrieveMultiple</b:RequestName>' + '</request>' + '</Execute>';

    request += '</s:Body></s:Envelope>';

    return this._ExecuteRequest(request, "Fetch", this._FetchCallback, fCallback);
}

FetchUtil.prototype._FetchCallback = function (xmlhttp, callback) {
    ///<summary>(private) Fetch message callback.</summary>
    //xmlhttp must be completed
    if (xmlhttp.readyState != XMLHTTPREADY) {
        return;
    }

    //check for server errors
    if (this._HandleErrors(xmlhttp)) {
        return;
    }

    var sFetchResult = xmlhttp.responseXML.selectSingleNode("//a:Entities").xml;

    var resultDoc = new ActiveXObject("Microsoft.XMLDOM");
    resultDoc.async = false;
    resultDoc.loadXML(sFetchResult);

    //parse result xml into array of jsDynamicEntity objects
    var results = new Array(resultDoc.firstChild.childNodes.length);
    for (var i = 0; i < resultDoc.firstChild.childNodes.length; i++) {
        var oResultNode = resultDoc.firstChild.childNodes[i];
        var jDE = new jsDynamicEntity();
        var obj = new Object();

        for (var j = 0; j < oResultNode.childNodes.length; j++) {
            switch (oResultNode.childNodes[j].baseName) {
                case "Attributes":
                    var attr = oResultNode.childNodes[j];

                    for (var k = 0; k < attr.childNodes.length; k++) {

                        // Establish the Key for the Attribute
                        var sKey = attr.childNodes[k].firstChild.text;
                        var sType = '';

                        // Determine the Type of Attribute value we should expect
                        for (var l = 0; l < attr.childNodes[k].childNodes[1].attributes.length; l++) {
                            if (attr.childNodes[k].childNodes[1].attributes[l].baseName == 'type') {
                                sType = attr.childNodes[k].childNodes[1].attributes[l].text;
                            }
                        }

                        switch (sType) {
                            case "a:OptionSetValue":
                                var entOSV = new jsOptionSetValue();
                                entOSV.type = sType;
                                entOSV.value = attr.childNodes[k].childNodes[1].text;
                                obj[sKey] = entOSV;
                                break;

                            case "a:EntityReference":
                                var entRef = new jsEntityReference();
                                entRef.type = sType;
                                entRef.guid = attr.childNodes[k].childNodes[1].childNodes[0].text;
                                entRef.logicalName = attr.childNodes[k].childNodes[1].childNodes[1].text;
                                entRef.name = attr.childNodes[k].childNodes[1].childNodes[2].text;
                                obj[sKey] = entRef;
                                break;

                            default:
                                var entCV = new jsCrmValue();
                                entCV.type = sType;
                                entCV.value = attr.childNodes[k].childNodes[1].text;
                                obj[sKey] = entCV;

                                break;
                        }

                    }

                    jDE.attributes = obj;
                    break;

                case "Id":
                    jDE.guid = oResultNode.childNodes[j].text;
                    break;

                case "LogicalName":
                    jDE.logicalName = oResultNode.childNodes[j].text;
                    break;

                case "FormattedValues":
                    var foVal = oResultNode.childNodes[j];

                    for (var k = 0; k < foVal.childNodes.length; k++) {
                        // Establish the Key, we are going to fill in the formatted value of the already found attribute
                        var sKey = foVal.childNodes[k].firstChild.text;

                        jDE.attributes[sKey].formattedValue = foVal.childNodes[k].childNodes[1].text;

                    }
                    break;
            }

        }

        results[i] = jDE;
    }

    //return entities
    if (callback != null) callback(results);
    else return results;

}
function jsDynamicEntity(gID, sLogicalName) {
    this.guid = gID;
    this.logicalName = sLogicalName;
    this.attributes = new Object();
}

function jsCrmValue(sType, sValue) {
    this.type = sType;
    this.value = sValue;
}

function jsEntityReference(gID, sLogicalName, sName) {
    this.guid = gID;
    this.logicalName = sLogicalName;
    this.name = sName;
    this.type = 'EntityReference';
}

function jsOptionSetValue(iValue, sFormattedValue) {
    this.value = iValue;
    this.formattedValue = sFormattedValue;
    this.type = 'OptionSetValue';
}