Skip to main content

Posts

Showing posts from January, 2012

Fiddling with CRM

Today I am reposting my guest blog appearance yesterday on the Sonoma Partners Blog.  Enjoy!


Fiddler can be extremely helpful in troubleshooting CRM issues and also great for testing web requests before deploying.  In this post I will go over some of the helpful and maybe not-so-obvious features of Fiddler.

First things first, you can find Fiddler here - http://fiddler2.com/fiddler2/version.asp.  Also to get started we first need to turn on a few settings.

If you are using HTTPS then go into Tools – Fiddler Options -> HTTPS Tab and check the following options:
•Capture HTTPS CONNECTs
•Decrypt HTTPS traffic
•Ignore server certificate errors



Next, click on the Composer tab on the right side panel of Fiddler.  Then click on the Options sub-tab and select Automatically Authenticate



With these settings turned on, we can now perform the following techniques.

Request Logging

The main feature of Fiddler is being able to log and inspect web requests being made from the client machine.  In …

Advanced Configuration Settings

I discovered some Advanced Configuration Settings that most people probably don't know about.  You can find them here on this MSDN article:  http://msdn.microsoft.com/en-us/library/gg328128.aspx.

Note - In the above article, Microsoft suggests that these settings should only be updated when a Microsoft Dynamics CRM Support Rep suggests it.




There are five different types of Advanced Configuration Settings.  They include:

CmdKeySetting -  http://msdn.microsoft.com/en-us/library/gg309584.aspxDeployment -  http://msdn.microsoft.com/en-us/library/gg334634.aspxOrganization -  http://msdn.microsoft.com/en-us/library/gg309371.aspxOrganizationFeatureMap -  http://msdn.microsoft.com/en-us/library/gg594437.aspxServerSettings -  http://msdn.microsoft.com/en-us/library/gg334675.aspx
These configuration settings can only be updated through the CRM API.  Here's some sample code from the above article on updating these settings:

RetrieveAdvancedSettingsRequest request = new RetrieveAdvancedSetti…

CRM 2011 LINQ - All Columns vs. Selected Columns

When creating LINQ queries in CRM 2011, it is easy enough to return the whole column set of the entity record without even thinking about the impact.  
Below is an example of querying all contacts from Chicago and returning all columns for each contact record.


This can be a big performance impact depending on the amount of columns that exist on the Contact entity and how many contact records exist in the system.  Another issue is that it could cause errors down the line if some of the attribute types are changed in the CRM system since the data is being bound to a model class that could be out-of-sync.
From the MSDN article on constructing LINQ queries (http://msdn.microsoft.com/en-us/library/gg328328.aspx), we can see that the select clause creates a column set:
The select clause defines the form of the data returned. The clause creates a column set based on the query expression results. You can also define an instance of a new object to work with. The newly created object using the…

CRM 2011 Form XML

Retrieving and parsing the Form XML in CRM 2011 is pretty easy.  If you ever had to do this in CRM 4.0 you would know that the Form XML was stored in the OrganizationUI table.  In CRM 2011 it is now stored in the SystemForm table.  
So first things first, we need to build a query to retrieve the Form XML for an entity from the SystemForm table.

In my case, I just have the entity's name so I need to retrieve the entity metadata and find it's type code to use to filter the query.  I also filter the SystemForm Type by 2 which means it is the Main form (http://msdn.microsoft.com/en-us/library/gg509016.aspx).
Now that we have my entity's Form XML.  We can build a method to find all the attributes' schema names that exist on the form.  This method just parses the XML string into an XElement and then selects all the id's of the "control" nodes that exist in the Form XML.  This array of id's will be all the schema names of the attributes that exist on the for…

Workflow Debugging - CRM 4.0 vs CRM 2011

In CRM 4.0 debugging workflow errors can be a pain.  If you browse to the system job record, it is in either "Waiting" or "Failed" status.  Opening the record in hopes to find more details just provides you with the infamous generic error "An error has occurred.".  A pro tip if you are in this situation is to run this SQL query against the organization database:


select Message from AsyncOperationBase
order by CreatedOn desc

This will display all the system job records in order of most recent.  The Message column will contain a more detailed error which is very helpful in troubleshooting the workflow instead of the generic error you see in the UI.

For example I have a workflow that executes on status change of a Task and the workflow will try to update that Task record.  When I close a task this workflow will execute and fail.  I can dig into the database by running the SQL query from above to find this very helpful message:


This tells me exactly what the …