Working with SharePointDocumentLocation in CRM 2011.


We had a requirement to associate a SharePointDocumentLocation with a case record when it is created. We wanted to use our own folder structure for it. Something similar to this

Sharepointdocumentlibraryurl/[CustomerName]/[CaseNumber]

i.e. folder name with Customer Name and a subfolder with the name of Case Number.

Normally SharePoint document location is created when we click on Documents on the left navigation pane for the record. It doesn’t get created or auto associated to a SharePoint folder on create of record.

So the solution was to write a plugin in on create event and then create a folder in SharePoint and then associate it with the created record.

The source code for implementing it (just posting the source code i hope it is self explanatory 🙂 )


// following logic within the Post Create plugin of Case (incident)
	 if (this.Context.MessageName.ToUpper() == "CREATE" && Context.InputParameters.Contains("Target")
                && Context.InputParameters["Target"] is Entity)
            {
                Entity targetIncident = (Entity)Context.InputParameters["Target"];

                //// Create doc folder for case
                Guid incidentId = Context.PrimaryEntityId;
                string ticketNumber = targetIncident["ticketnumber"].ToString();
                Guid customerId = ((EntityReference)targetIncident["customerid"]).Id;

                Contact contact = // code to get the contact's fullname

                SharePointHelper sharepoint = new SharePointHelper();
                sharepoint.CreateFolderForCase(organizationService, contact.FullName, ticketNumber, incidentId);
            }

// Helper functions used

	    public string CreateFolderForCase(OrganizationService coreCrmService, string contacFolderName, string caseFolderName, Guid incidentId)
        {
            string docLibraryUrl = "http://SharePointSiteCollection/incident";
            string applicantFolderUrl = docLibraryUrl + "/" + applicantFolderName;
            string caseUrl = applicantFolderUrl + "/" + caseFolderName;

            //// Create folder and subfolder inside SharePoint site
            this.CreateFolderStructure(applicantFolderUrl, caseUrl);

            //// create and associate the url of the folder to SharePointDocumentLocation and the incident record.
            this.CreateAndAssociateSharePointDocumentLocation(coreCrmService, incidentId, caseFolderName, caseUrl);
            return caseUrl;
        }

		private bool CreateFolderStructure(string applicantFolderUrl, string caseFolderUrl)
        {
            if (this.CreateFolder(applicantFolderUrl))
            {
                return this.CreateFolder(caseFolderUrl);
            }

            return false;
        }

		private bool CreateFolder(string folderUrl)
        {
            try
            {
                WebRequest request = WebRequest.Create(folderUrl);
                request.Credentials = this.credentials;
                request.Method = "MKCOL";
                WebResponse response = request.GetResponse();
                response.Close();
            }
            catch(Exception ex)
            {
                TraceHelper.TraceEvent(ex, "CreateFolder", folderUrl, TraceHelper.AMSApplication.AMSService);
            }
            return true;
        }

		public static bool CreateAndAssociateSharePointDocumentLocation(OrganizationService coreCrmService, Guid incidentId, string caseNumber, string sharePointDocumentUrl)
        {
            SharePointDocumentLocation sharePointDocumentLocation = new SharePointDocumentLocation();
            sharePointDocumentLocation.Name = "SharePoint Document Location for " + caseNumber;
            sharePointDocumentLocation.Description = "SharePoint Document Location created for storing documents related to case";
            sharePointDocumentLocation.AbsoluteURL = sharePointDocumentUrl;
            sharePointDocumentLocation.RegardingObjectId = new EntityReference("incident", incidentId);
			coreCrmService.Create(sharePointDocumentLocation);
            return true;
        }

Please refer these wonderful posts that were extremely helpful.

http://charlesemes.blogspot.com/2011/02/create-sharepoint-document-locations-in.html

http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html

Ribbon Editor for CRM 2011


Hi,

I was just reading some of the blogs that i have subscribed to in my rss reader and came to know that ribbon editor tool for CRM 2011 has been released.

http://mscrmtools.blogspot.com/2011/07/new-tool-alpha-ribbon-editor.html

 

http://erikpool.blogspot.com/2011/10/new-crm-2011-ribbon-editing-tool.html

 

I think ribbon customization is one of the most complex task in CRM 2011.  Thanks you guys for helping us by building the tool.

Bye..

Adding a button to Document Locations Tab in CRM 2011


After we have configured SharePoint List Component for CRM 2011, and enabled it for the entities, we will have a “documents” link on the left navigation pane of the record. The ribbon will have two buttons Add Location and Edit Location over there.

If we need to add our own button over there, we need to make changes to the “Application Ribbons” in our solution file.

The final output

And the RibbonDiffXML for that

<RibbonDiffXml>
<CustomActions>
<CustomAction Id="AMS_DocumentButton" Location="Mscrm.DocumentsTab.Locations.Controls._children" Sequence="30">
<CommandUIDefinition>
<Button
Id="B_MyFirstButton"
Command="Cmd_JavaScript"
LabelText="My First Button"
ToolTipTitle="My First Button Tool Tip Title"
ToolTipDescription="My First Button Tool Tip Description"
TemplateAlias="o1"
Image16by16="/_imgs/ribbon/saveandclose16.png"
Image32by32="/_imgs/ribbon/saveandclose32.png"/>
</CommandUIDefinition>
</CustomAction>
</CustomActions>
<Templates>
<RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
</Templates>
<CommandDefinitions>
<CommandDefinition Id="Cmd_JavaScript">
<EnableRules/>
<DisplayRules/>
<Actions>
<JavaScriptFunction
Library="$webresource:new_test"
FunctionName="testDoc">
</JavaScriptFunction>
</Actions>
</CommandDefinition>
</CommandDefinitions>
<RuleDefinitions>
<TabDisplayRules />
<DisplayRules />
<EnableRules />
</RuleDefinitions>
<LocLabels />
</RibbonDiffXml>

Hope it helps.

value cannot be null. parameter name value error in CRM 2011


I was getting the above error while trying to create a SharePointDocumentLocation programmatically. However I was able to create an incident record without any issue.

As it turned out, this is what I was missing


OrganizationServiceProxy orgService = new


OrganizationServiceProxy(organizationUri, homeRealmUri, credentials, null);


orgService.EnableProxyTypes();

Hope it helps!

Charts in CRM 2011


Only a few days back I realized that it is so easy to convert our 2-d charts to 3-d in CRM 2011.

Steps are as following:-

Open the chart we want to convert to 3-d.

Suppose this is our chart

Select the Export Chart button from the Ribbon

In the exported xml for the chart add the following line (Area3DStyle), before the closing tag of ChartArea.

</AxisX>

<Area3DStyle Enable3D=”True” />

</ChartArea>

</ChartAreas>

Using Import Chart option import it back, this is how now it is gonna look like

One more thing we  can also add filter criteria to the fetch used in Chart’s xml.

Do check out these wonderful posts

http://niiranen.eu/crm/2010/10/turn-the-flat-dynamics-crm-2011-charts-into-3d/

http://blogs.msdn.com/b/crm/archive/2011/01/04/crm-2011-charts-know-the-real-potential-part-i.aspx

http://blogs.msdn.com/b/crm/archive/2011/05/02/crm-2011-charts-know-the-real-potential-part-deux.aspx

http://gtcrm.wordpress.com/2011/03/22/quick-reference-for-common-crm-2011-chart-customisations/

Hope it helps.

Send mail to a custom entity in CRM 2011


In CRM 4, to send a mail to a custom entity we used to create a new email attribute for that entity and then had to write a custom workflow activity or plugin for sending mail or some complex logic.

http://social.microsoft.com/Forums/en/crmdevelopment/thread/634aa49d-d8fc-4a8c-b3af-6c00b72f8df9

http://blogs.inetium.com/blogs/azimmer/archive/2009/08/08/crm-4-0-using-unresolved-email-addresses.aspx

Good news is that in CRM 2011 we have a new feature to Send e-mail for custom entities.

http://www.avanadeblog.com/xrm/2010/11/crm-2011-feature-of-the-week-11222010-new-entity-creation-flexibility.html

Just need to enable that option in Entity Customization form. It will create a new email field for that entity or will use an existing email field if it is already there.

Bye.