Archive for the ‘CRM Deployement’ Category

Customizing Charts using XML – Part 1

Dynamics CRM 2011 provides a very useful feature called charts. Charts can be designed within charts designer provided out of box and they can also be customized using charts XML. In this post we will look into various customization options available to design charts using XML.

Charts are used to display and portrait information in a meaningful way so that chart’s audience can quickly understand and analyse data trends. Some charts convey message more accurately than other. For example, a line chart conveys trending information better than a pie chart.

There are a handful of chart types available in charts designer such as:

  1. Column chart
  2. Bar chart
  3. Line chart
  4. Pie chart
  5. Funnel chart
  6. Multi-series chart
  7. Stacked charts
  8. Mixed chart
  9. Series chart

Dynamics CRM 2011 uses Microsoft Chart Controls for Microsoft .NET Framework 3.5. This framework is rich in functionality and provides more chart types. Following chart types can be consumed within Dynamics CRM 2011.

Area StackedArea Column StackedColumn100
Pyramid Funnel Renko PointAndFigure
Bar StackedArea100 Doughnut StepLine
Radar Kagi Spline Polar
BoxPlot StackedBar ErrorBar Stock
Range Line SplineArea ThreeLineBreak
Bubble StackedBar100 FastLine
RangeBar Pie SplineRange
Candlestick StackedColumn FastPoint
RangeColumn Point

Let’s dig deep into Chart XML and Customize few of them to unleash their potential.


FTP Server as Document Store for CRM4

Microsoft CRM can store files as annotation but is not a document management system at all. There are many ways to integrate CRM with Document Management Systems. If you are looking for search within document, version control, and publishing workflow then this post is not for you.

The idea behind this post is to utilize CRM structural relationship model and build a Document Store to process documents and also a cost effective way create, persist, and distribute document. Since document size can increase to GB’s so attaching documents as annotation is not a good idea and can clearly increase the size of database in days.

I am using FTP and FTPS protocol to manage documents. At CRM side i have created an entity representing document as a record and then associated this entity where ever required. So here is my entity.\

 I have document category and sub category (dependent picklist) to categorize and classify my document on FTP Server. I have Upload and Download Button to save and retrieve document from FTP server. In the references section, I have the meta data attached to the document entity. The metadata could be a relationship to case/contact/account or any other custom entity. So in Case entity my document will appear as shown below:


So now I can apply approval workflows in CRM whenever a new document is created.


Also I can utilize these documents online in my customer portals (eService). My documents can be accessed online by using FTP and utilized in various ways as shown below:

Auto Complete Recursive/Waiting Workflows – Microsoft CRM 4

Microsoft Dynamics CRM provides very powerful workflow designer tools to create workflows for various business scenarios. Waiting workflows are one of them. Very often, it is required to create waiting workflow on dates. So if a date is changed the waiting workflow remains in waiting state and date change executes another waiting workflow. So this aggregation of workflows affects CRM Server performance and application functionality.

Recently I have created a custom workflow activity to kill these waiting workflows in a recursive workflow. So I would like to share my experience with all of you.

I am in a condition to create a waiting workflow to reschedule my activity periodically i.e. recurring appointments, Auto Reorder (Sales Order) etc. My workflow is fired on Create of activity/Order and on change of Next Due date/Next Order Date. So if the user has changed Next Due Date or Next Order Date, the workflows in waiting remains in waiting and also a new Waiting workflow is fired. My aim is to kill the existing workflow as it is invalid now and start a new waiting workflow with updated information.

My workflow name is Auto Reschedule Activity. Here is the description of my workflow:

                Wait for Next Due Date == Today
                                Reschedule Activity Accordingly
                                Recursive Call: Auto Reschedule Activity

What i am looking for is:

                Check if there is an existing workflow with same Workflow ID, Entity ID and in Waiting State.
                                Then Kill that workflow.
                Wait for Next Due Date == Today
                                Reschedule Activity Accordingly
                                Recursive Call: Auto Reschedule Activity

So I started with a custom Activity to fetch workflows in waiting state with same name and regardingobjectid:

I created a query object in my custom workflow activity:

QueryExpression query = new QueryExpression();
query.EntityName = “asyncoperation”;
 query.ColumnSet = cols;

And created 3 conditions as below:

ConditionExpression c1 = new ConditionExpression();
c1.AttributeName = “name”;
c1.Operator = ConditionOperator.Equal;
c1.Values = new Object[] {‘My workflow Name’}; //Workflow
ConditionExpression c2 = new ConditionExpression();
C2.AttributeName = “statecode”;
C2.Operator = ConditionOperator.Equal;
C2.Values = new Object[] {1}; //Waiting
ConditionExpression c3 = new ConditionExpression();
C3.AttributeName = “regadingobjectid”;
C3.Operator = ConditionOperator.Equal;
C3.Values = new Object[] {context. PrimaryEntityId}; //Waiting

So now I have all the waiting workflows regarding my activity. Ideally there will be only one workflow in waiting state all the time. This workflow will be responsible for rescheduling.

So now is the time to kill the outdated workflow. So here is the code for setting that workflow complete/cancelled.

foreach (BusinessEntity be in bec.BusinessEntities)
                    asyncoperation async = (asyncoperation)be;
                    async.statecode = new AsyncOperationStateInfo();
                    async.statecode.Value = AsyncOperationState.Completed;

You can improve this workflow utility to add lot more functionality to workflow designer.

Waiting/Timed Workflow VS Windows Service

Developing some service or workflow to handle some periodic tasks is natural to CRM solutions. Last week, I have been looking for the best way to handle periodic tasks like sending reminders, creating tasks based on date/time, birthday notifies etc.

So I have an entity project schedule and I have thousands of records of this entity where I have to send email reminders. For each record I can have a waiting workflow. So I can have thousands of waiting workflows. While, I can develop a windows service that runs overnight and process records according to criteria and send reminders.

What about performance constraints for hundreds of waiting workflows VS one windows service instance running overnight?

So here are some merits and demerits for both techniques:

1. Workflows can be configurable with no code but we need to create a configuration mechanism for windows service and scheduled tasks.

2. We can control the best time to execute a windows service while workflows fired on the event matching time condition.

3. Any change in the logic can be rolled out with ease in case of windows service during off peak time while waiting workflow remain in waiting as per old logic. So it creates a big issue in case of maintenance.

4. If number of records is high then creating waiting workflows cause a strain on the system and degrade performance as compared to windows service.

5. If there is frequent update operation on the waiting workflow entity then every time a change occur workflow becomes active and then in waiting state. This can cause a strain to the live system.

Although waiting workflows will not consume any CPU or memory resources but overhead of handling change and strain on system during peak hours make them a less favorite as compared to windows service. Personally I feel much control and maintainability in windows service as compared to workflows.

MSCRM and MapPoint Integration – A picture is worth a thousand words.

Microsoft Provides MapPoint Web Service to enrich application with mapping functionality. It allows you to integrate maps, driving directions, order tracking and proximity searches into a wide range of solutions.

For those of you who want to start using MapPoint for test and development purposes you can sign up for a free developer account here:


With a developer account, you get full access to the MapPoint Web Service APIs and staging environment, which you can use to build applications for trial, demonstration, and proof-of-concept purposes.



Microsoft Dynamics CRM Account entity already has longitude and latitude parameters for address. But mostly organizations don’t use those parameters. MapPoint web service provides FindAddress service to resolve addresses and returns longitude and latitude parameter as shown in the code snippet below. 

Find Address Longitude and Latitude FindServiceSoap FindService = new FindServiceSoap ();
FindService.Credentials = new NetworkCredential(“”, “”);
FindService.PreAuthenticate = true;
MyAddress mAddress = new MyAddress();

mAddress = (MyAddress)addresses[i];

FindAddressSpecification spec = new FindAddressSpecification();
spec.InputAddress = new Address();
spec.InputAddress.AddressLine = mAddress.Line1;
spec.InputAddress.CountryRegion = mAddress.Country;
spec.InputAddress.Subdivision = mAddress.StateProvince;
spec.InputAddress.PrimaryCity = mAddress.City;
spec.InputAddress.PostalCode = mAddress.Postalcode;
spec.DataSourceName = “MapPoint.NA”;
FindResults results = FindService.FindAddress(spec);

Populating Location and Pushpin Array 

Location and pushpins objects require longitude and latitude values for address. Following code is used to populate Location and Pushpin objects of MapPoint API. 

Location[] myLocation = new Location[addresses.Count];
myLocation[i] = new Location();
myLocation[i].LatLong = new LatLong();
myLocation[i].LatLong = results.Results[0].FoundLocation.LatLong;
Pushpin[] pushpins = new Pushpin [addresses.Count]; pushpins[i] = new Pushpin();
pushpins[i].PinID = “pin0”;
pushpins[i].IconName = “0”;
pushpins[i].Label = mAddress.Name;
pushpins[i].IconDataSource = “MapPoint.Icons”;
pushpins[i].LatLong = results.Results[0].FoundLocation.LatLong;
There is no simple way to provide hyperlink at Pushpins, although Pushpin label and icon can be set to custom settings. Getting image and automatic zoom based on the geography covered by the addresses

MapPoint Web Service provides Render Service API to automatic zoom based on the geography covered by addresses. Here is the code snippet to do this:

//Call MapPoint Render Web Service RenderServiceSoap RenderService = new RenderServiceSoap();
RenderService.Credentials = new NetworkCredential(“”, “”);
MapViewRepresentations mvRep = RenderService.GetBestMapView(myLocation,”MapPoint.NA”);
mviews[0] = new ViewByBoundingRectangle();
mviews[0] = mvRep.ByBoundingRectangle;
MapSpecification mspec = new MapSpecification();
mspec.Options = moptions;
mspec.Views = mviews;
mspec.Pushpins = pushpins;
mspec.DataSourceName = “MapPoint.NA”;

MapImage[] image = RenderService.GetMap(mspec);

So the final image can be displayed in some ASP.NET page to show in Microsoft Dynamics CRM. Please find below my integration of MapPoint web service with MSCRM. One can select Accounts to be plotted on MapPoint and click Show Accounts Map Button at Account Entity grid toolbar.  All selected accounts will be plotted on the MapPoint in a new web dialog with Invalid addresses at the bottom.  

Step 1 

 Here is the final Image generated in Web Dialog:
Step 2 For any comments or suggestion do let me know. Your suggestions and comments are valuable for me. Thanks!