Monday, October 02, 2006

Simple CRM and SharePoint integration example

During the Swedish SharePoint and Exchange Forum 2006 held just outside Stockholm on Rosenön this spring, I showed how to make a simple integration of MS CRM and MS SharePoint 2003.

Both technologies are very versatile and are easily integrated with other software, mainly due to the helpful webservices that are available.

The integration I created was to automatically create a workspace when a new account was created. The following steps describe how this was made possible:

1. Create a site in SharePoint that will contain all subsites.
2. Create a new attribute in CRM, nvarchar 255 that will contain the SharePoint site URL.
3. Create an IFrame in CRM. Modify the onload JavaScript in CRM to set the src of the IFrame to the SharePoint site URL (if it is not null).
4. Create a dll that creates the SharePoint site and return the new sites URL and can be called on by a CRM workflow.
5. Modify the workflow.config to add the functionality to the workflow manager.
6. Create the workflow triggered by Create on account that creates the site and return the URL. Set the new SharePoint-site-url attribute to the return value of the function.

This integration is good, and it is also possible to create a more enhanced handling by using the PreCreate Callout instead of using the workflow. However, the workflow-addon created can be constructed to be quite generic and can hence be used for other purposes as well, (for instance creating a SharePoint site for each Opportunity).

I will base the SharePoint-site-name on the accountname attribute which is not guaranteed to be unique. In this example I will not go through how to make a duplet checking program, which should also be created, if the sites should be based on accountname. The sitename could also be based on the account GUID which is guaranteed to be unique.

I will now go through each of the six points in more detail:
1 . Create a SharePoint site that will contain all subsites
Just use the standard SharePoint interface, choose create from the top menu and then select site, almost at the bottom of the list, no specific template is needed. Note the url to the newly created site.
2. Create a new attribute for the SharePoint site url
In CRM, choose settings, customizations, customize entitys, account, attributes, create. Create a new attribute called for instance "new_spsiteurl" as nvarchar and length 255 (255 should be enough for anybody :).
3. Create an IFrame in CRM
Now choose forms and views in CRM. Choose form. You should now see the editable version of the account form. Click "New Tab" in the right hand menu. Name the new tab "SP Site" or something appropriate. The tab should now be visible.

Select the "SP Site" tab and then choose "Create section" from the right hand menu. Call it something nice. Also select to not show the name of the section.

In the new section, select "Add field". Choose the newly created attribute, "new_spsiteurl". Check the checkbox for read-only. Click OK.

Now choose "Create IFrame" from the right hand menu. Create an IFrame in the section created above. Check the checkbox in formatting that makes it fill the form. Call the IFrame something like "IFRAME_spframe". Click ok to create.

Click the "Form Properties" in the right hand menu at the bottom. Edit the onLoad script. Put in the following script:

If (crmForm.all.new_spsiteurl.DataValue != null)
{
crmForm.all.IFRAME_spframe.src = crmForm.all.new_spsiteurl.DataValue;
}

Close the dialogs. Click save and close on all forms. When you are back to the main CRM-window, select account in the entities list and click "publish".

4. Create the workflow addon dll
Open Visual Studio 2003 (it will work with VS 2005 as well, however, if you want to do this with callouts, you will have to follow the instruction concerning callout development in VS 2005 that I have blogged about earlier, with reference to Arash blog).

Create a new basic C# project with a simple class-file. Name the project something like "WFAddons". Rename the cs-file something like "WFAddons", make sure that the code is coherent with the naming of the file to avoid any confusions.

Make sure you have a reference to the SharePoint-dll.

With all the code to create the SharePointsite, the file should look something like this:

using System;
using Microsoft.SharePoint;

namespace WFAddons
{
public class WFAddons
{

public string CreateWorkSpace(string accountname)
{
SPSite siteCollection = new SPSite("http://localhost/sites/konton");
SPWebCollection subSites = siteCollection.AllWebs;

SPWeb mySite = subSites.Add(accountname);
mySite.Title = accountname;
mySite.Name = accountname;
mySite.Update();
return mySite.Url;
}
}
}

In the row: SPSite siteCollection = new SPSite("http://localhost/sites/konton");
Modify the url to match the site created in step 1.

Now set the output directory to the CRM-assembly folder. This is usually found here:
c:\Program Files\Microsoft CRM\Server\bin\assembly\ but is dependant on the CRM-installation.

Compile the project.
5. Modify workflow.config
In the folder: c:\Program Files\Microsoft CRM\Server\bin\assembly\, open the file workflow.config and before the end tags
(
</methods>
</workflow.config>
)

add the following:

<method name="Create workspace"
assembly="WFAddons.dll"
typename="WFAddons.WFAddons"
methodname="CreateWorkSpace"
group="SharePoint functions">
<parameter name="accountname" datatype="string"/>
<result datatype="string"/>
</method>

Make sure the settings corresponds with how you have compiled the workflow-addon-dll. The parameters are describes here:
Assembly - this is the name of the file found in the assembly directory.
Typename - this is the namespace followed by a dot and then the classname.
Methodname - this is the name of the method when working with it in Workflow Manager.
Group - Methods in Workflow Manager are Grouped. This is the group name.
Parameter name - this is the name that will be displayed in workflow manager for the first parameter. If you want to add more parameters just add them bellow. The name of the parameter does not have to be the same as in the code. However, the datatype must correspond.
Result - this is the data type of the return value.

Also, on the top line, in the top tag, add the following: allowunsignedassemblies="true" to allow unsigned assemblies to be executed by the workflow engine.

Before saving this file, shut down the process called: Microsoft CRM Workflow Service. Then save and start the process again.
6. Create the workflow
Now, all you have to do is create the workflow that will run all this and tie everything together. Open the workflow manager, select account, and create a new workflow that will be triggered on create. In the editor, select "Insert Action" and choose "Call assembly" select the group name (the same set in workflow.config above), and the select the method name. In the new dialog window, double-click the parameter (the name set in workflow.config) and choose dynamic value and select the entity Account and choose the attribute accountname. In the main action dialog, a you can now see this mapping. Enter an action name, like "create workspace". Click "Save".

You should now see the main workflow editor window. Press "Insert Action" on the left hand menu and choose "Update entity". A new dialog is show. Make sure the entity is marked as "Account", select the field "new_spsiteurl", choose "=" and not "+=", and then click the button to the far right on the same row. A new dialog is shown, choose dynamic value and in the dropdown called entity you should be able to select "create workspace", the name of the action that created the site. Close all the windows with "OK", "OK", "Save". You should now see the list of all account workflows. Select your new workflow and hit activate.

Now everything should be working as long as the uses running it all has sufficient rights. Try it out by creating an account, closing it, waiting 5 seconds (to let the workflow finish) and then open the account again. Go to the workspacetab where you should now see the SharePoint site that you created.

If you have problems, check the workflow monitor to see if the workflow ran properly or if it has stalled.

Please let me know of any problems or errors in this description. You are free to use my code, and description as long as you give me credit for it and link to my blog.

Please note that this example was made to show how it can be done. Please use it as a suggestion on this type of integration.

Gustaf Westerlund
HumanData AB
Markörgatan 4
136 44 HANINGE
Sweden
http://www.humandata.se

Tel:

Mobil: 0730-843 505

E-post: gustaf@humandata.se

18 comments:

  1. Hi Thank you first.
    I tried but from the workflow monitor I found that the access denied!

    ReplyDelete
  2. Thanx!

    Make sure that the user you are logged into on the server has propper rights in CRM. It is not enough to have admin rights in the AD, you have to have a user with the administrator role in CRM aswell.

    ReplyDelete
  3. This is great stuff.... My question is how would you handle if an Account in CRM got merged with another Account, if information or documents where in both places in SharePoint and in CRM how would you mege the same Accounts in SharePoint?

    ReplyDelete
  4. I would either disable the functionality (perhaps use a doublett check) or create some funtionality based on callouts to merge the sharepoint libraries.

    ReplyDelete
  5. I have followed your instructions and recieve this error on opening a new account or an account that already exists:

    error: 'crmForm.all:new_spssiteurl.datavalue' is null

    SPS 3.0
    CRM 3.0

    kevin@rainetechnologies.com

    ReplyDelete
  6. What URL do we put in the IFrame that we create?

    kevin@rainetechnologies.com

    ReplyDelete
  7. Hi Kevin,
    Been on a vacation why my activity has been "low".

    Well, it really doesn't matter what URL you set it to, since that property will be overwritten by the javascript onLoad if everything works as it should.

    I usually put the some sharepointsite that shows a list of all customer sites, in case there is an error the user might be able to navigate there manually. That really depends on how the naming of the SharePoint sites.

    Hope it helps...

    Gustaf

    ReplyDelete
  8. Can this excellent solution be built on Sharepoint Services 3.0 alone, or does it require a full Sharepoint Server license?

    Stefan Simonsson
    Vaxjo

    ReplyDelete
  9. Thank you,
    It will work on WSS aswell. Please note that this was written for SPS 2003. I have recently written a posting on how to do this with MOSS/WSS3 and the problems faced. Especially when working from another server than the SharePoint server.

    Here is a link: http://gustafwesterlund.blogspot.com/2007/08/not-so-simple-sharepoint-and-crm_21.html

    ReplyDelete
  10. Hi Kevin,

    I followed your instructions but when I apply the workflow process from within CRM I get an error message. In the workflow monitor I find a log saying "Errorcode = 8004280b,Access is denied. (Exception from HRESULT: 0x80070005(E_ACCESSDENIED))". I get this error when working from a client as well as working directly on the server. I have administrator rights on the platform and should have sufficient rights for both crm and sharepoint. Any suggestions on how to solve this?

    SBS 2003 R2
    CRM 3.0
    SPS 2.0

    edwin@computron.nl

    ReplyDelete
  11. Hi Kevin,
    Sorry I havn't answered earlier.

    I think you should check to make sure the user running the CRM application pool/workflow service has the propper rights.

    Gustaf

    ReplyDelete
  12. This comment has been removed by the author.

    ReplyDelete
  13. Raúl:
    I think your mixing you apples and pears. To create a sharepoint site you have to use the SharePoint API since there are no webservices available. (as far as I have found and I have looked quite hard)

    To be able use it, the code has to be run on the SharePoint server, so if you are useing callout, workflow-dll:s CRM and SharePoint have to be on the same server.

    I have written a posting on how to create your own new webservice for SharePoint that enables you to create new SharePoint sites. It is called "Not so easy CRM and SharePoint integration".

    ReplyDelete
  14. Thanks.

    I have followed all the instructions of your post. But when the rule applied to the account, CRM shows me an error message.

    The MOSS and CRM are on the same server.

    I don't know why CRM shows me this messaje.

    Is there anything else to check?

    can you help me please?

    ReplyDelete
  15. Hi Raùl,
    I am sorry, I can't help you with this limited information.

    Please describe in more detail exactly what you are doing and what the error message is that you get.

    ReplyDelete
  16. Lorenzo - (TN) Italy09 June, 2008 22:06

    Hy, it's work. THe only problem is if I made a click on sharepoint link it open a new internet explorer windows.

    ReplyDelete
  17. hi there

    will this work for CRM 4.0?

    if not could you post the revisions for what i need to do. i found that the IFrame was asking for a URL field. doesnt to ask for one in CRM 3.0.

    thanks

    ReplyDelete
  18. Hi Ben,
    yes, it does.

    I'll see if I can get the time to do a posting on it based on CRM 4.0. I am a bit busy at the moment but I'll try to get some time.

    The basics are that you should use a plug-in instead of a callout to create the site. The javascript that set's the url of the IFrame should be more or less the same.

    Gustaf

    ReplyDelete