Thursday, June 2, 2011

Microsoft Dynamics CRM 2011 : How to Set Default Price List on Opportunity Form?


The pricelist choosing dialog has a filter built into it to present only the pricelists that use the selected currency. Since the workflow configuration does not offer currency selection, so no pricelists pass through the filter.

Instructions:

1. First retrieve the default price list id, open default price list record and copy the URL address.

(If you are using CRM application mode then press F11 to make address bar visible)

In my case URL is: http://mycrm:5555/myorg/main.aspx?etc=1022&extraqs=%3f_gridType%3d1022%26etc%3d1022%26id%3d%257b7EC1E3A2-6B8C-E011-A88AE5EF0498D042%257d%26rskey%3d490666710&pagetype=entityrecord

2. Decode CRM URL address, open web address http://meyerweb.com/eric/tools/dencoder

3. Paste the URL address into the URL Decoder/Encoder text area

4. Click two times on Decode button to decode Url address completely. Decoded URL: http://mycrm:5555/myorg/main.aspx?etc=1022&extraqs=?_gridType=1022&etc=1022&id={7EC1E3A2-6B8C-E011-A88AE5EF0498D042}&rskey=490666710&pagetype=entityrecord

5. Copy Id= value in my case it is {7EC1E3A2-6B8C-E011-A88A-E5EF0498D042} and use in default price list JScript.

6. Use the following Jscript code into Opportunity entity form Onload event and make sure to change the Price List Name and Price List Id in function frmOnLoad.

JScript Code:

// Call this function on Opportunity Form onLoad
function frmOnLoad() {
    // If form Type = Create
    if (Xrm.Page.ui.getFormType() == 1) {
        // 1st Parameter is Price List Name, 2nd Parameter is Price List GUID
        SetDefaultPriceList("Test", "{36A2E249-278D-E011-A88A-E5EF0498D042}");
    }
}
function SetDefaultPriceList(prmPriceListName, prmPriceListId) {
    //Create an array to set as the DataValue for the lookup control.
    var lookupData = new Array();
    //Create an Object add to the array.
    var lookupItem = new Object();
    //Set the id, typename, and name properties to the object.
    lookupItem.id = prmPriceListId;
    lookupItem.typename = "pricelevel";
    lookupItem.name = prmPriceListName;
    // Add the object to the array.
    lookupData[0] = lookupItem;
    // Set the value of the lookup field to the value of the array.
    Xrm.Page.getAttribute("pricelevelid").setValue(lookupData);
}

Sunday, May 22, 2011

Microsoft Dynamics CRM 2011 : How to send Email Notificaiton on Record Sharing?


Solution: Workflows are very useful in Microsoft Dynamics CRM 2011, can be used to send automated email messages, create, update, assign records etc.. but can only be triggered on record creation, status change, assignment, attribute change and deletion and what if it is required to trigger workflow on entity SDK message processing i.e. record sharing etc. For such requirements, i am taking an example of sending email notifications on lead record sharing, You can follow the steps below for sending email notification on lead record sharing.

1.    Create two new attributes in lead entity
    
     a. new_IsSharedRecord (Type = Bit/Two Options)
    
     b. new_LastSharedDateTime (Type = DateTime)

2.    Create plugin that will be triggered on “GrantAccess” message of lead entity and update “new_isSharedRecord”  attribute value to “True” and also store current system date time in “new_LastSharedDateTime”

3.    Create new workflow that will be triggered when “new_isSharedRecord” attribute value will be changed

4.    Check if attribute “new_isSharedRecord” = true then execute below steps

a.    Update attribute value “new_isSharedRecord” = false

b.    Send email message



[Plugin Code]


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Metadata;
using Microsoft.Crm.Sdk;

namespace wod.Crm.LeadShareAlert
{
    public class wodPlugin : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            // Obtain the execution context from the service provider.
            Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
                serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

            IOrganizationServiceFactory wod_serviceFactory = null;

            IOrganizationService wod_CrmService = null;

            try
            {
                wod_serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                wod_CrmService = wod_serviceFactory.CreateOrganizationService(context.UserId);

                if (context.InputParameters.Contains("Target")
                && context.InputParameters["Target"] is EntityReference)
                {
                    switch (context.MessageName)
                    {
                        case "GrantAccess":

                            EntityReference wod_PluginEntity = (EntityReference)context.InputParameters["Target"];

                            if (wod_PluginEntity.LogicalName == "lead")
                            {
                                Entity wodLead = new Entity(wod_PluginEntity.LogicalName);

                                wodLead.Attributes.Add("leadid", wod_PluginEntity.Id);
                                wodLead.Attributes.Add("new_issharedrecord", true);
                                wodLead.Attributes.Add("new_lastshareddatetime", DateTime.Now);

                                wod_CrmService.Update(wodLead);
                            }

                            break;
                    }
                }

            }

            catch (System.Web.Services.Protocols.SoapException ex)
            {
                throw new InvalidPluginExecutionException(ex.Detail.InnerText);
            }
            catch (Exception ex)
            {
                throw new InvalidPluginExecutionException(ex.Message);
            }
        }
    }
}