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';
}

GridView Filtreleme İşlemi(DataTable Select)


Datatable ımıza select sorgusu atarak yeni bir datatable olusturup daha sonra da bu datatable ı gridimize datasource olarak veriyoruz.Burada önbemli nokta ilk datatable ımızı clone() işlemıne tabi tutmak olacaktır.Boylelıkle column ismi vermeye gerek kalmaz ve gridin rowlarındakı verılerı alır.

Asagıdakı örnek te ,bir textbox a girilen kelimeye gore gridin herhangi bir kolonuna gore fıltreleme ıslemı yapılmaktadır.
protected void btn_Filter_Click(object sender, EventArgs e) {
            try {
                DataTable newDt = new DataTable();
                DataTable datatable = (DataTable)ViewState["GridProducts"];
   //Ben viewstate te tutmustum datatable ı.Siz su sekılde de datatable ınızı cekebilrsiniz.
  //Datatable datatable=(Datatable)gridView1.DataSource;
                if (datatable != null && datatable.Rows.Count != 0) {
                    if (!string.IsNullOrEmpty(txt_FiltrelenecekText.Text)) {
                        datatable.CaseSensitive = false;
                        string selectQuery = "Product_Name like '" + txt_FiltrelenecekText.Text + "%'";
                        DataRow[] results = datatable.Select(selectQuery);
                        if (results != null && results.Length != 0) {
                            newDt = datatable.Clone();
                          
                            //datatable.Clear();
                            foreach (DataRow row in results) {
                                newDt.ImportRow(row);
                                
                            }
                            grid_Product.DataSource = newDt;
                            grid_Product.DataBind();
                            grid_Product.Visible = true;
                        }
                        else {
                            EkranaMesajYaz("Product is not found in list.","ScreenMessage");
                        }
                    }
                    else {
                        EkranaMesajYaz("Filter text is empty.", "ScreenMessage");
                    }
                }
                else {
                    EkranaMesajYaz("Product List is null", "ScreenMessage");
                }
            }
            catch (Exception ex) {
                EkranaMesajYaz(ex.Message, "ScreenMessage");
            }
        }

LINQ da Limit Kullanımı-Skip().Take()

Skip(0).Take(6);
Fonksiyonları sırası ile kullanılır. Skip hangi kayıttan sonra ki kayıtlarını geleceğini, Take te kaç adet kayıt geleceğini belirtir.
0 ilk kayıt demek 6 da; 6 adet getir demek yani ilk kayıttan başla 6 adet getir dedik.
Skip(4).Take(2); 4. kayıttan başla 2 kayıt getir.
Skip(7).Take(1); 7. kayıtı getir demek.
Örnek:
Kullanımı aşağıdaki gibidir. Sorgunuzda OrderBy kullanmak zorundasınız.
var benzerler = (from d in Veriler.Urunlers
where d.RefUrunGrupID == Model.RefUrunGrupID
orderby Guid.NewGuid()
select d).Skip(0).Take(4);
bu örnek Urunler tablosundaki referans ürün grup id si, sayfaya gelen ürün ile aynı olam kayıtlardan rastgele 4 ünü listelemek için kullanıldı.

If,Using,Foreach lerin Kullanım Kolaylığı-(Visual Studio)



Aşağıdaki linkte bulunan extension uzun if ,using,foreach gibi blocklarda karışıklığı engelleyen ve parantezleri collapse etmeye yarayan çok güzel bir uygulama.  Kullanmanızı tavsiye ederim.


Kurulum: İndirilen extention double click yaparak visual studio ya ekleyebilirsiniz.

Ajax Control Toolkit Kurulumu



Ajax Control Toolkit , Visual Studio ile birlikte kullanılan ve içerik olarak Ajax konusunda ihtiyaç duyulan birçok aracı barındıran bir paket. Öncelikle bu paketi indirmek için Ajax Control Toolkit Download Sayfası ‘na gidiyoruz. Burada dikkat etmemiz gereken husus kullandığımız .Net Framework’un versiyonuna uygun olan dosyayı indirmemiz.
İndirdiğimiz arşiv dosyasının içerisinde “AjaxControlToolkit.dll” adında bir DLL dosyası olacak. Öncelikle Visual Studio ekranında Toolbox sekmesinde sağ tuşa tıklayarak “Add Tab” ı seçiyoruz.
Oluşan yeni tabın ismini verdikten sonra yine aynı tab üzerinde sağ tuşa tıklayarak açılan menüden “Choose Items” ı seçiyoruz. Karşımıza şu şekilde bir pencere açılacak:
Bu pencerede “.NET Framework Components” sekmesi altındaki “Browse” butonuyla Ajax Control Toolkit’e ait arşiv dosyasını açtığımız yerdeki “AjaxControlToolkit.dll” dosyasını seçiyoruz ve OK butonuna basıyoruz.
Artık Ajax Control Toolkit içeriği Toolbox’ımıza eklenmiş durumda. Unutmamamız gereken bu bileşenleri kullanırken “Ajax Extensions” tabı altındaki “ScriptManager” içeriğini sayfamıza eklememiş olmamız.