Vibe scores Microsoft Dynamics Marketplace honor!

Posted by Mike Snyder on June 22, 2011  |  commentsComments (0)

I am excited and proud to announce that our enterprise social networking application Vibe was a finalist for Microsoft’s Partner of the Year award in the Dynamics Marketplace Solution Excellence category (official press release here)!

When we launched Vibe to the Dynamics Marketplace back in January 2011, we decided to try something unique…we gave it away for free! We believed then (and still do) that the benefits of social networking are so great that we wanted to share it with ALL Microsoft Dynamics CRM customers worldwide.

Five months after the public launch of Vibe, we couldn’t be prouder of the results:

  • Vibe is one of the top-rated applications on the Dynamics Marketplace
  • Vibe has been downloaded from 61 (yes sixty-one!) different countries
  • The Microsoft sales community frequently uses Vibe during their customer and prospect demos
  • Vibe was featured at multiple Convergence 2011 presentations regarding Social CRM
  • Sonoma Partners internal deployment of Vibe has had more than 20,000 posts in just 5 months!

We feel that this award helps formalize a lot of the success we’ve seen with Vibe, so we’re pretty pumped up!

If you’re new to Vibe, please check it out and learn how your organization might be able to use it. Otherwise you can learn more about Vibe and download it from the Dynamics Marketplace.

How to use Javascript to create dynamic cascading picklists in Microsoft CRM 2011

Posted by Mike Snyder on June 16, 2011 in   |  Microsoft Dynamics CRM 2011  |  commentsComments (14)

Today’s guest blogger is Chris Labadie, technical sales specialist at Sonoma Partners.

Microsoft CRM 2011 includes some great new improvements to option sets (also referred to as “picklists”). Some of these improvements include:

  • The ability to create global option sets (where you can use the same set of picklist values in mulitple fields – perfect for things like country and state lists!)
  • The ability to filter the option set values based off configured criteria (classic example here is only show contacts related to the account when you’re setting the primary contact of the account)

Unfortunately, one popular request still can’t be accomplished web-based configuration tools in Microsoft CRM 2011 = dynamic cascading picklists. When we say dynamic cascading picklists, we’re referring to a picklist where the options change based on selections made in another picklist. In this blog post, we’ll show you how you can quickly and easily configure your own dynamic cascading picklists. There is a little code involved, but if you can search/replace then you can use these examples for yourself even if you’re not a programming guru.

Let’s consider an example where we are using the Opportunity entity to sell health insurance plans and there are two picklists- health plan type (HMO, PPO, or POS) and health plan policy (HMO 5K, HMO 7K, PPO 500, PPO 750, POS Silver, and POS Gold). If the Opportunity owner chooses PPO as the plan type, we want to update the health plan policy picklist to only display PPO policies. It should automatically hide the HMO options.

One way to accomplish this is to create two custom entities (Health Plan Type and Health Insurance Plan) and use the option set filter option configured on the form. Health Plan Type is just a basic entity with a 1:N relationship to Health Insurance Plan. When I add a Lookup field for each entity onto the Opportunity form, I can set the Health Insurance Plan lookup to be a filtered lookup. So, in the field options I can set the lookup for Health Insurance Plan to only display records that have a matching Health Plan Type as the Health Plan Type field selection on the Opportunity.

FilteredLookup

The down side to this approach is that both fields must be of a type lookup, so you have to create entities instead of picklists. There are many situations where users would prefer picklists over entity lookups and for data that is fairly static, entities might be overkill.

For those scenarios where you don’t want the overhead of creating custom entities, you can leverage Javascript to accomplish the same goal of dynamic cascading picklists. Here’s the steps on how to do this:

  • Create your picklists fields in CRM and note the options you have added to each picklist. Add the picklists to a form. For this example, I created “sonoma_healthplantype” and “sonoma_healthinsuranceplan” and added them both to the Opportunity form.
  • Copy the following code sample into notepad (or your favorite code editing program).
    • Replace “sonoma_healthplantype” with the name of your first picklist.
    • Replace “sonoma_healthinsuranceplan” with the name of your dynamic picklist.
    • In the line “if(picklistOneSelectedValue == "HMO")” replace HMO with your first selection.
    • In the line “if ( picklistTwo.Options[i].Text=="PPO 500" || picklistTwo.Options[i].Text=="PPO 750" || picklistTwo.Options[i].Text=="POS Silver" || picklistTwo.Options[i].Text=="POS Gold")” replace each value (PPO 500, PPO750, etc.) with the values you want to remove on your first selection.
    • You will have to repeat the steps above for each value you want to filter on. The “//” lines show where each filter block begin and end. You can copy/paste to add more for more values or remove blocks if you have fewer values. Make sure you add or remove the entire code block from beginning to end.
function PicklistOneOnchange() {

    var picklistOneName = "sonoma_healthplantype"; //name of the first picklist
    var picklistTwoName = "sonoma_healthinsuranceplan";  //name of the picklist with dynamic values
	
	var picklistOne = Xrm.Page.getControl(picklistOneName);
	var picklistOneAttribute = picklistOne.getAttribute();
	
	var picklistTwo = Xrm.Page.getControl(picklistTwoName);
	var picklistTwoAttribute = picklistTwo.getAttribute();
		
   	var picklistOneSelectedOption = picklistOneAttribute.getSelectedOption();
	
	var picklistOneSelectedText = "";	
	if (picklistOneSelectedOption != null)
	{
		picklistOneSelectedText = picklistOneSelectedOption.text;
	}

	//This "if" statement stores the original values from the dynamic picklist.
	//Very important if the user hasn't made a selection on the first picklist or if the selection changes
    if (picklistTwo.flag == true) 
	{
		picklistTwo.clearOptions();
		var origOptions = picklistTwo.originalPicklistValues;
		
		for (var i = origOptions.length - 1; i >= 0; i--) 
		{ 
			if(origOptions[i].text != "")
			{
				picklistTwo.addOption(origOptions[i]);
			}
		}		
    }
    else 
	{		
        picklistTwo.originalPicklistValues = picklistTwoAttribute.getOptions();
        picklistTwo.flag = true; 
    }

	if (picklistOneSelectedText != null && picklistOneSelectedText != "") 
    {		
		var picklistTwoOptions = picklistTwoAttribute.getOptions();
        for (var i = picklistTwoOptions.length - 1; i >= 0; i--) {  
			
            if (picklistTwoOptions[i].value != null && picklistTwoOptions[i].value != "") {
				var optionText = picklistTwoOptions[i].text;
				var optionValue = picklistTwoOptions[i].value;
				
				//BEGIN: If the picklist is set to HMO
                if(picklistOneSelectedText == "HMO")
				{							
					//Remove these values
					if (optionText == "PPO 500" || optionText == "PPO 750" || optionText == "POS Silver" || optionText == "POS Gold")
					{
						picklistTwo.removeOption(optionValue);
					}

				}
				//END: HMO Selection
				
				//BEGIN: If the picklist is set to PPO
				if(picklistOneSelectedText == "PPO")
				{
					//Remove these values
					if (optionText == "HMO 5K" || optionText == "HMO 7K" || optionText == "POS Silver" || optionText == "POS Gold")
					{
						picklistTwo.removeOption(optionValue);
					}

				}			
				//END: PPO Selection
				
				//BEGIN: If the picklist is set to POS
				if(picklistOneSelectedText == "POS")
				{
					//Remove these values
					if (optionText == "HMO 5K" || optionText == "HMO 7K" || optionText == "PPO 500" || optionText == "PPO 750")
					{
						picklistTwo.removeOption(optionValue);
					}

				}		
				//END: POS Selection
            }
        }
    }
	
}


  • Once the code sample is ready, save it to a file on your computer.
  • We need to create a new Web Resource for the code. Go into the Settings section-> Customizations. If you are familiar with Solutions and wish to use a Solution other than the default Solution, feel free to open that solution. Otherwise, click on “Customize the System” to open the Default Solution.
  • You will get a popup window listing all of the components in your Solution. Click on the “Web Resources” section to list the existing Web Resources. Press the New button to create a new Web Resource.
  • You will see a popup window; give your new Web Resource a name like DynamicPicklistDemo (no spaces). For Display Name, you can call it Dynamic Picklist Demo. Under Type, select “Script (JScript)”. Click the Browse button and open the code file you saved earlier.

DynamicPicklist2

  • Click the “Save and Close” button in the Ribbon to save your new Web Resource.
  • Back on the Solution window, expand the Entities section on the left hand side, expand Opportunity, and choose Forms. Double click the Form named Information to modify it.
  • On the form design, double click the picklist that filters the dynamic picklist. On the field popup window, select the Events tab. Then expand the “Form Libraries” section. Click the Add button and choose the Web Resource you created.
  • Below, in the Event Handlers section click Add and when the Handler Properties form pops up, enter PicklistOneOnchange in the Function field and press Ok to Save.

DynamicPicklist3

  • Press Ok to save the Field Settings, at the top of the form design click “Form Properties”. Repeat the step above to insert the Web Resource. Press Ok to close the Form Properties window.
  • Press “Save and Close” to save the form changes. On the Solution window, press the “Publish All Customizations” button in the top left to publish our changes.

Now let’s see this code in action! First go ahead and open the opportunity and you’ll see that ALL of the Health Insurance Plan picklist options appear. The provided code samples are a simple example to accomplish this, feel free to tailor it to your own needs.

DynamicPicklist4

Now if you select PPO for the plan type, the insurance plan picklist values update automatically!

DynamicPicklist5

The provided code samples are just one example of how to accomplish this, but hopefully you can use this example to update the code to meet your own needs! 

Integrate Microsoft CRM with LinkedIn!

Posted by Mike Snyder on June 15, 2011 in   |  Microsoft Dynamics CRM 2011  |  commentsComments (6)

We just recently put the finishing touches on a pretty excellent integration between Microsoft CRM and LinkedIn! Of course you know that LinkedIn has a huge business network, and lots of businesses use LinkedIn to find and develop new relationships at customer and prospect companies. Prior to this integration, you would have to do a lot of re-typing and ALT+TAB of windows to try and work with CRM and LinkedIn at the same time. However since LinkedIn offers a programming API, we decided to mash up their database with Microsoft CRM to really save ourselves our time!

From a high level, here are the key integration points:

  • Link Microsoft CRM accounts to LinkedIn companies
  • Link Microsoft CRM contacts to LinkedIn people
  • Import your LinkedIn connections into Microsoft CRM

This YouTube video shows the integration in action!


We have not officially released this integration to the world yet, as we’re still testing and evaluating it. If you’re interested in getting the Microsoft CRM - LinkedIn integration for your company, please contact us as we’re looking for a few external beta customers to help us with the testing.

UPDATE NOVEMBER 2012: LinkedIn has released their own official integration called "LinkedIn for Microsoft Dynamics CRM". Their integration works a little differently than the proof-of-concept shown in this blog post, but we would recommend you contact LinkedIn directly if are looking for this type of solution. You can learn more about it on the LinkedIn website.

Test CRM Queries with LINQPad

Posted by Jim Steger on June 9, 2011  |  commentsComments (1)

Our development team has really enjoyed using the tool LINQPad with their CRM 2011 development. The tool allows you to easily test CRM service calls, especially queries (as opposed to registering a plugin, creating a console app, etc and finding out your query is incorrect).

LINQPad is a free tool, although you will need to pay a nominal fee to get auto-completion (including the snippet option we demonstrate in this blog post). Disclaimer: After using the free version for some time, we ended up purchasing the Premium licenses for our development staff.

My colleagues, Matt Dearing and Corey O'Brien, have helped me come up with some simple steps to use LINQPad Premium edition for testing fetch-based queries quickly and easily. The code snippet we show below sets the appropriate CRM references and import statements, and then provides a couple of code examples to quickly allow you to query a Dynamics CRM instance.

You'll see us use the CrmConnection object to provide the connection to CRM. Learn more about this object from the Microsoft CRM SDK.

Using LINQPad with Dynamics CRM

  • Download LINQPad.
  • Create a Libraries folder for LINQPad in the same directory as the LINQPad.exe
  • Add the Microsoft.Crm.Sdk.Proxy.dll, Microsoft.Xrm.Sdk.dll, and the Microsoft.Xrm.Client.dll assemblies to the newly created Libraries folder.
  • Create a file called crm2011.snippet in your\My Documents\LINQPad Snippets folder (you may need to create the folder)
  • Copy the following code:

    <?xml version="1.0" encoding="utf-8"?>

    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">

      <CodeSnippet Format="1.0.0">

        <Header>

          <Title>CRM 2011 - Assembly, Namespace, CreateOrgService</Title>

          <Description>CRM 2011 - Provides appropriate assembly and namespace references, as well creates a org service helper method.</Description>

          <Shortcut>crm2011</Shortcut>

          <SnippetTypes><SnippetType>Expansion</SnippetType></SnippetTypes>

        </Header>

        <Snippet>

          <References>

            <Reference><Assembly>%WinDir%\Microsoft.NET\Framework\v4.0.30319\System.Runtime.Serialization.dll</Assembly></Reference>

            <Reference><Assembly>%WinDir%\Microsoft.NET\Framework\v4.0.30319\System.ServiceModel.dll</Assembly></Reference>

            <Reference><Assembly>%WinDir%\Microsoft.NET\Framework\v4.0.30319\System.Configuration.dll</Assembly></Reference>

            <Reference><Assembly>Libraries\microsoft.xrm.sdk.dll</Assembly></Reference>

            <Reference><Assembly>Libraries\microsoft.xrm.client.dll</Assembly></Reference>

            <Reference><Assembly>Libraries\microsoft.crm.sdk.proxy.dll</Assembly></Reference>

          </References>

          <Imports>

            <Import><Namespace>Microsoft.Xrm.Sdk</Namespace></Import>

            <Import><Namespace>Microsoft.Xrm.Sdk.Client</Namespace></Import>

            <Import><Namespace>System.ServiceModel.Description</Namespace></Import>

            <Import><Namespace>Microsoft.Crm.Sdk.Messages</Namespace></Import>

            <Import><Namespace>Microsoft.Xrm.Client</Namespace></Import>

          </Imports>

          <Code Language="csharp">

            <![CDATA[private IOrganizationService CreateOrgService(string connectionString)

    {

           CrmConnection connection = CrmConnection.Parse(connectionString);

     

           return new OrganizationServiceProxy(

                                   connection.ServiceUri,

                                   connection.HomeRealmUri,

                                   connection.ClientCredentials,

                                   connection.DeviceCredentials);

    }]]>

             </Code>

        </Snippet>

      </CodeSnippet>

     

      <CodeSnippet Format="1.0.0">

        <Header>

          <Title>CRM 2011 - Simple Fetch Query Example</Title>

          <Description>CRM 2011 Fetch Example - Provides code example for a simple fetch example.</Description>

          <Shortcut>fetchExample</Shortcut>

          <SnippetTypes>

            <SnippetType>Expansion</SnippetType>

          </SnippetTypes>

        </Header>

        <Snippet>

          <Code Language="csharp">

            <![CDATA[string connectionString = "Url=http://crm/orgname/XRMServices/2011/Organization.svc;";

           var orgService = CreateOrgService(connectionString);

           if (orgService != null)

           {

                  var fetchResult = (ExecuteFetchResponse)orgService.Execute(new ExecuteFetchRequest()

                  {

                         FetchXml = @"<fetch mapping='logical' aggregate='true'>

                         <entity name='lead'>

                         <attribute name='lastname' aggregate='count' alias='NumLeads'/>

                         </entity>

                         </fetch>"

                  });

           Console.WriteLine(fetchResult);

      }

                 

    ]]>

          </Code>

        </Snippet>

      </CodeSnippet>

    </CodeSnippets>

  • Run LINQpad.exe
  • Change Language to C# Program
  • Execute the crm2011 snippet (type crm2011 and hit <tab>) after the Main method.
  • In the main method create an service reference and execute your request. For instance, use the second code snippet by typing fetchExample and hit <tab> which will produce a basic query against the Lead entity.

    image

Change the http://crm/orgname value to match your environment and hit F5 to execute your query. LINQPad will return the results of the query as shown:

image

 

Some additional tips for LINQPad and CRM query development:

  • If you don't have the premium version, you can easily add the reference assemblies and import statements manually. Simply hit F4 to bring up the Query Properties window.

    image

  • Using the Query Properties window (F4), click the Set as default for new queries to keep these assembly references and namespaces as defaults for all LINQPad queries.
  • You can also save a LINQPad file with the CreateOrgService method if you like, instead of using the snippet.
  • Save common used queries and reuse them as needed.
  • Set program defaults by clicking Edit > Preferences. For instance, you can set the default query to be C# Program.

image

  • Please reference the LINQPad site for more information about the program and licensing.

For Every Deactivation There is an Equal and Opposite Reactivation

Posted by Corey O'Brien on June 2, 2011 in   |  Microsoft Dynamics CRM 2011,   |  Microsoft Dynamics CRM Online  |  commentsComments (4)

Adding Activate Buttons to Microsoft CRM Activity Ribbons

One common customization request we receive for Microsoft CRM is to allow users to reactivate completed activities.  Typically this is because a user wants to make a simple update to the record, like correcting a typo.

There are two common ways we can achieve this in Microsoft CRM:

  • Executing a manual workflow
  • Adding a custom button to the ribbon

A manual workflow is easy to set up, but because the workflow runs asynchronously, it isn’t the best user experience.  In this post, I’ll demonstrate the second method - adding a custom ribbon button to reactivate activities.

Part 1: Prepare a Solution

The first step is packaging the activities you are targeting into a custom solution.  To do this, open up Microsoft CRM and navigate to the Settings > Customizations > Solutions page.  Now, create a new solution.  You will be adding a JavaScript library to this solution, so you will want to set up a new publisher to represent your company if you do not already have one.  Specify an appropriate Display Name and Version
 New Solution Form

Click Save in the solution toolbar and then select the Entities node from the solution components tree on the left. Now click the Add Existing button in the toolbar above the grid, and select each custom activity that you want to add an Activate button to.
Solution Referencing Entities

Next we’ll add a JavaScript library. Select Web Resources in the solution component tree and then click New from the toolbar above the grid.  Enter Scripts/RibbonSample/activateRecord.js for the Name and activateRecord.js for the Display Name.  Select Script (JScript) from the Type picklist and then click the Text Editor button.

Paste in the following script:

 

if (typeof (Sonoma) == "undefined") { Sonoma = {}; }

 

 

Sonoma.activateRecord = function (id, logicalName) {

    var orgServiceUrl = Xrm.Page.context.getServerUrl() + "/XRMServices/2011/Organization.svc/web";

    var request =

        '<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">' +

            '<s:Body>' +

                '<Execute ' +

                '  xmlns="http://schemas.microsoft.com/xrm/2011/Contracts/Services" ' +

                '  xmlns:i="http://www.w3.org/2001/XMLSchema-instance">' +

                    '<request i:type="b:SetStateRequest" ' +

                    '  xmlns:a="http://schemas.microsoft.com/xrm/2011/Contracts" ' +

                    '  xmlns:b="http://schemas.microsoft.com/crm/2011/Contracts">' +

                        '<a:Parameters ' +

                        '  xmlns:c="http://schemas.datacontract.org/2004/' +

                            '07/System.Collections.Generic">' +

                            '<a:KeyValuePairOfstringanyType>' +

                                '<c:key>EntityMoniker</c:key>' +

                                '<c:value i:type="a:EntityReference">' +

                                    '<a:Id>' + id + '</a:Id>' +

                                    '<a:LogicalName>' +

                                        logicalName +

                                    '</a:LogicalName>' +

                                    '<a:Name i:nil="true" />' +

                                '</c:value>' +

                            '</a:KeyValuePairOfstringanyType>' +

                            '<a:KeyValuePairOfstringanyType>' +

                                '<c:key>State</c:key>' +

                                '<c:value i:type="a:OptionSetValue">' +

                                    '<a:Value>0</a:Value>' +

                                '</c:value>' +

                            '</a:KeyValuePairOfstringanyType>' +

                            '<a:KeyValuePairOfstringanyType>' +

                                '<c:key>Status</c:key>' +

                                '<c:value i:type="a:OptionSetValue">' +

                                    '<a:Value>-1</a:Value>' +

                                '</c:value>' +

                            '</a:KeyValuePairOfstringanyType>' +

                        '</a:Parameters>' +

                        '<a:RequestId i:nil="true" />' +

                        '<a:RequestName>SetState</a:RequestName>' +

                    '</request>' +

                '</Execute>' +

            '</s:Body>' +

        '</s:Envelope>';

 

    var req = new XMLHttpRequest();

    req.open("POST", orgServiceUrl, true);

    req.setRequestHeader("Accept", "application/xml, text/xml, */*");

    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");

    req.setRequestHeader("SOAPAction",

        "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");

    req.onreadystatechange = function () {

        if (req.readyState === 4) {

            location.reload(true);

        }

    };

    req.send(request);

};

 

This script defines a single method that takes in an entity id and type name.  It then makes a call to CRM’s Organization service to activate the record passed in via the parameters.  When the service call completes, it reloads the entity form.

Warning: The script is technically unsupported because it accesses the location.reload method on the HTML DOM.  However, since there is currenlty not a supported way to refresh the current form, this will be your best bet to provide a good user experience.

Click OK to close the text editor, then Save and Close to create the new web resource.

Export the solution by clicking the Export Solution button at the top of the solution window.  This will be an unmanaged solution and we don’t need to include any of the system settings, so leave all of the default options selected as you navigate through the wizard.  When prompted, save the solution zip file to a place you will be able to find it on your local computer.

 

Part 2: Modifying the Solution

Now comes the fun part, we need to open up the exported solution and modify the ribbon definition for each activity we included.  Start by extracting all files from the solution zip file into a new subfolder.  You should see three files and a WebResources folder extracted.

Open customizations.xml in your favorite XML or text editor.  You should see a section similar to the following in each of the entities you included in the solution:

<RibbonDiffXml> 

  <CustomActions /> 

  <Templates> 

    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>

  </Templates>

  <CommandDefinitions />

  <RuleDefinitions>

    <TabDisplayRules />

    <DisplayRules />

    <EnableRules />

  </RuleDefinitions>

  <LocLabels />

</RibbonDiffXml>

 

 

Replace the <CommandDefinitions /> element with the highlighted text below:

<RibbonDiffXml>

  <CustomActions />

  <Templates>

    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>

  </Templates>

  <CommandDefinitions>

    <CommandDefinition Id="Mscrm.Form.Activate">

      <EnableRules>

        <EnableRule Id="Mscrm.CanWritePrimary" />

      </EnableRules>

      <DisplayRules>

        <DisplayRule Id="Mscrm.CanWritePrimary" />

        <DisplayRule Id="Mscrm.PrimaryIsInactive" />

        <DisplayRule Id="Mscrm.PrimaryEntityHasStatecode" />

      </DisplayRules>

      <Actions>

        <JavaScriptFunction FunctionName="Sonoma.activateRecord"

          Library="$webresource:sonoma_Scripts/RibbonSample/activateRecord.js">

          <CrmParameter Value="FirstPrimaryItemId" />

          <CrmParameter Value="PrimaryEntityTypeName" />

        </JavaScriptFunction>

      </Actions>

    </CommandDefinition>

  </CommandDefinitions>

  <RuleDefinitions>

    <TabDisplayRules />

    <DisplayRules />

    <EnableRules />

  </RuleDefinitions>

  <LocLabels />

</RibbonDiffXml>

 

Note:  You will need to change the sonoma_ prefix (as highlighted above in green).  This prefix is defined in the publisher you associated with the solution.

Now you might be wondering why we didn’t need to define a button, icons, labels, tooltips, tab location, etc.  As it turns out, the activity forms all have this button defined on them natively.  They just have a DisplayRule in place to hide them.  With this Ribbon change, we’re simply redefining the CommandDefinition to call our custom script and leveraging the existing button definition.

Tip: If you ever need to see an entity’s native ribbon definition, you can check out the Export Ribbon Definitions topic in the CRM SDK.

Part 3: Putting Humpty Dumpty Back Together Again (or Reimporting the Solution)

Now to see these new buttons you’ll need just need to zip up the your exported files (or you can drag the only modified file – customizations.xml – back into your existing solution zip file) and import them back into CRM.  To perform the import, navigate back to Settings > Customizations > Solutions within CRM and click the Import button from the toolbar above the grid.  Browse to pick your new zip file, and then continue through the rest of the wizard.  After the import completes, you can click Publish All Customizations to apply your new change, or if you have other pending changes, you can manually navigate to the activity entities and publish them individually.

Success!

Now if you open a Closed activity you modified, you should see the Activate button in the ribbon:

Updated Ribbon

Microsoft CRM 2011 Update Rollup 2 Released

Posted by Mike Snyder on June 2, 2011 in   |  Microsoft Dynamics CRM 2011  |  commentsComments (1)

Right on schedule, Microsoft just released Update Rollup 2 for Microsoft Dynamics CRM 2011. The first update rollup was released on April 4th so it’s great to see consistent software updates from Microsoft. All of the update rollups are cumulative so each rollup contains ALL of the updates from the prior rollups as well.

Here’s a list of the new fixes included in Update Rollup 2 (also outlined in the KB article):

  • Assume that you perform a POC migration on a Microsoft Dynamics CRM 2011 organization. A multiple auditing error occurs when one of the following scenarios is true:
    • You create a new record for an entity when the auditing setting is enabled.
    • You change an existing record for an entity when the auditing setting is enabled.
    • You disable the auditing setting.
  • Assume that you browse to the Accounts page. And then, you click Accounts on the navigation bar. In this situation, an increase in memory usage occurs.
  • If you create a workflow that has a wait condition, the workflow is delayed incorrectly in Microsoft Dynamics CRM 2011.
  • When you upgrade Microsoft Dynamics CRM 4.0 to Microsoft Dynamics CRM 2011 by using a non-English base language, you receive the following error message: 'XPKLocalizedLabel'. Cannot insert duplicate key in object 'MetadataSchema.LocalizedLabel'.
  • If you open the Resource Group Creation page by using Internet Explorer 9 in Microsoft Dynamics CRM 2011, you cannot close the page as expected.
  • Assume that you have many custom entities that have relationships to activities in a Microsoft Dynamics CRM 2011 deployment. When you set a regarding on an activity form, you receive the following error message: Page Not Found.
  • When you install or delete the sample data in Microsoft Dynamics CRM 2011, an unhandled exception error occurs.
  • Assume that you install Update Rollup 1 for Microsoft Dynamics CRM 2011. If the update fails, the version information in the registry is updated incorrectly.
  • When you use Microsoft Dynamics CRM 2011 for Japanese language, the dynamics marketplace is not localized to Japanese language.
  • No throttling mechanism exists for send requests that are sent from Microsoft Dynamics CRM 2011 clients for Microsoft Office Outlook in Microsoft Dynamics CRM 2011. Therefore, too many background send requests can hit the server at the same time. In this situation, you experience a reduced server performance.
  • Consider the following scenario in Microsoft Dynamics CRM 2011:
    • You create a new email message template that has an unsubscribe link.
    • You create a new email message in Microsoft Office Outlook.
    • You insert the template in the email message.
    • You send the email message.
    • You click the unsubscribe link in the email message.

    In this scenario, the To field and the Subject field are populated incorrectly.

  • Assume that you customize the Access Mode attribute for the SystemUser to have a default value of Read or Administrative. When you add a user by using the user invitation wizard, the wizard fails with an exception error.
  • Assume that you enable the Verbose tracing in an organization in Microsoft Dynamics CRM 2011. When you run the UpdateContractStates job, the async service fails with an exception error.
  • Assume that you create a sync task that reports to you when a job is finished in Microsoft Dynamics CRM 2011. When the job is finished, you receive an email message that contains an incorrect URL. However, the URL should link to your organization.
  • Assume that you have multiple organizations in Microsoft Dynamics CRM 2011. Each organization has different custom entities. In this situation, if each organization has the same object type codes, an error occurs with the parameter filtering.
  • Assume that you have multiple entities that have identical display names in Microsoft Dynamics CRM 2011. The duplicate detection is enabled. In this situation, you cannot open the duplicate detection rule form.
  • Assume that you have an entity that has duplicate detection rules published in Microsoft Dynamics CRM 2011. When you save a record in the entity, you receive some unhandled exception error messages.
  • After you install Update Rollup 1 for Microsoft Dynamics CRM 2011, "Update for Microsoft Dynamics CRM 2011" instead of "Update Rollup 1 for Microsoft Dynamics CRM 2011" is displayed in the Add Or Remove Programs list.
  • After you install a Microsoft Dynamics CRM 2011 client for Finish language, "Microsoft Dynamics CRM 5.0 for Microsoft Office Outlook" instead of "Microsoft Dynamics CRM 2011 for Microsoft Office Outlook" is displayed in the Add Or Remove Programs list.
  • The French translation for the form preview is incorrect in Microsoft Dynamics CRM 2011 for French language.
  • There is no batch load mechanism for loading ribbon caches in the caching infrastructure in Microsoft Dynamics CRM 2011.
  • The client API cannot access subgrids in Microsoft Dynamics CRM 2011.
  • The French translation for the Referential, Restrict Delete type in the Behavior option in the "1:N Relationship" form is incorrect in Microsoft Dynamics CRM 2011 for French language. The type is translated as "delete restriction" instead of "restrict deletion".
  • Assume that you have some roles that support multiple record types in Microsoft Dynamics CRM 2011. When you create a connection that uses the roles, you receive the following error message: Record types are not defined for use with the selected connection roles.
  • After you upgrade to Microsoft Dynamics CRM 2011, some old Microsoft Dynamics CRM 4.0 files are not deleted as expected.
  • When you add users in a multiple site domain in Microsoft Dynamics CRM 2011, the save process takes longer time than expected.
  • When you upgrade or import a database that contains a hyphen in Microsoft Dynamics CRM 2011, the upgrade or import fails.
  • Assume that you have a subgrid that has an autoexpand control set in Microsoft Dynamics CRM 2011. Another autoexpand control is set for the subgrid side-by-side. In this situation, the size of the container of the subgrid does not respect the size that is specified in the form editor. A white space is displayed under the data in the subgrid container unexpectedly.
  • Assume that you create a record that is a duplicate of another record without accent symbols in Microsoft Dynamics CRM 2011. In this situation, the duplicate record is detected. However, the duplicate record is not displayed.
  • After you uninstall Update Rollup 1 for Microsoft Dynamics CRM 2011, the version number of the product is incorrect.
  • Assume that you install Update Rollup 1 for Microsoft Dynamics CRM 2011. And then, you start the uninstall process for Update Rollup 1 for Microsoft Dynamics CRM 2011. When you cancel the uninstall process, an empty dialog box appears unexpectedly.
  • Assume that you import and update an organization from Microsoft Dynamics CRM 4.0 to Microsoft Dynamics CRM 2011. If the length of a system attribute exceeds a value of 100, the import fails.
  • When you publish a rule in the Duplicate Detection Rules dialog box in Microsoft Dynamics CRM 2011 for Japanese language, the Status Reason field is displayed incorrectly.
  • The Severitycode field and the Prioritycode field are translated to the same Japanese words in Microsoft Dynamics CRM 2011 for Japanese language.
  • When you delete the sample data in Microsoft Dynamics CRM 2011, an unhandled exception error occurs.
  • Assume that you create a new mail merge template in Microsoft Dynamics CRM 2011 by using Internet Explorer 9. You reopen the mail merge template. In this situation, when you save the mail merge template, you receive an error message that states the name field needs a value.
  • If the Data field in a bulk delete async operation is null, the async service crashes.

Contact Us for a Quote, or Personalized Demonstrationof Microsoft Dynamics CRM for Your Business.

Contact Us