xRM – Designing Survey Applications in Dynamics CRM

I have seen many people talking about designing survey applications in Dynamics CRM. I have analysed different approaches to design survey application and their integration with Dynamics CRM 4.0 during my stay at OA Systems.
  CRM survey comparison

Using WSS/MOSS 2007

WSS 3.0/MOSS 2007 provides a very comprehensive tool for planning, designing. Executing and analysing surveys. Following feature are provided out of the box in WSS/MOSS:
• Planning/Designing Survey
• Branching Survey
• Various Question Types
• Comprehensive analysis tool
• Executing survey

MOSS survey 1

MOSS survey 2

MOSS survey 3

MOSS survey 4

MOSS survey 5

Pros 

  1. Out of the box tools for Designing, Distributing, Executing and Analysis
  2. WSS 3.0 is Free so no Licensing Cost
  3. No Development Cost as its out of the box

Cons

  1. Data will be saved outside CRM
  2. Unavailability in offline client

WSS/MOSS survey can be integrated with MSCRM using IFRAME. This is a loose integration and data will be saved and presented in WSS/MOSS and not in CRM.

 Using InfoPath
Survey can be designed in InfoPath/Windows Form Server. InfoPath forms can be transmitted and rendered in IE. InfoPath Forms can collect information and save the survey response. This is also not ideal solution as data is saved in InfoPath forms and a comprehensive analysis tool needs to be developed.

infopath survey

Pros 

  1. Surveys can be designed in InfoPath
  2. Can be distributed using Online or by sending emails

 Cons 

  1. InfoPath required for Email Surveys
  2. Analysis tool needs to be developed for Response analysis and reporting

Custom Solution in CRM (xRM)
Custom solution can be developed with enough development effort. In this solution, survey is planned/designed and analysed in MSCRM but executed using Custom web application. This custom web application will be integrated in CRM or rendered online to execute Survey and collect survey response.

This solution provides access to survey data using web client, outlook online and outlook offline.

crm survey

Pros

  1. Available web, online and offline clients
  2. Fully supported and upgradable
  3. Executed through Custom Web application
  4. Survey Data and Response will be saved in Dynamics CRM

 Cons 

  1. Considerable development effort is required
  2. License is required in order to expose CRM data to non users

OA Systems Ltd

OA Systems are a specialist supplier of Microsoft Dynamics CRM, Business Intelligence and Office Collaboration software and services including Microsoft Office Sharepoint Server.

Whether it’s Customer Relationship Management (CRM) or Business Intelligence (BI), a successful deployment goes beyond just the software and its implementation. It requires a complete business strategy involving a number of factors: processes, technology and professional services.

Please comment or send your suggestions/issues at ayaz.ahmad at hotmail dot com.

HTML Content Editor in CRM4

It is often required to format and validate HTML contents in CRM 4. Here is a quick way of integrating a JavaScript WYSIWYG Editor. You can find many open source as well as 3rd part JavaScript WYSIWYG Editors. The editor I have used in my post is from TinyMCE – Javascript WYSIWYG Editor.

TinyMCE is a platform independent web based JavaScript HTML WYSIWYG editor control released as Open Source under LGPL by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances. TinyMCE is very easy to integrate into other Content Management Systems

So here is a step by step process to integrate this editor to CRM4.

Step One:

Create an ASPX page with only one HTML TEXTAREA control and a Submit Button. TextArea control will hold the content editor and button will move the generated HTML to crmForm Controls.

<asp:TextBox ID=”Content” runat=”server” TextMode=”MultiLine”></asp:TextBox>

    <div>

        <asp:Button ID=”btnSubmit” runat=”server” Text=”Submit”

            onclick=”btnSubmit_Click” OnClientClick=”javascript:OnSubmit();” />

        </div>

    </form>

 And copy the script as provided below:

This Script can be found at http://tinymce.moxiecode.com/examples/full.php#

<script src=”<your installation path>/tiny_mce/tiny_mce.js”></script>

<script>

tinyMCE.init({

                // General options

                mode : “textareas”,

                theme : “advanced”,

                plugins : “safari,spellchecker,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,imagemanager,filemanager”,

 

                // Theme options

                theme_advanced_buttons1 : “save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect”,

                theme_advanced_buttons2 : “cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor”,

                theme_advanced_buttons3 : “tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen”,

                theme_advanced_buttons4 : “insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage”,

                theme_advanced_toolbar_location : “top”,

                theme_advanced_toolbar_align : “left”,

                theme_advanced_statusbar_location : “bottom”,

                theme_advanced_resizing : true,

 

                // Example content CSS (should be your site CSS)

                content_css : “css/example.css”,

 

                // Drop lists for link/image/media/template dialogs

                template_external_list_url : “js/template_list.js”,

                external_link_list_url : “js/link_list.js”,

                external_image_list_url : “js/image_list.js”,

                media_external_list_url : “js/media_list.js”,

 

                // Replace values for the template plugin

                template_replace_values : {

                                username : “Some User”,

                                staffid : “991234″

                }

});

</script>

 

 

Step Two:

Write two JavaScript functions to handle Onload and button submit events:

Onload will load the generated HTML to Editor and On Submit will submit form and load Generated HTML back to crmForm.

function OnSubmit()

{   

    document.myform.submit();   

    window.parent.document.forms[0].all.end_content.DataValue = document.getElementById(‘content’).value;

}

 

function OnLoad()

{

    document.getElementById(‘content’).value = window.parent.document.forms[0].all.new_content.DataValue;

}

 

Step Three:

Place this page at ISV/ folder and use an IFRAME at the form where you want this editor to be visible. Set the IFRAME src to this aspx form and you all set to go.

 aaa

 

 

Generated HTML in crmForm control.

 aa

 

Let me know in case you need any assistance or suggestions.

Event on Many to Many Relationship (N:N) in CRM 4

Microsoft Dynamics CRM 4 does not expose any event when records are associated through N:N relationship. So if you want to perform some function when a record is associated to another record in N:N relationship, CRM simply excuses and you have to look into hacks and unsupported solutions.
Hack 1:
There is a cool hack by Aaron at http://consulting.ascentium.com/blog/crm/Post533.aspx.
Aaron has come up with a solution to expose the Disassociate and Associate event using a SQL script. This is unsupported customization and Microsoft is not supporting these changes.
Hack 2:
Create a flag at the master entity named IsDirty and place that attribute at a hidden tab.
At onload event simply mark this attribute as true.
crmForm.all.oa_isdirty.DataValue = !crmForm.all.oa_isdirty.DataValue;
Now you can have an attribute that prompts user every time to save the form and you can plan a workflow or plugin that executes on update of this event.
This is a supported customization and can easily be upgragable.

Microsoft Dynamics CRM 4 does not expose any event when records are associated through N:N relationship. So if you want to perform some function when a record is associated to another record in N:N relationship, CRM simply excuses and you have to look into hacks and unsupported solutions.

Hack 1:

There is a cool hack by Aaron at http://consulting.ascentium.com/blog/crm/Post533.aspx.

Aaron has come up with a solution to expose the Disassociate and Associate event using a SQL script. This is unsupported customization and Microsoft is not supporting these changes.

Hack 2:

Create a flag at the master entity named IsDirty and place that attribute at a hidden tab.

IsDirtyFlag

 

  At onload event simply mark this attribute as true.

crmForm.all.new_isdirty.DataValue = !crmForm.all.new_isdirty.DataValue;

Now you can have an attribute that prompts user every time to save the form and you can plan a workflow or plugin that executes on update of this event.

This is a supported customization and can easily upgraded.

Announcing 2nd Microsoft Dynamics CRM Incubation Week

Microsoft Dynamics CRM Incubation Week is designed to offer following assistance to entrepreneurs.

 

- Learning and building next generation business solution on Microsoft Dynamics CRM Platform (a rapid application development platform to reduce the cost and Go-To-Market time) with help of on-site advisors (Microsoft Dynamics CRM experts).

- Getting entrepreneurs coaching from a panel of industry experts (academic and angel investors)

- Generating marketing buzz for their ideas

 

The 2nd CRM Incubation Week is being held at Microsoft Technology Center, Boston, MA from Mon 4/20/2009 to Fri 4/24/2009. This event consists of ½ day of training, 3 ½ days of active prototype/development time, and a final day for packaging/finishing and reporting out to a panel of judges for various prizes.

 

This event is a no-fee event (plan your own travel expenses) and each team can bring 3 participants (1 business and 1-2 technical). To nominate your team, please submit the following details to Sanjay Jain. Nominations will be judged according to the strength of the founding team, originality and creativity of the idea, and ability to leverage CRM as a Platform.

 

 

Organization Details

Name

 

Web Site URL

 

Mailing Address

 

Solution Overview

 

Target Industry

 

 

Team Details

Participant 1:

 

Name

 

Brief BIO

 

Email

 

Phone

 

Participant 2:

 

Name

 

Brief BIO

 

Email

 

Phone

 

Participant 3:

 

Name

 

Brief BIO

 

Email

 

Phone

 

 

Synchronous Matchcode Generation – Duplicate Detection in Dynamics CRM 4

Microsoft Dynamics CRM 4.0 provides a Duplicate Detection feature to protect the quality of your data. Duplicate Detection rules can be defined for different record types, including custom entities, and can be defined across record types as well.

In background a matchcode service is running and creating/updating matchcode for new/existing records. This matchcode will be matched to detect duplicates. Matchcode service runs asynchronously after 5 minutes and create/updates matchcode. So any record that is inserted within 5 minutes of time will not be detected. This happens only when you insert record within less than 5 minutes of time or before generation of matchcode. This results in no warning message for duplicate records even though duplicate record exists according to duplicate rules.

There is no way to persist matchcodes synchronously when records are created/updated through the UI, without writing extra code. So here are few recommendations to do so.

  1. A workaround is to Import data (Tools->Import), and choose the option to prevent creation of duplicate records. This will create the matchcodes for all imported records synchronously.
  2. You can force the creation of a matchcode at the time of record create/update by including the PersistInSyncOptionalParameter in the Create/Update request and setting its value to ‘True’. A code snippet that includes the optional parameter in a CreateRequest is as follows:
    CreateRequest request = new CreateRequest();
    request.OptionalParameters = new OptionalParameter[] { new PersistInSyncOptionalParameter (true) };

  3. You can write a plugin for this at Create and Update message. Beware to silent your plugin by setting Context to null.

if (context.Depth <= 1)
                {
                    if ((message.ToLower() == “create”))
                    {
                        DynamicEntity entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];

                        TargetCreateDynamic createdynamic = new TargetCreateDynamic();
                        createdynamic.Entity = entity;                      

                        CreateRequest request = new CreateRequest();
                        request.Target = createdynamic;
                        request.OptionalParameters = new OptionalParameter[] { new PersistInSyncOptionalParameter(true) };

                        CreateResponse response = (CreateResponse)service.Execute(request);
                    }
                }
                context = null;