23 Kasım 2012 Cuma

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");

22 Kasım 2012 Perşembe

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

21 Kasım 2012 Çarşamba

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