Using Multi-tenancy in Microsoft Dynamics CRM 2011 to Address Challenges in Enterprise Business Environments

The CRM Engineering for the Enterprise has released a new white paper.

 

You may download it here:

http://www.microsoft.com/en-us/download/details.aspx?id=36056

 

Overview

There are a number of complexities associated with implementing large-scale CRM projects in Enterprise business scenarios. In these situations, using multiple tenants in Microsoft Dynamics CRM 2011 can help to address several typical challenges, which include:

  • Functional localization, for organizations with different business units or areas that have varying business requirements or processes
  • Master data management, for organizations that need to distribute but maintain control of business data in certain ways
  • Physical distribution, for organizations with user base that is physically distributed in ways that introduce challenges such as distance of connections
  • Security and privacy, for organizations that need complex control of distribution or access to data
  • Scalability, for organizations with workload requirements that exceed or are prohibitively costly to host within a single system

Microsoft Dynamics CRM offers a variety of capabilities that allow customers to implement rich solutions to address complicated business requirements, which tend to have an even higher degree of complexity for customers in the Enterprise. For solutions that incorporate multiple instances of Microsoft Dynamics CRM 2011, a second major consideration is any potential need for integration or interaction between the different instances in the overall business solution.

This white paper discusses scenarios in which using multiple instances of Microsoft Dynamics CRM 2011 to separate areas of functionality can assist in addressing business challenges in the Enterprise. The paper also describes some common approaches for integrating multiple, separate instances of Microsoft Dynamics CRM 2011.

Extracting Localized Yes/No Values from Dynamics CRM

As I am working on an update of my SnapShot! documentation tool, I realized that most people understand the values of Yes and No better than True or False, so I modified the output so that I replaced the word True with Yes and False with No.

That works great and I think it actually makes the report much more readable.

But, what if Yes and No works fine for English-speaking countries, but what if English is not your language?  I considered that a problem that I could solve.

So, into the internals of Dynamics CRM I dive and I came up with what I think is a fairly elegant solution.

Unfortunately, there does not seem to be a single location where Yes and No values are stored.  BUT, there are fields that contain those values.

After looking at the database metadata, I decided to retrieve the optionset values from the Account field Credit On Hold.

I store those values and later use them to generate my documentation.

Here's how it works:

First, I created a class to hold the values so I can easily pass the data back and forth.

public class BooleanLabelSet
   {
       public string TrueLabel { get; set; }
       public string FalseLabel { get; set; }
   }

 

Next, I created a method to extract the Attribute information:

public BooleanLabelSet GetBooleanLabels(OrganizationService service)
{
    var request = new RetrieveAttributeRequest
    {
        EntityLogicalName = Account.EntityLogicalName,
        LogicalName = "creditonhold",
        RetrieveAsIfPublished = true
    };

    var response = (RetrieveAttributeResponse)service.Execute(request);

    var attribute = (BooleanAttributeMetadata)response.AttributeMetadata;

    var trueLabel = attribute.OptionSet.TrueOption.Label.UserLocalizedLabel.Label;
    var falseLabel = attribute.OptionSet.FalseOption.Label.UserLocalizedLabel.Label;

    return new BooleanLabelSet { TrueLabel = trueLabel, FalseLabel = falseLabel };
}

And you use it like this:

var BooleanLabels = GetBooleanLabels(OrganizationServiceMain);
var booleanValue = value ? BooleanLabels.TrueLabel : BooleanLabels.FalseLabel;

If you try this technique and run into issues, please let me know so I can correct the code.

Dynamics CRM Security is not always about Roles

Occasionally, I find myself wasting time because I didn't check all of my facts. I ran into an issue today where I was getting the strangest error trying to assign a Contact to a specific user.

I checked and rechecked their security role, restarted IIS, etc., but still this error persisted.

Here is the error, as documented by CRM Tracing:

Microsoft.Crm.CrmSecurityException:
Principal user (Id=a39a5555-3c77-e011-8720-00155da5304e, type=8)
is missing prvReadContact privilege
(Id=ba09ec92-12c4-4312-ba16-5715c2cbd6da)

This could not be more explicit.  The user doesn't have Read access to Contacts.

Except he does:

image

 

Hmm. This is very strange; and I know strange.  If you didn't know, I actually wrote a book on CRM Security, so you would think I would know what I'm doing. But this was baffling me.

Finally, it occurred to me that the only thing left is the user's client access license.

I opened the user record up and sure enough, this is what I found:

image

 

Problem solved.

Users with Administrator Access do not have access to normal CRM data so the message was indeed correct.

Keep License type in mind next time you run into what seems to be an incorrect security message.