RSS

Tag Archives: Sukant Shekhar

CRM 2013 Manipulate Look up to show Multiple Entity Record

Introduction

Sometimes, we need to show multiple Entity record in the Look up of single Entity Look up in CRM 2013 like the Picture shown below. This Look up Dialog Box shows the record of two Entities, but the Look up is only of Contact

Two Entity Look Up

Solution

We can achieve this function by following code.

//Setting the lookup type
document.getElementById(LookUp_Logical_Name + "_i")
        .setAttribute("lookuptypes", 
                      "<EntityTypeCode of Entities to be shown in the look up>");

//Setting the lookup name Ex :- account:1:Account,contact:2:Contact
document.getElementById(LookUp_Logical_Name + "_i")
        .setAttribute("lookuptypenames", 
                      "[<Logical name>:<EntityTypeCode>:<Schema Name of Entity>]");

//Setting the lookup icon  Ex:-/_imgs/ico_16_1.gif:/_imgs/ico_16_2.gif
document.getElementById(LookUp_Logical_Name + "_i")
        .setAttribute("lookuptypeIcons", 
                      "/_imgs/ico_16_<EntityTypeCode>.gif");

// default type - Account entity To set the default entity
document.getElementById(LookUp_Logical_Name + "_i")
        .setAttribute("defaulttype", 
                     "<EntityTypeCode>");

By Sukant Shekhar
Senior Software Engineer @Team DynamicsCRM.
Mindfire Solutions

 

Tags: , , , , , , , , , , , , , , , , , , , ,

CRM 2013 Open Entity Form in new Window by JavaScript

Introduction

During our customization in CRM, we need to open one Entity Form by JavaScript in a new Window.

Problem

By using Xrm.Utility.openEntityForm, it opens the record page in the same page or opens the record in a new Form.

Solution

To open the record in the new Window or to open in a new Dialog, we can use the following code

Note: Please give the Logical Name as Record Type is not taken in CRM 2013

function OpenRecords(Record_Id, Logical_Name_Of_Entity) {
    var reletivePath = "main.aspx?etn=" + Logical_Name_Of_Entity;
    reletivePath = reletivePath + "&pagetype=entityrecord&id=";

    var height = 1300; // Height of the Record Page.
    var width = 900; // Width of the Record Page.
    var windowName = "_blank";
    var serverUrl = Xrm.Page.context.getServerUrl();
    var nAgt = navigator.userAgent;

    if (serverUrl != null && serverUrl != "" 
                      && 
        Record_Id.replace("{", "").replace("}", "") != null)
    {
        serverUrl = serverUrl + reletivePath;
        serverUrl = serverUrl + Record_Id.replace("{", "").replace("}", "");
         
        if (nAgt.indexOf("Firefox") != -1) {
            window.open(serverUrl);
        } else {
            OpenStdWin(serverUrl, 
                       null, 
                       height, 
                       width, 
                       "titlebar=yes, resizable=yes");
        }
    }
}

By Sukant Shekhar
Senior Software Engineer @Team DynamicsCRM.
Mindfire Solutions

 

Tags: , , , , , , , , , , , , , , , , , ,

CRM 2013 JqGrid Theme

Behind the Scene

We built a Grid using a jqgrid Plugin in JavaScript for CRM 2011. That time the theme of the jqgrid was matching the CRM theme. But when we moved the solution to CRM 2013, the Grid was looking an odd one out as CRM 2013 Look and Feel was different.

Experiment

I tried to change the CSS of jqgrid and match it with the theme of CRM 2013, but found some problem with it. Then we have to remove the CSS used for the Grid and build a new CSS file for 2013.

Solution

The CSS, which were removed from the HTML page :-
1. jquery-ui-1.7.1.custom.css
2. ui.jqgrid.css (given in the jqGrid Plugin folder)

The CSS newly added for CRM 2013 is :- ui.jqgrid_custom.css (Custom build)
Feel free to click and download the CSS file and implement in your CRM projects.

Previously the Look was

jqPrevious

Now it has been Transformed to

jqGrid New

By Sukant Shekhar
Senior Software Engineer @Team DynamicsCRM.
Mindfire Solutions

 
 

Tags: , , , , , , , , , , , , , , ,

Open Dialog box like CRM 2013

Introduction

In this Blog, we will explore how to open a Dialog Box similar with CRM 2013 look and feel.

Background

Sometimes, we need to open the custom WebResource in a Dialog Box. But the Dialog Box should look like other Dialog Box in CRM 2013.

Custom Dialog Box

Solution

We can achieve this by one CRM function in the following way:

Note: Here, URL must be without Server URL.

For the Parent Window:

var DialogOption = new Xrm.DialogOptions;
DialogOption.width = <Height>; DialogOption.height = <width>;

Xrm.Internal.openDialog(<Relative_Url_of_the_Webresource>, 
                        DialogOption, 
                        null, null, 
                        CallbackFunction);

function CallbackFunction(returnValue){ }

In the Dialog Box, please include:

<script type="text/javascript" 
        src="../../../../../../webresources/ClientGlobalContext.js.aspx"></script>
/*This Might change according to the url*/

And

//Pass the return Value to the parent window
Mscrm.Utilities.setReturnValue(oReturn);

try {
    closeWindow(true);//Close the dialog box
}
catch (e) { }

By Sukant Shekhar
Senior Software Engineer @Team DynamicsCRM.
Mindfire Solutions

 

Tags: , , , , , , , , , , , , , , , , ,

CRM 2011 Multi Pick list

Introduction

In this article we will create a multiple pick list for dynamic CRM form. In which user can enter multiple data from pick list by check box. This will also work on Firefox and Chrome

5-1-2013 1-35-04 PM

Requirement

There was a demand in a project where user want to select not only one but multiple value from a pick list.

Solution

Steps which are needed to be followed:-

  1. Creation of field.

  2. Create Web resource.

  3. Add function to the form.

Creation of Field

There are two fields which are created on the entity you want to make multipicklist :-

  1. Option Set field :- all the option which must be entered

  2. Data Field:- Multiple Lines of Text Field. In which data is stored.

Include both the field on the form.

Create Web resource

Create a web resource with the following code:-

// var_sc_optionset >>  Provide schema-name for Option Set field
// var_sc_optionsetvalue >> Provide schema-name for field which will
//                          store the multi selected values for Option Set
// OS >> Provide Option Set field object
//       (Ex:- document.getElementById("Option Set field schema-name"))
// OSV >> Provide text field object which will store the
//        multi selected values for Option Set
//       (Ex:- document.getElementById("text field schema-name"))

//Method to convert an optionset to multi select Option Set
function ConvertToMultiSelect(var_sc_optionset, var_sc_optionsetvalue, OS, OSV) {

    if (OS != null && OSV != null) {
        OS.style.display = "none";

        // Create a DIV container
        var addDiv = document.createElement("div");
        addDiv.id = var_sc_optionsetvalue + "_m";
        addDiv.style.width = "100%";
        addDiv.style.height = "80px";
        addDiv.style.background = "#ffffff";
        addDiv.style.color = "white";
        addDiv.style.overflow = "auto";
        addDiv.style.border = "1px #6699cc solid";
        OS.parentNode.appendChild(addDiv);

        // Initialise checkbox controls
        for (var i = 1; i < OS.options.length; i++) {
            var pOption = OS.options[i];
            if (!IsChecked(pOption.innerHTML, OS, OSV)) {
                var addInput = document.createElement("input");
                addInput.type = "checkbox";
                addInput.style.border = "none";
                addInput.style.width = "25px";
                addInput.style.align = "left";
                addInput.style.color = "#000000";
                addInput.onclick = function () {
                    OnSave(OS, var_sc_optionsetvalue);
                    createTable(var_sc_optionsetvalue);
                }

            }
            else {
                var addInput = document.createElement("input");
                addInput.type = "checkbox";
                addInput.checked = "checked";
                addInput.style.border = "none";
                addInput.style.width = "25px";
                addInput.style.align = "left";
                addInput.style.color = "#000000";
                addInput.onclick = function () {
                    OnSave(OS, var_sc_optionsetvalue);
                    createTable(var_sc_optionsetvalue);
                }

            }
            //Create Label
            var addLabel = document.createElement("label");
            addLabel.style.color = "#000000";
            addLabel.innerHTML = pOption.innerHTML;

            var addBr = document.createElement("br"); //it's a 'br' flag

            OS.nextSibling.appendChild(addInput);
            OS.nextSibling.appendChild(addLabel);
            OS.nextSibling.appendChild(addBr);
        }
    }
}

//Supported functions

// Check if it is selected
function IsChecked(pText, OS, OSV) {
    if (OSV.value != "") {
        var OSVT = OSV.value.split(",");

        for (var i = 0; i < OSVT.length; i++) {
           if (OSVT[i] == pText)
              return true;
        }
    }

    return false;
}

// var_sc_optionsetvalue >> Provide schema-name for field which will
//                          store the multi selected values for Option Set
// OS >> Provide Option Set field object
// Save the selected text, this field can also be used in Advanced Find
function OnSave(OS, var_sc_optionsetvalue) {
    var getInput = OS.nextSibling.getElementsByTagName("input");
    var result = "";

    for (var i = 0; i < getInput.length; i++) {
        if (getInput[i].checked) {
            result += getInput[i].nextSibling.innerHTML + ",";
        }
    }

    //save value
    control = Xrm.Page.getControl(var_sc_optionsetvalue);
    attribute = control.getAttribute();
    attribute.setValue(result);
}

function createTable(var_sc_optionsetvalue) {
    //get option set value
    var OptionValue = Xrm.Page.getAttribute(var_sc_optionsetvalue);
    var c_OptionValue = Xrm.Page.getControl(var_sc_optionsetvalue);
    var d_OptionValue = var_sc_optionsetvalue + "_d";

    if (OptionValue.getValue() != null) {

        c_OptionValue.setVisible(true);
        var OptionValueHtml = "<div style=\"overflow-y:auto;width:100%; min-height: 5em; max-height: 1000px;\">";

        OptionValueHtml += "<table style='width:100%;height: 100%;'>";
        var OptionValueV = OptionValue.getValue();

        var OptionValueT = OptionValueV.split(",");
        var cols = 0;
        for (var row = 0; row < OptionValueT.length - 1; row++) {
            OptionValueHtml += "<tr  style='height:20px;'>";
            for (var i = cols; i < cols + 3; i++) {
                OptionValueHtml += "<td style='width:33%;'>";
                if (OptionValueT[i] != null || OptionValueT[i] != undefined) {

                    OptionValueHtml += OptionValueT[i];
                }
                OptionValueHtml += "</td>";
            }
            cols = cols + 3;
            OptionValueHtml += "</tr>";
            if (cols >= OptionValueT.length) {
                break;
            }
        }

        OptionValueHtml += "</table>";
        OptionValueHtml += "</div>";
        document.getElementById(d_OptionValue).innerHTML = OptionValueHtml;
    }
    else {
        c_OptionValue.setVisible(false);
    }
}

Add function to the form

There are three function which are needed to be added

  1. On Load :-

    1. Function name :- ConvertToMultiSelect.
      Parameter :- “new_multipicklistoption”, “new_multipicklistvalue”, document.getElementById(“new_multipicklistoption”), document.getElementById(“new_multipicklistvalue”)

    2. Function name :- createTable
      Parameter :- “new_multipicklistvalue”.
      5-1-2013 1-11-58 PM

    1. On Save :-
      1. Function Name :- OnSave
        Parameter :- document.getElementById(“new_multipicklistoption”), “new_multipicklistoption”

5-1-2013 1-12-52 PM

Reference

Multi-Select Option Sets in Dynamics CRM: Part 1(See Part 2 for the Latest Code)

By Sukant Shekhar
Senior Software Engineer @Team DynamicsCRM.
Mindfire Solutions

 
 

Tags: , , , , , , , , , , , , , , , , , , ,

Customization of CRM Application on Basis Of Security Role

Introduction

This article is about the change in CRM Application page made as per the role.

Requirement

There was a need which was made in a project to show only those views, buttons and links which are relevant for a particular role. Here are few steps which I took to customize the CRM as per Role.

Changes which are need to be made

  1. Change in the security role
  2. Customization of all the CRM form (Home page, Form Data Entry page, Form grid page)
  3. Changing the views according to the roles

Change in the security role

Change in the security role is made in the Setting → Administration → Security Role.

The privilege can be given on the basis of

  1. None:- That privilege will not be given
  2. User :- That user will able to do operation on his/her records only.
  3. Business Unit :- That user will able to do operation on his/her business unit records only.
  4. Parent Business Unit :- That user will able to do operation on his/her parent business unit records only.
  5. Organization :- That user will able to do operation on all records.

Security Role

Customization of all the CRM form (Home page, Form Data Entry page, Form grid page)

There are two things which are needed to be changed:-

  1. Ribbon Button
  2. Site map

Ribbon button Customization

Steps(Example :- Advance Find):-
  1. Create an entity in the name of the button (new_advancefindrole)
  2. Give the permission to the entity(new_advancefindrole) in the Security Role under custom entity(Read).
  3. Open the ribbon solution in a ribbon editor.
  4. Add a new button and copy  the (detail,action , display rule, enable rule ) from advance find to new button
  5. Add a new display rule
    1. Entity Privilege rule
    2. Give the name of the entity(new_advancefindrole)
    3. Privilege depth :- Basic
    4. Privilege type :- Read
    5. Default :- true
    6. Invert Result :- false
  6. Hide the original advance find button(we can’t change the display rule in original advance find as it is managed)
  7. Save the customization
  8. Give permission under security role to entity(new_advancefindrole) to read to show in different roles.

Site Map

Steps(Example :- Settings):-

  1. Create an entity in the name of the button (new_settingsrole)
  2. Give the permission to the entity(new_settingsrole) in the Security Role under custom entity(Read)
  3. Export the “Site map” solution from the CRM
  4. Open Customization.xml in an xml editor
  5. Find “Area Id=<AreaName>(Ex :- Settings)” tag. Paste the Code Below
  6. Paste this code under every subarea of the settings
  7. Save the solution zip it , import it and publish it
  8. give permission under security role to entity(new_settingsrole) to read to show in different roles.

Changing the views according to the roles

Showing the view according to the role. There are two method in which this can be done :-

  1. By plug-in
  2. By creating personal view and sharing it with team

By Plug-in

Steps:-

  1. Create the Plug-in with following code.
  2. By this plug-in the view Starting from “My” will not be shown
  3. Register it :-
    1. Message :- RetriveMultiple
    2. Primary Entity :- savedquery
    3. Eventing :- Per-operation
    4. Execution Mode:- Synchronous
    5. Deployment:- Server

Plug-in Code:-

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using Microsoft.Crm.Sdk;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Crm.Sdk.Messages;

namespace Excitation.PluginHideSystemViews
{
    public class CheckView : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            try
            {
                // Obtain the execution context from the service provider.
                Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
                // Obtain the organization service reference.
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

                // The InputParameters collection contains all the data passed in the message request.
                if (CheckRole(context.UserId, "Salesperson", service))
                {

                    if (context.InputParameters.Contains("Query") == true && context.InputParameters["Query"] is QueryExpression)
                    {
                        QueryExpression qe = (QueryExpression)context.InputParameters["Query"];

                        if (qe.EntityName == "savedquery")
                        {
                            if (qe.Criteria != null)
                            {
                                if (qe.Criteria.Conditions != null)
                                {
                                    /*The query is edited to look at views not starting with "My" at the begining of the View Name*/
                                    ConditionExpression queryCondition = new ConditionExpression("name", ConditionOperator.NotLike, "My%");
                                    qe.Criteria.Conditions.Add(queryCondition);
                                    //context.InputParameters.Properties[ParameterName.Query] = qe;
                                    context.InputParameters["Query"] = qe;
                                }
                            }
                        }

                    }
                }
                else
                {
                    QueryExpression qe = (QueryExpression)context.InputParameters["Query"];
                    context.InputParameters["Query"] = qe;
                }
            }
            catch (Exception e)
            {

            }
        }

        //check if the user belongs to the specified role....
        private static bool CheckRole(Guid UserGuid, string SecurityRole, IOrganizationService CrmService)
        {
            #region Retrieve records from an intersect table via QueryExpression

            //Create Query Expression to fetch Role Entity
            QueryExpression Query = new QueryExpression()
            {
                //Setting the link entity condition and filter condition criteria/
                LinkEntities =
                        {
                            new LinkEntity
                            {
                                LinkFromEntityName = "role",
                                LinkFromAttributeName = "roleid",
                                LinkToEntityName = "systemuserroles",
                                LinkToAttributeName = "roleid",
                                LinkCriteria = new FilterExpression
                                {
                                    FilterOperator = LogicalOperator.And,
                                    Conditions =
                                    {
                                        new ConditionExpression
                                        {
                                            AttributeName = "systemuserid",
                                            Operator = ConditionOperator.Equal,
                                            Values = { UserGuid }
                                        }
                                    }
                                }
                            }
                        }
            };
            Query.EntityName = "role";

            Query.ColumnSet = new ColumnSet(true);

            // Obtain results from the query expression.
            EntityCollection UserRoles = CrmService.RetrieveMultiple(Query);

            // Searching for a specified Security Role into the list
            String test = "";
            test = UserGuid + "   \n";

            foreach (Entity UserSecurityRole in UserRoles.Entities)
            {
                test += (String)UserSecurityRole.Attributes["name"] + "  \n";
                if ((String)UserSecurityRole.Attributes["name"] == SecurityRole)
                {
                    return true;
                }
            }
            Entity testE = new Entity("new_transfer_opp");
            testE.Attributes["new_name"] = test;
            CrmService.Create(testE);
            if (UserRoles.Entities.Count == 0)
            {
                //return false as the role does not present
                return false;
            }
            else
            {
                return false;
            }

            #endregion

        }
    }
}

By creating personal view and sharing it with team

Steps(Example:- Sale manager):-

  1. Create a team(Sales manager) and add user to that team (Team is added under Administration)
  2. Create a view by Advance find Save that view
  3. Go to saved view and share the view to the team you want to see that view.

View Cutomization

By Sukant Shekhar
Senior Software Engineer @Team DynamicsCRM.
Mindfire Solutions

 

Tags: , , , , , , , , , , , , , , , , , , ,

 
%d bloggers like this: