Thursday, December 27, 2012

Reusable JScript Functions


if (typeof (Xrm) == "undefined") Xrm = {};
Xrm.Common = {
    retrieveRecords: function (odataQuery) {
        if (!odataQuery) {
            alert("odataQuery is required.");
            return;
        }

        //The XRM OData end-point
        var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
        var serverUrl = Xrm.Page.context.getServerUrl();
        var records;

        //Asynchronous AJAX function to Retrieve a CRM record using OData
        $.ajax(
{
    type: "GET",
    async: false,
    contentType: "application/json; charset=utf-8",
    datatype: "json",
    url: serverUrl + ODATA_ENDPOINT + "/" + odataQuery,
    beforeSend: function (XMLHttpRequest) {
        //Specifying this header ensures that the results will be returned as JSON.            
        XMLHttpRequest.setRequestHeader("Accept", "application/json");
    },
    success: function (data, textStatus, XmlHttpRequest) {
        records = WEG.Xrm.retrieveRecordsCompleted(data.d, textStatus, XmlHttpRequest);
    },
    error: function (XmlHttpRequest, textStatus, errorThrown) {
        WEG.Xrm.errorHandler(XmlHttpRequest, textStatus, errorThrown);
    }
});
        return records;
    },

    /* Call back method*/
    retrieveRecordsCompleted: function (data, textStatus, XmlHttpRequest) {
        return data.results;
    },

    errorHandler: function (xmlHttpRequest, textStatus, errorThrown) {
        alert("Error : " + textStatus + ": " + xmlHttpRequest.statusText);
    },

    setLookupValue: function (fieldName, id, name, entityType) {
        if (fieldName != null) {
            var lookupValue = new Array();
            lookupValue[0] = new Object();
            lookupValue[0].id = id;
            lookupValue[0].name = name;
            lookupValue[0].entityType = entityType;
            if (Xrm.Page.getAttribute(fieldName) != null)
                Xrm.Page.getAttribute(fieldName).setValue(lookupValue);
        }
    },
    setAttributeValue: function (fieldName, fieldValue) {
        if (fieldName != null) {
            if (Xrm.Page.getAttribute(fieldName) != null) {
                Xrm.Page.getAttribute(fieldName).setValue(fieldValue);
            }
        }
    },

    dateReviver: function (value) {
        var a;
        if (typeof value === 'string') {
            a = /Date\(([-+]?\d+)\)/.exec(value);
            if (a) {
                return new Date(parseInt(value.replace("/Date(", "").replace(")/", ""), 10));
            }
        }
        return value;

    }
}

Thursday, November 22, 2012

Plugin Profiler to debug MS CRM 2011

Plugin profiler is used to debug plugin in MS Crm online. It can be used to debug plugins from dev machine other than application server.
Steps:
open plugin registration tool and Install  profiler


Rigtht click on the plugin step and click "Start Profiling"
Perform the action in MS CRM and download the log file
Replay Plugin execution - select log file, assembly and plugin
Attach the "Plugin Regisration.exe" process and mark debugger.
Start plugin execution


Monday, November 19, 2012

MS CRM long term vision

http://crmpublish.blob.core.windows.net/docs/CRM_SOD_November_2012_FINAL.pdf

Monday, August 20, 2012

Ribbon Editor


Download Erik Pool’s ribbon editor from CodePlex

Enjoy Ribbon Customization...:)

Useful JavaScript Functions

Rollup Pack 8 for Microsoft CRM 2011 shipped with a couple of nice JavaScript functions:

Xrm.Utility.openEntityForm(name,id,parameters)

and

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height)

Eg:  //pop incident form with default values

    Xrm.Utility.openEntityForm("incident", null, parameters);



Enjoy coding... :)

Saturday, June 2, 2012

Update Navigation URL in MS CRM 2011

// Update Navigation URL


    UpdateNavItemUrl: function (linkLabel,iframeUrl) {
       
        var items = Xrm.Page.ui.navigation.items.get();
        for (var i in items) {
            var item = items[i];
            var itemLabel = item.getLabel();
            //      alert(itemLabel);
            if (itemLabel.toLowerCase() == linkLabel.toLowerCase()) {
                //     alert(itemLabel);
                var areaId = item.getId();
                var navElement = document.getElementById(areaId);

                if (navElement != null && navElement != undefined) {
                    //         alert(iframeUrl);
                    navElement.onclick = function () {
                                                loadIsvArea(Mscrm.CrmUri.create(iframeUrl), false);
                                                var navIframeObject = document.getElementById(areaId + 'AreaFrame');
                                                navIframeObject.src = iframeUrl;
//TO Open in seperate window (popup)
                       // var windowL = (screen.width - 1000) / 2;
                        var windowT = (screen.height - 607) / 2;
//
  //                      window.open(iframeUrl, '', 'status=yes,location=no,menubar=no,resizable=no,height=607,width=1000,left=' + windowL + ',top=' + windowT);
                    };
                }
            }
        }
    }

Sunday, May 27, 2012

Check User Roles

Checking user role is a common requirement in MS CRM application. Here is the code using oData query.


//Get user roles

CustomcheckSecurityRole: function () {

    //Getting the user id of the logged in user 
    var user = Xrm.Page.context.getUserId();
    var loggedInUserId = user.substring(1, 37);
    flag = false;

    //Getting the roles of logged in user
    var odataSelect = "/SystemUserSet?$select=systemuserroles_association/Name,systemuserroles_association/RoleId&$expand=systemuserroles_association&$filter=SystemUserId eq guid'" + loggedInUserId + "'";

    var requestResults = GetEntityData(odataSelect);

    var roleName = ""; 

    //Comparing the roles of logged in user,If Display Role or Read All User is present return false

    for (var i = 0; i < requestResults.results[0].systemuserroles_association.results.length; i++) {
        roleName = requestResults.results[0].systemuserroles_association.results[i].Name; 
        if (roleName.toString() != "System Administrator")
        {
            flag = true;
        } 
    }
    return (flag);
}
//Get entity data. It requires oData query.
GetEntityData :function(OData) {
    var serverURL = getServerUrl();
    var oDataEndpointUrl = serverURL + "/XRMServices/2011/OrganizationData.svc";
    oDataEndpointUrl += OData;
    var service = GetRequestObject(); 

    if (service != null) {
        service.open("GET", oDataEndpointUrl, false);
        service.setRequestHeader("X-Requested-Width", "XMLHttpRequest");
        service.setRequestHeader("Accept", "application/json, text/javascript, */*");
        service.send(null);
        var requestResults = eval('(' + service.responseText + ')').d;

        if (requestResults != null)
            return requestResults;
        else
            return null;
    }
}


GetRequestObject: function () {
        if (window.XMLHttpRequest) {
            return new window.XMLHttpRequest;
        }
        else {
            try {
                return new ActiveXObject("MSXML2.XMLHTTP.3.0");
            }
            catch (ex) {
                return null;
            }
        }
    } 

getServerUrl: function {

       var customServerURL = document.location.protocol + "//" + document.location.host + "/" + Xrm.Page.context.getOrgUniqueName();
       return customServerURL;

      }
How to read Unsecure Configuration

In MS CRM plugin, reading some configration setting/constant is a common requirement . Through Unsecure configuration we can easily achieve this.


Add below configuration xml in unsecure configuration section of appropirate step in plugin registration tool.


<|?xml version="1.0" encoding="utf-8" ?|>
<|Settings>
  <|setting name="ReportExc_ReportExecutionService"|>
    <|value>http://localhost/ReportServer/ReportExecution2005.asmx<|/value>
  <|/setting>
  <|setting name="Unique_Organization">
    <|value>Contoso<|/value>
  <|/setting>
<|/Settings>


Read the configration xml from Plugin
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Microsoft.Xrm.Sdk;
namespace UnsecureConfig
{
    public class PlugInCreate:IPlugin
    {
         private XmlDocument _pluginConfiguration;
         public PlugInCreate(string unsecureConfig, string secureConfig)
         {
             if (string.IsNullOrEmpty(unsecureConfig))
             {
                 throw new InvalidPluginExecutionException("Unsecure configuration missing.");
             }
             _pluginConfiguration = new XmlDocument();
             _pluginConfiguration.LoadXml(unsecureConfig);
         }
         public void Execute(IServiceProvider serviceProvider)
         {
             // Obtain the execution context from the service provider.
             IPluginExecutionContext context =
                 (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 
             // Get a reference to the organization service.
             IOrganizationServiceFactory factory =
                 (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
             IOrganizationService service = factory.CreateOrganizationService(context.UserId); 
             // Get a reference to the tracing service.
             ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
             if (tracingService == null)
                 throw new InvalidPluginExecutionException("Failed to retrieve the tracing service.");

             string reportUrl = GetConfigDataString(_pluginConfiguration, "ReportExc_ReportExecutionService");
         }
         public static string GetConfigDataString(XmlDocument doc, string label)
         {
             return GetValueNode(doc, label);
         }
         private static string GetValueNode(XmlDocument doc, string key)
         {
             XmlNode node = doc.SelectSingleNode(String.Format("Settings/setting[@name='{0}']", key));
             if (node != null)
             {
                 return node.SelectSingleNode("value").InnerText;
             }
             return string.Empty;
         }
    }
}

Wednesday, May 23, 2012

Copy data from other Opportunity to new Opportunity


// Add a button on opportunity form. Add this file as web resource and call the function copyFromOpportunity on button action
var serverUrl = null;
serverUrl = Xrm.Page.context.getServerUrl();


//The XRM OData end-point
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";


function copyFromOpportunity() {
  
    retrieveRecord("Opportunity Lookup View", "SavedQuerySet", retrieveViewCompleted, null);


}


function retrieveOpportunity(id) {


    retrieveRecord(id, "opportunitySet", retrieveOpportunityCompleted, null);
}


function retrieveViewCompleted(data, textStatus, XmlHttpRequest) {


    var view = data[0];


    var viewId = view.SavedQueryId;


    if (viewId == null) {
        alert('null: setting value');
       
    }


    var queryStringParams = Xrm.Page.context.getQueryStringParameters();


    var etc = 0;


    for (var item in queryStringParams) {
        if (item == 'etc') {


            etc = queryStringParams[item];
            break;
        }
    }
    var customer = new Array();


    customer = Xrm.Page.getAttribute('customerid').getValue();


    var customerId = customer[0].id;


    var viewUrl = serverUrl + '/_controls/lookup/lookupinfo.aspx?AllowFilterOff=1&DefaultType=' + etc + '&DefaultViewId=' + viewId + '&DisableQuickFind=0&DisableViewPicker=1&LookupStyle=single&ShowNewButton=0&ShowPropButton=1&browse=0&objecttypes=' + etc;


    // alert(viewUrl);


    var retVal = window.showModalDialog(viewUrl, "", "width=900px,height=600px,resizable=1");


    if (retVal != null) {
        var kpLookup = retVal.items;
        retrieveKeyPlayer(kpLookup[0].id);
    }
}


function retrieveOpportunityCompleted(data, textStatus, XmlHttpRequest) {


    var opportunity = data;


    var opportunityName = opportunity.name;
 
    var customerLookup = new Array();
    if (opportunity.customerId.Id != null) {
        customerLookup[0] = new Object();
        customerLookup[0].id = opportunity.customerId.Id;
        customerLookup[0].name = opportunity.customerId.Name;
        customerLookup[0].entityType = 'account';


    }


    Xrm.Page.getAttribute('name').setValue(name);
    Xrm.Page.getAttribute('customerId').setValue(customerLookup);
// Setrequired fields values
}


function errorFromCallback(XmlHttpRequest, textStatus, error) {
    alert('error: ' + error);
}


function retrieveRecord(id, odataSetName, successCallback, errorCallback) {

    if (!id) {
        alert("record id is required.");
        return;
    }

    if (!odataSetName) {
        alert("odataSetName is required.");
        return;
    }
    if (odataSetName == 'opportunitySet') {
        $.ajax(
        {
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "(guid'" + id + "')",
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.            
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    successCallback(data.d, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    }
    else if (odataSetName == 'SavedQuerySet') {
        //alert("SavedQuerySet");
        $.ajax(
        {
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "?$filter=Name eq '" + id + "'",
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.            
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    //alert(serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "?$filter=Name eq '" + id + "'");
                    successCallback(data.d.results, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    }
}