<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4595918998034640424</id><updated>2012-01-22T13:38:17.478-08:00</updated><title type='text'>Takin' care of business... with Dynamics CRM!</title><subtitle type='html'>Tim Dutcher's blog covering the technical side of working with Microsoft Dynamics CRM 4.0 and 2011. Besides finding useful tips, code, tools, and advice, you'll probably also see lame references to Rock 'N Roll since I've chosen the name MSCRMROCKS! However, U2 will find a lot to like about this site. Keep coming back because it's a Rolling Stone.. (see, I told you).</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>37</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-3552813405723383574</id><published>2011-07-08T16:15:00.000-07:00</published><updated>2011-07-08T16:15:57.136-07:00</updated><title type='text'>Telerik RadScheduler in CRM 2011</title><content type='html'>Here's a look at the Telerik RadScheduler and RadGrid integrated with Dynamics CRM 2011 (on-premises). I'm coding this for a client who has potentially 15 activities per day and who's using lots of custom activity types. Telerik: Your&amp;nbsp;Web/Ajax controls rock!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-tXLbngsoGec/TheO2hGGSiI/AAAAAAAAAEg/dsaTmoZ16k4/s1600/TelerikRadSchedulerCrm2011.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" m$="true" src="http://4.bp.blogspot.com/-tXLbngsoGec/TheO2hGGSiI/AAAAAAAAAEg/dsaTmoZ16k4/s320/TelerikRadSchedulerCrm2011.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-3552813405723383574?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/3552813405723383574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2011/07/telerik-radscheduler-in-crm-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3552813405723383574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3552813405723383574'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2011/07/telerik-radscheduler-in-crm-2011.html' title='Telerik RadScheduler in CRM 2011'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-tXLbngsoGec/TheO2hGGSiI/AAAAAAAAAEg/dsaTmoZ16k4/s72-c/TelerikRadSchedulerCrm2011.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-3683842672820108968</id><published>2011-02-11T17:17:00.000-08:00</published><updated>2011-02-11T17:17:43.696-08:00</updated><title type='text'>Whole Lotta Love for CRM 2011 Online Plug-ins</title><content type='html'>This blog post is a Valentine's Day&amp;nbsp;card to the Dynamics CRM 2011 team members who worked on adding plug-in support for Dynamics CRM 2011 &lt;u&gt;Online&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;On a recent project, I've been able to add functionality for a client's online instance that would not have been possible in 4.0. Here's just a few of the CRM 2011 Online plug-ins I've been able to roll-out recently:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Formula Field Evaluation&lt;/strong&gt;: When records of certain types are saved, the plug-in calculates dozens of values. It's coded to&amp;nbsp;evaluate the formulas in the correct order in case of dependent values in "downstream" formulas.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Auto-Number&lt;/strong&gt;: Another plug-in we were able to deploy online is one that automatically generates a unique number for various entities. The plug-in uses a custom entity to keep track of the last number used and formatting requirements such as padding the auto-number with zeros. The new transaction support for plug-ins in CRM 2011 help to avoid generating duplicate numbers under heavy system use.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Last Activity Date&lt;/strong&gt;: It was also possible to create a plug-in for CRM 2011 Online that updates a custom "Last Activity Date" field with the date/time when an activity (letter, e-mail, phonecall, etc.) is completed. The plug-in is registered on the various CRM activity types to update Last Activity Date if the "regarding" object is a certain type.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Record "Touches"&lt;/strong&gt;: Another plug-in that we've deployed recently is one that tracks when any user opens a record in the UI. The sales manager wanted to know whether any leads and opportunities were sitting too&amp;nbsp;long without being viewed.&lt;/li&gt;&lt;/ul&gt;Developing these plug-ins without being able to step through the code was not fun (you have to trace-out statements to the UI... can you say "old school"?), but there's enough code samples and decent documentation in the SDK that it wasn't a severe limitation.&lt;br /&gt;&lt;br /&gt;So, thanks Microsoft! This is a huge improvement to your online offering.&lt;br /&gt;&lt;br /&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-3683842672820108968?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/3683842672820108968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2011/02/whole-lotta-love-for-crm-2011-online.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3683842672820108968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3683842672820108968'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2011/02/whole-lotta-love-for-crm-2011-online.html' title='Whole Lotta Love for CRM 2011 Online Plug-ins'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-295717422234943873</id><published>2011-02-09T11:24:00.000-08:00</published><updated>2011-02-09T11:24:31.003-08:00</updated><title type='text'>Capture CRM 2011 forms with Snagit</title><content type='html'>Snagit has a feature that can auto-scroll a&amp;nbsp;web page horizontally and/or vertically to capture all content from the page. In order to use this feature with CRM 2011 forms, though, you have to take some extra steps. I've listed the entire process&amp;nbsp;below.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open the form to capture. For example, to capture the account form, open an existing account record or click New to create a new account.&lt;/li&gt;&lt;li&gt;Right-click in one of the enabled text fields&amp;nbsp;and select the Display Toolbar and Menubar option. Click OK when the prompt appears. This opens the form in a window that exclude the top menubar. Continue the next steps in this new window.&lt;/li&gt;&lt;li&gt;Expand all tabs that are currently closed/hidden.&lt;/li&gt;&lt;li&gt;Press the Snagit hotkey. Click the button at the bottom of the screen (the one with the up/down arrow on it). Snagit will auto-scroll the form down to capture the entire form.&lt;/li&gt;&lt;/ol&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-295717422234943873?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/295717422234943873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2011/02/capture-crm-2011-forms-with-snagit.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/295717422234943873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/295717422234943873'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2011/02/capture-crm-2011-forms-with-snagit.html' title='Capture CRM 2011 forms with Snagit'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-6710544739248061506</id><published>2011-01-28T11:10:00.000-08:00</published><updated>2011-01-28T11:10:13.317-08:00</updated><title type='text'>CRM 2011 SDK - Set owner of record to inactive user</title><content type='html'>Can you programmatically set the owner of a record in CRM to an inactive user?&amp;nbsp; Yes, but see below for more information.&lt;br /&gt;&lt;br /&gt;I'm working on a data migration project involving&amp;nbsp;Salesforce.com &lt;u&gt;to&lt;/u&gt; Dynamics CRM 2011 Online. The source data includes thousands of records that are&amp;nbsp;assigned to inactive Salesforce.com users. Our client wants to maintain the owners in CRM but also wants the users who are inactive in Salesforce to be inactive in CRM.&lt;br /&gt;&lt;br /&gt;That brought up the question: "Can you programmatically set the owner of a record in CRM to an inactive user?".&amp;nbsp;Yes (see sample code below).&amp;nbsp;The only requirement is that each user (systemuser) must have at least one security role assigned, otherwise the CRM proxy service will throw a FaultException with the message "SecLib::RetrievePrivilegeForUser failed - no roles are assigned to user.".&lt;br /&gt;&lt;br /&gt;Here's the code I used to test this scenario:&lt;br /&gt;&lt;blockquote&gt;Guid ownerIdForInactiveUser = new Guid("1412c4da-fb2a-e011-8526-1cc1def8ea35");&lt;br /&gt;&lt;br /&gt;string accountName = "Tim Test 1";&lt;br /&gt;Entity accountEntity = new Entity("account");&lt;br /&gt;accountEntity["name"] = accountName;&lt;br /&gt;accountEntity.Attributes.Add("ownerid", new EntityReference("systemuser", ownerIdForInactiveUser));&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; crmService.Create(accountEntity);&lt;br /&gt;}&lt;br /&gt;catch (FaultException&lt;microsoft.xrm.sdk.organizationservicefault&gt; ex) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; Console.WriteLine(ex.ToString());&lt;br /&gt;}&lt;/blockquote&gt;Cheers,&lt;br /&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-6710544739248061506?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/6710544739248061506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2011/01/crm-2011-sdk-set-owner-of-record-to.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/6710544739248061506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/6710544739248061506'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2011/01/crm-2011-sdk-set-owner-of-record-to.html' title='CRM 2011 SDK - Set owner of record to inactive user'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-7678800441412786201</id><published>2011-01-20T12:34:00.000-08:00</published><updated>2011-01-20T21:19:46.519-08:00</updated><title type='text'>CRM 2011 SDK: WinOpportunityRequest and ArgumentNullException</title><content type='html'>In several of the Dynamics CRM 2011 SDK sample C# files, you'll see this comment and code line:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;// This statement is required to enable early-bound type support.&lt;br /&gt;_serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior()); &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You might think that if you're writing late-bound code, like I was doing earlier today for a data migration project, that you wouldn't need that line of code. That's true if all you're doing is creating Entity instances, setting attributes, and executing CRUD operations (e.g., _serviceProxy.Update(myEntity)).&lt;br /&gt;&lt;br /&gt;What I learned the hard way today&amp;nbsp;is that you need that line of code if you're calling the Execute method for the service proxy with an instance of WinOpportunityRequest, LoseOpportunityRequest, and the other "Request" classes. If you don't run that code then you'll probably run into the ArgumentNullException after invoking Execute on the service proxy.&lt;br /&gt;&lt;br /&gt;In hindsight, the "Opportunity" part of the name "WinOpportunityRequest" should've led me to think "maybe that's an early-bound class and therefore I need to set that ProxyTypesBehavior thing I read about". But I was convinced I was operating late-bound only. Apparently not. Another lesson learned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-7678800441412786201?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/7678800441412786201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2011/01/crm-2011-sdk-winopportunityrequest-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7678800441412786201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7678800441412786201'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2011/01/crm-2011-sdk-winopportunityrequest-and.html' title='CRM 2011 SDK: WinOpportunityRequest and ArgumentNullException'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-2926531382691960130</id><published>2011-01-19T13:41:00.000-08:00</published><updated>2011-01-19T13:41:26.078-08:00</updated><title type='text'>CRM 2011: Running JScript Code Interactively in IE 8</title><content type='html'>While working on client-side code in Dynamics CRM, it's often faster to write and test the code incrementally within the context of a a "live" form, so that adjustments can be made quickly. Then, once a block of code is working, most of it can be moved to a code library to be further tested in CRM.&lt;br /&gt;&lt;br /&gt;This article shows how to run jscript (javascript) code within an account form to format a phone number. The process utilizes the "Run Script" features in the Developer Tools utility that's included with Internet Explorer 8. The code assumes you are working in Dynamics CRM 2011.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Load the CRM form upon which you want to run/test JScript code. For this example, load the Account form since the value of the “telephone1” field will be reformatted later in the example.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Enter an unformatted&amp;nbsp;phone number in the Main Phone (telephone1) field.&amp;nbsp; Example:&amp;nbsp;4255551212&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: In IE, press F12 to load the Developer Tools window.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Click Script and then click the Multi Line Mode button.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 5&lt;/strong&gt;: Run the script shown below.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;// Reference the main form window (iframe)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;var oWindow = document.getElementById("contentIFrame").contentWindow;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;// Reference the field with the phone number to format.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;var oField = oWindow.Xrm.Page.data.entity.attributes.get("telephone1");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;// Remove any non-numeric characters from the field's data.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;var sTmp = oField.getValue().replace(/[^0-9]/g, "");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;// If the number has a valid length, format the number.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;switch (sTmp.length)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;case "4255551212".length:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; oField.setValue("(" + sTmp.substr(0, 3) + ") " + sTmp.substr(3, 3) + "-" + sTmp.substr(6, 4));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;case "5551212".length:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; oField.setValue(sTmp.substr(0, 3) + "-" + sTmp.substr(3, 4));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;strong&gt;Step 6&lt;/strong&gt;: View the Main Phone field again in the account form. The value should be formatted as (nnn) nnn-nnnn.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-2926531382691960130?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/2926531382691960130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2011/01/crm-2011-running-jscript-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2926531382691960130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2926531382691960130'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2011/01/crm-2011-running-jscript-code.html' title='CRM 2011: Running JScript Code Interactively in IE 8'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-1312976773391064188</id><published>2010-12-22T20:04:00.000-08:00</published><updated>2011-03-15T18:27:08.789-07:00</updated><title type='text'>Show attribute schema names within form editor</title><content type='html'>Maybe it's just me, but occasionally I find value in viewing attribute schema names in context of a form. This capability was on my wish list for Dynamics CRM 2011 but it didn't make the cut. Fortunately, you can run the JavaScript code&amp;nbsp;I provided below to do just that.&lt;br /&gt;&lt;br /&gt;You can execute this script and any other JavaScript code using the built-in "Developer Tools" in IE8 or by using IE WebDeveloper. First, load the form editor view (CRM displays the form editor UI in its own window). Then press Ctrl+N to open the editor in a window that allows you to get to the IE toolbar. Either press F12 (IE 8 only) or use IE WebDeveloper. Run the script in the interactive script window that's provided in each tool.&lt;br /&gt;&lt;blockquote&gt;document.getElementsByClassName = function(cl,doc) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; var retnode = [];&lt;br /&gt;&amp;nbsp; var myclass = new RegExp('\\b'+cl+'\\b');&lt;br /&gt;&amp;nbsp; var elem = doc.getElementsByTagName('*');&lt;br /&gt;&amp;nbsp; for (var i = 0; i &amp;lt; elem.length; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var classes = elem[i].className;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (myclass.test(classes)) retnode.push(elem[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; return retnode;&lt;br /&gt;};&lt;br /&gt;var doc = document.getElementById("contentIFrame").contentWindow.document;&lt;br /&gt;var crmFormFields = document.getElementsByClassName("field",doc);&lt;br /&gt;var crmReadOnlyFields = document.getElementsByClassName("rofield",doc);&lt;br /&gt;if (crmReadOnlyFields.length &amp;gt; 0) { &lt;br /&gt;&amp;nbsp; crmFormFields = crmFormFields.concat(crmReadOnlyFields); &lt;br /&gt;}&lt;br /&gt;var crmFieldId;&lt;br /&gt;var crmFormField;&lt;br /&gt;for (var i = 0; i &amp;lt; crmFormFields.length; i++) {&lt;br /&gt;&amp;nbsp; crmFormField = crmFormFields[i];&lt;br /&gt;&amp;nbsp; if (crmFormField.parentNode.parentNode.parentNode.parentNode.name) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; crmFieldId = crmFormField.parentNode.parentNode.parentNode.parentNode.name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; crmFormField.innerText = crmFieldId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; crmFormField.style.color = "#000000";&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;} &lt;/blockquote&gt;Here's&amp;nbsp;a snapshot of part of the Account form.&amp;nbsp;After running the script, the display name for each attribute is replaced with the schema name.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;a href="http://3.bp.blogspot.com/_h9ZquLCH7cY/TRLFPJwIcnI/AAAAAAAAAEQ/gNaG2omu7sI/s1600/accountform.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" n4="true" src="http://3.bp.blogspot.com/_h9ZquLCH7cY/TRLFPJwIcnI/AAAAAAAAAEQ/gNaG2omu7sI/s320/accountform.png" width="258" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-1312976773391064188?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/1312976773391064188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2010/12/show-attribute-schema-names-within-form.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1312976773391064188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1312976773391064188'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2010/12/show-attribute-schema-names-within-form.html' title='Show attribute schema names within form editor'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_h9ZquLCH7cY/TRLFPJwIcnI/AAAAAAAAAEQ/gNaG2omu7sI/s72-c/accountform.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-9064763372754628925</id><published>2010-10-14T13:53:00.000-07:00</published><updated>2010-10-15T09:25:14.874-07:00</updated><title type='text'>Party Foul</title><content type='html'>Oh no!&amp;nbsp;What's this?!?&amp;nbsp;&amp;nbsp;Failure: contact_activity_parties: Cascade link type 'NoCascade' is invalid for Delete.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I ran into that error today but found a way around it. Here's the scoop.&lt;br /&gt;&lt;br /&gt;I fired up a VPC with Dynamics CRM 4.0 Rollup 13 today and added 21 attributes to the Contact entity, which was previously unmodified.&amp;nbsp;I then exported the Contact entity to XML and send the resulting zip file to someone I work with. He has the main VPC and needed some help. Anyway, he attempted to import the Contact entity into another CRM Rollup 13 instance and got the error I mentioned above.&lt;br /&gt;&lt;br /&gt;After calling each other crazy and demanding proof that we were both running Rollup 13 (we were... not crazy, but running rollup 13, well maybe both), I exported the Contact entity and immediately re-imported the zip file. Bam! Same error... on the same CRM instance! Grrrrr.&lt;br /&gt;&lt;br /&gt;The "solution"?&amp;nbsp; I removed the node "&amp;lt;EntityRelationship Name="contact_activity_parties"&amp;gt;&lt;entityrelationship name="contact_activity_parties"&gt;" from the Contact XML, saved the file, and wouldn't you know it, CRM imported that version of the customizations file just fine.&lt;br /&gt;&lt;br /&gt;I'm sure, I have to believe, okay I hope&amp;nbsp;(but not holding my breath) that&amp;nbsp;Microsoft has made customization import/export rock solid between rollups in Dynamics CRM 2011. I can understand that moving customizations between different rollups is hard for Microsoft to get right but exporting and re-importing on the same server, within only&amp;nbsp;38 seconds lapsing between the time the zip file plopped onto C: to when I optimistically clicked the Import button -- for that not to work is, well, causing me to write this blog post&amp;nbsp;instead of working. So with that, onward to the next challenge.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-9064763372754628925?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/9064763372754628925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2010/10/party-foul.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/9064763372754628925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/9064763372754628925'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2010/10/party-foul.html' title='Party Foul'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-4004493773259726150</id><published>2010-09-10T17:45:00.000-07:00</published><updated>2010-09-12T21:45:35.689-07:00</updated><title type='text'>Dynamics CRM 2011 Beta SDK Greatest Hits</title><content type='html'>Here are some articles, notes, and tidbits I've found so far in the Dynamics CRM 2011 SDK&amp;nbsp;that are particularly cool, as compared to the now "old school" version 4.0 of the product. &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Azure Integration&lt;/strong&gt;: In simple terms, the CRM async service can send &lt;em&gt;messages&lt;/em&gt; to&amp;nbsp;a &lt;em&gt;queue&lt;/em&gt;&amp;nbsp;in&amp;nbsp;Azure to&amp;nbsp;process. That&amp;nbsp;will make&amp;nbsp;&lt;a href="http://altriva.com/AltrivaBlog/PostID/30.aspx"&gt;this 4.0 application&lt;/a&gt; better because I can now perform integration tasks from CRM changes rather than using a polling service.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Multiple Forms for an Entity&lt;/strong&gt;:&amp;nbsp;You can&amp;nbsp;define more than one main form for each entity. Use multiple forms to create forms that are customized to specific roles or tasks in the organization.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;REST Endpoint&lt;/strong&gt;: In 4.0, writing client-side code in SOAP is not exactly fun or easy. In 2011, you can replace a lot of that code with REST-based calls using JQuery or other jscript libraries.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Goals!&lt;/strong&gt;: Goal Management enables you to set the sales, marketing or other business goals for your organization and measure the results against the targets.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Silverlight Samples&lt;/strong&gt;: It's great to see sample code in the SDK for interacting with Silverlight applications. Of course, &lt;a href="http://crm.davidyack.com/"&gt;David Yack&lt;/a&gt; was way ahead on this but this adds to the cool factor in the SDK.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Data Auditing&lt;/strong&gt;: Audigint is built in and&amp;nbsp;can be enabled at the organization, entity, and attribute levels.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Custom Activity Types&lt;/strong&gt;: You can create your own activity types to track&amp;nbsp;customer interactions that go beyond the built-in phone, letter,&amp;nbsp;e-mail,&amp;nbsp;task, etc. For example, if you business has a customer portal for service incidents, you might want to track interactions in the portal as a custom activity type.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Web Resources&lt;/strong&gt;: Web Resources are 'virtual files' that are stored in the CRM database and may be retrieved using a unique URL address. Web Resources can be used in Form customizations, Sitemap or the application ribbon.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;em&gt;Sandbox&lt;/em&gt; for plug-ins&lt;/strong&gt;:&amp;nbsp;CRM Online will benefit from the ability to run&amp;nbsp;plug-ins in an isolated environment. In this environment, also known as a sandbox, a plug-in can make use of the full power of the CRM SDK to access the Web services.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Entity Connections&lt;/strong&gt;: A person I worked with at a large Northwest company has a brother who I run into often while hiking in the Cascades. He works for a subsidiary of the larger company. Now, in CRM 2011, I can connect those contacts in ways that helps me and others at Altriva know how they're related (or conneted) to each other.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;PowerShell Cmdlets&lt;/strong&gt;:&amp;nbsp;The Beta SDK has placeholders in the documentation for instructions on how to use PowerShell to help with deployment-related tasks.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Solutions&lt;/strong&gt;: &lt;em&gt;Solutions&lt;/em&gt; are how customizers and developers author, package and maintain a single unit of software that extends Microsoft Dynamics CRM.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Recurring Appointments&lt;/strong&gt;: Create recurring appointments with flexible intervals/patterns.&lt;/li&gt;&lt;/ul&gt;One feature that&amp;nbsp;I'm hoping Microsoft will&amp;nbsp;hurry and add&amp;nbsp;is&amp;nbsp;one that can generated a&amp;nbsp;unique number. This is a common customization that we add for our clients but it really should be built in to the product.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-4004493773259726150?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/4004493773259726150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2010/09/dynamics-crm-2011-beta-sdk-greatest.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4004493773259726150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4004493773259726150'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2010/09/dynamics-crm-2011-beta-sdk-greatest.html' title='Dynamics CRM 2011 Beta SDK Greatest Hits'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-2347275164911257288</id><published>2010-08-23T16:53:00.000-07:00</published><updated>2010-08-23T16:53:59.656-07:00</updated><title type='text'>Azure / CRM app won't deploy -  Initializing, Busy, Stopping</title><content type='html'>I made a simple code change to an Azure WorkerRole service today.&amp;nbsp;Before deploying the app, I noticed that the folder where my code lived on my machine didn't match up with source control so I did a little readjusting of folders. No big deal, I thought. The application compiled fine and ran on my local dev fabric.&lt;br /&gt;&lt;br /&gt;After deploying the updated Azure service, the deployment screen showed Initializing, then Busy, followed by Stopping... and then went back to Initializing, Busy, etc. It was stuck in a loop.&amp;nbsp;I read something about this in the past and knew that it related to invalid DLL references, invalid configuration or a number of other things.&lt;br /&gt;&lt;br /&gt;After convincing myself that my code change was working and&amp;nbsp; had proper exception handling just in case, I put all the pieces of the application back in their previously known working locations. Voila! The application deployed to Azure fine.&lt;br /&gt;&lt;br /&gt;What happened is that Visual Studio started referencing 32-bit versions of the CRM SDK assemblies (microsoft.crm.sdk.dll and microsoft.crm.sdktypeproxy.dll) when I moved the application to different folders -- it could no longer find the 64-bit files I referenced previously. So when I deployed the application the 32-bit CRM assemblies went along up to Azure... but Azure only runs with 64-bit assemblies!&lt;br /&gt;&lt;br /&gt;I was punished once again by good intentions. But at least I can add this troubleshooting lesson to my list for future reference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-2347275164911257288?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/2347275164911257288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2010/08/azure-crm-app-wont-deploy-initializing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2347275164911257288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2347275164911257288'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2010/08/azure-crm-app-wont-deploy-initializing.html' title='Azure / CRM app won&apos;t deploy -  Initializing, Busy, Stopping'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-8387924070875170329</id><published>2010-08-18T13:14:00.000-07:00</published><updated>2010-08-18T13:14:58.328-07:00</updated><title type='text'>Notification of activity changes in Dynamics CRM 4.0</title><content type='html'>There's a Windows desktop app that&amp;nbsp;I've been using named "&lt;a href="http://activeurls.com/"&gt;Check&amp;amp;Get&lt;/a&gt;" that notifies me when someone modifies content on any of about 100&amp;nbsp;websites that I follow. Once each day, I go to Check&amp;amp;Get and can see what websites have significant content changes. This is especially helpful to keep up on blogs.&lt;br /&gt;&lt;br /&gt;Today, I found another use for Check&amp;amp;Get.&amp;nbsp;I work at &lt;a href="http://www.altriva.com/"&gt;Altriva Solutions&lt;/a&gt;&amp;nbsp;and last year I helped create an "ISV" application for CRM 4.0 (on-premise and online) named "CRM Activity Summary". This application brings together all activities, notes, attachments, e-mails, etc. for any account, contact, opportunity, case, etc. and displays that content on one page.&amp;nbsp;For example, if I'm looking at the account form for one of our clients I can see all activities, e-mails, notes, etc. for that account and all connected contacts, opportunities, and cases -- all on one page!&lt;br /&gt;&lt;br /&gt;Since Check&amp;amp;Get can monitor any web page, and Altriva CRM Activity Summary can construct a web page of all rolled-up activities for an account record in CRM, my thought was that perhaps I could point Check&amp;amp;Get at the CRM Activity Summary page for the accounts I work with&amp;nbsp;and let it tell me when anything has changed. It worked!&amp;nbsp;I now have&amp;nbsp;complete and timely visibility into several clients' activities&amp;nbsp;and will know within minutes when anything has changed and can act (or not) as appropriate.&lt;br /&gt;&lt;br /&gt;Let me know if you'd like more information about the Altriva CRM Activity Summary application or&amp;nbsp;the Check&amp;amp;Get and Activity Summary "mash-up". It actually took me longer to write this blog post&amp;nbsp;than it did to get that mash-up working... so if you need a quick and easy way to keep on top of CRM changes then this is one more way to do it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-8387924070875170329?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/8387924070875170329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2010/08/notification-of-activity-changes-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/8387924070875170329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/8387924070875170329'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2010/08/notification-of-activity-changes-in.html' title='Notification of activity changes in Dynamics CRM 4.0'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-2004693963340722439</id><published>2010-01-25T11:10:00.001-08:00</published><updated>2010-01-25T11:44:12.640-08:00</updated><title type='text'>Show field schema names in CRM 4.0 form editor</title><content type='html'>I recently worked on a project where the requirement was to rebuild an Excel-based quoting worksheet&amp;nbsp;within a Microsoft Dynamics CRM 4.0 form.&lt;br /&gt;&lt;br /&gt;Besides the code complexity (e.g., triggering the field onchange events appropriately), the other challenge was to keep track of the attribute schema name for 50+ form fields. (Note: The CRM form editor shows the attribute display name in each field rather than showing the attribute schema name. You can double-click a field to see its schema name but that’s too many clicks when you’re dealing with so many fields.) &lt;br /&gt;&lt;br /&gt;What I really needed was a print-out of all of the form's tabs with the attribute schema name appearing in each of the fields. This would allow me to write the form’s Jscript code faster since I wouldn’t have to match field display names to schema names using the /sdk/list.aspx tool or other method.&lt;br /&gt;&lt;br /&gt;One solution I came up with to show the field schema names within the form editor was to use the Script Editor that’s available in the &lt;a href="http://www.ieinspector.com/dominspector/" target="_blank"&gt;IE WebDeveloper&lt;/a&gt; UI to change form’s HTML DOM on-the-fly.&lt;br /&gt;&lt;br /&gt;Here’s how to do this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Login as an administrator in the CRM web application. &lt;/li&gt;&lt;li&gt;Open the form editor for an entity. &lt;/li&gt;&lt;li&gt;Press Ctrl-N to open the form editor in a window that gives you access to the &lt;a href="http://www.ieinspector.com/dominspector/" target="_blank"&gt;IE WebDeveloper&lt;/a&gt; tool. &lt;/li&gt;&lt;li&gt;In IE WebDeveloper, go to the Script Console and click Run Script. &lt;/li&gt;&lt;li&gt;Copy/paste the code I’ve provided below and run it. &lt;/li&gt;&lt;li&gt;Take a screenshot of the form. &lt;/li&gt;&lt;/ol&gt;Here’s a sample CRM form with the field attribute schema names showing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_h9ZquLCH7cY/S13s1u12HrI/AAAAAAAAAEA/at33fu4mb5o/s1600-h/crm4_formWithSchemaNamesShowing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="473" mt="true" src="http://4.bp.blogspot.com/_h9ZquLCH7cY/S13s1u12HrI/AAAAAAAAAEA/at33fu4mb5o/s640/crm4_formWithSchemaNamesShowing.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Run this Jscript&amp;nbsp; code in the IE WebDeveloper tool’s Script Console window:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: Courier New;"&gt;document.getElementsByClassName = function(cl) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; var retnode = [];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; var myclass = new RegExp('\\b'+cl+'\\b');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; var elem = this.getElementsByTagName('*');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; for (var i = 0; i &amp;lt; elem.length; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var classes = elem[i].className;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (myclass.test(classes)) retnode.push(elem[i]); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; return retnode; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;var crmFormFields = document.getElementsByClassName("field");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;var crmReadOnlyFields = document.getElementsByClassName("rofield");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;if (crmReadOnlyFields.length &amp;gt; 0) { crmFormFields = crmFormFields.concat(crmReadOnlyFields); }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;var crmFieldId;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;var crmFormField;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;for (var i = 0; i &amp;lt; crmFormFields.length; i++) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; crmFormField = crmFormFields[i];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; crmFieldId = crmFormField.parentNode.parentNode.parentNode.parentNode.id;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&amp;nbsp; crmFormField.innerText = crmFieldId; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Hopefully this will save you some time next time you’re working with a form and need quick access to the field schema names.&lt;br /&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-2004693963340722439?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/2004693963340722439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2010/01/show-field-schema-names-in-crm-40-form.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2004693963340722439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2004693963340722439'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2010/01/show-field-schema-names-in-crm-40-form.html' title='Show field schema names in CRM 4.0 form editor'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_h9ZquLCH7cY/S13s1u12HrI/AAAAAAAAAEA/at33fu4mb5o/s72-c/crm4_formWithSchemaNamesShowing.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-8600480737019179739</id><published>2010-01-24T22:11:00.000-08:00</published><updated>2010-01-24T23:33:48.547-08:00</updated><title type='text'>Microsoft's CRM forums... analyzed</title><content type='html'>&lt;p&gt;I've been using a great full-text search application named &lt;a href="http://www.dtsearch.com/"&gt;dtSearch&lt;/a&gt; for several years but just recently discovered a feature that I'm finding more useful. The feature allows you to report on the count of words in an index. Combined with the ability to crawl entire websites, the two features can answer some interesting questions, such as the ones I came up with today: In Microsoft's CRM forums, what words are mentioned the most in the forum posts? In other words, what topics are people discussing the most in the CRM forums?&lt;/p&gt;&lt;p&gt;The answer to the question was easy to come by with dtSearch. First, I pointed the crawler at the three CRM forums and let it go until it downloaded all of the posts. I then exported a count of all of the words in the forums, removed the common "noise" words and came up with a pretty interesting list.&lt;/p&gt;&lt;p&gt;In the table below, I've listed the most occurring words in the CRM forums. I added some commentary to the first twenty words to give you an idea of what I've concluded from the word, but of course you can come to your own conclusions. &lt;/p&gt;&lt;span style="font-size:small;"&gt;&lt;table border="1" cellspacing="2"&gt;&lt;tbody&gt;&lt;tr valign="top"&gt;&lt;td&gt;&lt;strong&gt;The Word&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;# Occurrences&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Comments&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;entity&lt;/td&gt;&lt;td align="right"&gt;24938&lt;/td&gt;&lt;td&gt;An entity is what it all comes down to.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;error&lt;/td&gt;&lt;td align="right"&gt;16293&lt;/td&gt;&lt;td&gt;Most of the use of "error" in forum posts relate to the generic "An error has occurred…".&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;I'm guessing from this that a lot of forum posts originate from those who do not know how to turn on error-level tracing on the CRM Web server. Perhaps Microsoft could write full error details to a format that's easier to review, perhaps with a GUI they provide.&lt;span style="mso-spacerun: yes"&gt; &lt;/span&gt;Showing generic error messages and not providing customers with an easy way to get to the root of the problem leads to a lot of... forum Q&amp;amp;A's (and loss of productivity).&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;rights&lt;/td&gt;&lt;td align="right"&gt;15287&lt;/td&gt;&lt;td&gt;With the flexible role-level security features in Dynamics CRM, there are understandably lots of questions and problems relating to access rights.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;workflow&lt;/td&gt;&lt;td align="right"&gt;14382&lt;/td&gt;&lt;td&gt;Plenty of questions about how to do something in workflow. A lot of the forum posts where "workflow" is mentioned also mentions "plugin", which tells me that people post questions about workflow and are told that they've hit a limitation and will need to write a plugin. Hopefully in 5.0 Microsoft will provide more workflow capabilities that don't require crossing over to code.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;field&lt;/td&gt;&lt;td align="right"&gt;14083&lt;/td&gt;&lt;td&gt;Along with "entity", not surprising to see people needing to know how to update fields, make them read-only, etc.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;custom&lt;/td&gt;&lt;td align="right"&gt;13192&lt;/td&gt;&lt;td&gt;It's not suprising to see this a top word considering that Dynamics CRM is highly customizable. This word is usually coupled with "entity", "attribute", or "field". But "custom application" is a popular subject as well.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;account&lt;/td&gt;&lt;td align="right"&gt;13037&lt;/td&gt;&lt;td&gt;The top-mentioned entity type.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;blogspot&lt;/td&gt;&lt;td align="right"&gt;10848&lt;/td&gt;&lt;td&gt;Looks like most people who mention their blog host their blog on blogspot.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;contact&lt;/td&gt;&lt;td align="right"&gt;10518&lt;/td&gt;&lt;td&gt;The second most mentioned entity type.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;donna&lt;/td&gt;&lt;td align="right"&gt;10033&lt;/td&gt;&lt;td&gt;This word occurs because Donna Edwards responds to a ton of questions. Thanks Donna!&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;problem&lt;/td&gt;&lt;td align="right"&gt;9944&lt;/td&gt;&lt;td&gt;Why else do people visit software-oriented online forums... because they have a problem... or an error. (It would be interesting to know the percentage of forum posts are answered to the originators satisfaction. I'm sure Microsoft has that stat.)&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;attribute&lt;/td&gt;&lt;td align="right"&gt;8962&lt;/td&gt;&lt;td&gt;The word shows up mostly in client-side SOAP XML that people paste into the forums.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;davidjennaway&lt;/td&gt;&lt;td align="right"&gt;8393&lt;/td&gt;&lt;td&gt;David is a Dynamics CRM MVP who also answers a ton of questions. Thanks David!&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;outlook&lt;/td&gt;&lt;td align="right"&gt;8393&lt;/td&gt;&lt;td&gt;One of the significant benefits of Dynamics CRM is the ability to use CRM functionality seemlessly within Outlook. But the frequent occurrence of "outlook" in the forums means Microsoft needs to keep up the efforts to make the integration as reliable as possible.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;update&lt;/td&gt;&lt;td align="right"&gt;8277&lt;/td&gt;&lt;td&gt;There are lots of ways to update data in CRM but there are lots of questions about how to do it.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;check&lt;/td&gt;&lt;td align="right"&gt;8234&lt;/td&gt;&lt;td&gt;Most of the questions regarding the word "check" relate to the need to examine a field to then execute related functionality.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;string&lt;/td&gt;&lt;td align="right"&gt;7950&lt;/td&gt;&lt;td&gt;The word "string" mostly appears in CRM Exceptions that people paste from their CRM trace files to the forum. By the way, the most common exceptions asked about on the forums are these (in order of word occurrence): SoapException, CrmException, InvalidPluginException, HttpUnhandledException, SqlException, WebException, TargetInvocationException, NullReferenceException.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;find&lt;/td&gt;&lt;td align="right"&gt;7637&lt;/td&gt;&lt;td&gt;By far, the use of "find" in forum posts relate to "Advanced Find". It's a popular feature and people have lots of questions about its full capabilities.&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;view&lt;/td&gt;&lt;td align="right"&gt;7276&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;lookup&lt;/td&gt;&lt;td align="right"&gt;7193&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;sql&lt;/td&gt;&lt;td align="right"&gt;7190&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;query&lt;/td&gt;&lt;td align="right"&gt;7079&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;crmform&lt;/td&gt;&lt;td align="right"&gt;6896&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;client&lt;/td&gt;&lt;td align="right"&gt;6843&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;event&lt;/td&gt;&lt;td align="right"&gt;6767&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;function&lt;/td&gt;&lt;td align="right"&gt;6595&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;plugin&lt;/td&gt;&lt;td align="right"&gt;6369&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;guid&lt;/td&gt;&lt;td align="right"&gt;6138&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;imran&lt;/td&gt;&lt;td align="right"&gt;6116&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;customereffective&lt;/td&gt;&lt;td align="right"&gt;5967&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;sdk&lt;/td&gt;&lt;td align="right"&gt;5938&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;activity&lt;/td&gt;&lt;td align="right"&gt;5904&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;application&lt;/td&gt;&lt;td align="right"&gt;5855&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;xml&lt;/td&gt;&lt;td align="right"&gt;5806&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;button&lt;/td&gt;&lt;td align="right"&gt;5543&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;javascript&lt;/td&gt;&lt;td align="right"&gt;5531&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;please&lt;/td&gt;&lt;td align="right"&gt;5474&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;context&lt;/td&gt;&lt;td align="right"&gt;5341&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;crmservice&lt;/td&gt;&lt;td align="right"&gt;5334&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;import&lt;/td&gt;&lt;td align="right"&gt;5322&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;request&lt;/td&gt;&lt;td align="right"&gt;5280&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;opportunity&lt;/td&gt;&lt;td align="right"&gt;5228&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;execute&lt;/td&gt;&lt;td align="right"&gt;5064&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;select&lt;/td&gt;&lt;td align="right"&gt;5058&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;hassan&lt;/td&gt;&lt;td align="right"&gt;4983&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;contacts&lt;/td&gt;&lt;td align="right"&gt;4856&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;lead&lt;/td&gt;&lt;td align="right"&gt;4779&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;possible&lt;/td&gt;&lt;td align="right"&gt;4706&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;database&lt;/td&gt;&lt;td align="right"&gt;4626&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;null&lt;/td&gt;&lt;td align="right"&gt;4598&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;owner&lt;/td&gt;&lt;td align="right"&gt;4526&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;click&lt;/td&gt;&lt;td align="right"&gt;4480&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;default&lt;/td&gt;&lt;td align="right"&gt;4431&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;soap&lt;/td&gt;&lt;td align="right"&gt;4332&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;services&lt;/td&gt;&lt;td align="right"&gt;4275&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;link&lt;/td&gt;&lt;td align="right"&gt;4223&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;views&lt;/td&gt;&lt;td align="right"&gt;4201&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;think&lt;/td&gt;&lt;td align="right"&gt;4156&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;attributes&lt;/td&gt;&lt;td align="right"&gt;4091&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;relationship&lt;/td&gt;&lt;td align="right"&gt;4035&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;datavalue&lt;/td&gt;&lt;td align="right"&gt;3955&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;reports&lt;/td&gt;&lt;td align="right"&gt;3943&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;exception&lt;/td&gt;&lt;td align="right"&gt;3806&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;properties&lt;/td&gt;&lt;td align="right"&gt;3732&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;adi&lt;/td&gt;&lt;td align="right"&gt;3648&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;works&lt;/td&gt;&lt;td align="right"&gt;3648&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;msdn&lt;/td&gt;&lt;td align="right"&gt;3628&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;example&lt;/td&gt;&lt;td align="right"&gt;3605&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;option&lt;/td&gt;&lt;td align="right"&gt;3593&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;tried&lt;/td&gt;&lt;td align="right"&gt;3551&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;support&lt;/td&gt;&lt;td align="right"&gt;3476&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;hope&lt;/td&gt;&lt;td align="right"&gt;3422&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;address&lt;/td&gt;&lt;td align="right"&gt;3390&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;product&lt;/td&gt;&lt;td align="right"&gt;3384&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;andriy&lt;/td&gt;&lt;td align="right"&gt;3383&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;picklist&lt;/td&gt;&lt;td align="right"&gt;3352&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;isv&lt;/td&gt;&lt;td align="right"&gt;3338&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;cannot&lt;/td&gt;&lt;td align="right"&gt;3291&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;customer&lt;/td&gt;&lt;td align="right"&gt;3284&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;settings&lt;/td&gt;&lt;td align="right"&gt;3271&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;tostring&lt;/td&gt;&lt;td align="right"&gt;3263&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;config&lt;/td&gt;&lt;td align="right"&gt;3262&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;entityname&lt;/td&gt;&lt;td align="right"&gt;3241&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;tool&lt;/td&gt;&lt;td align="right"&gt;3231&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;security&lt;/td&gt;&lt;td align="right"&gt;3223&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;iframe&lt;/td&gt;&lt;td align="right"&gt;3211&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;leon&lt;/td&gt;&lt;td align="right"&gt;3199&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;related&lt;/td&gt;&lt;td align="right"&gt;3184&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;status&lt;/td&gt;&lt;td align="right"&gt;3170&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;filter&lt;/td&gt;&lt;td align="right"&gt;3161&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;xmlns&lt;/td&gt;&lt;td align="right"&gt;3158&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;delete&lt;/td&gt;&lt;td align="right"&gt;3120&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;And finally... my last name "Dutcher" appears 129 in the CRM forums. And I only found one swear word. The guy was having trouble with the flippin' Async service, but he didn't say flippin'.&lt;/p&gt;&lt;p&gt;-Tim&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-8600480737019179739?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/8600480737019179739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2010/01/microsofts-crm-forums-analyzed.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/8600480737019179739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/8600480737019179739'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2010/01/microsofts-crm-forums-analyzed.html' title='Microsoft&apos;s CRM forums... analyzed'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-6569080342842308570</id><published>2009-12-15T15:22:00.000-08:00</published><updated>2009-12-15T17:26:06.102-08:00</updated><title type='text'>A short list of Dynamics CRM gurus</title><content type='html'>As promised, here's the list of Microsoft Dynamics CRM blogs and sites I keep a close watch on. I'm sure I've been missing out on some great sites... so when I discover them I'll add them to the list. (Last updated December 15, 2009)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Microsoft Dynamics CRM blogs and sites:&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ayazahmad.wordpress.com/"&gt;http://ayazahmad.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://billoncrm.blogspot.com/"&gt;http://billoncrm.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.customereffective.com/blog/"&gt;http://blog.customereffective.com/blog/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.powerobjects.com/"&gt;http://blog.powerobjects.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.sonomapartners.com/"&gt;http://blog.sonomapartners.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.streamsol.com/"&gt;http://blog.streamsol.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.xrm.com/"&gt;http://blog.xrm.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.infinite-x.net/"&gt;http://blogs.infinite-x.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.javista.com/"&gt;http://blogs.javista.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/crm/"&gt;http://blogs.msdn.com/crm/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/jim_glass/default.aspx"&gt;http://blogs.msdn.com/jim_glass/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/jonasd/"&gt;http://blogs.msdn.com/jonasd/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/joris_kalz/default.aspx"&gt;http://blogs.msdn.com/joris_kalz/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/MidAtlanticCRM/"&gt;http://blogs.msdn.com/MidAtlanticCRM/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/mscrmfreak/"&gt;http://blogs.msdn.com/mscrmfreak/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/ukcrm/default.aspx"&gt;http://blogs.msdn.com/ukcrm/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://channel9.msdn.com/Wiki/DynamicsCRM/HomePage/"&gt;http://channel9.msdn.com/Wiki/DynamicsCRM/HomePage/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.msdn.microsoft.com/Project/ProjectDirectory.aspx?ProjectSearchText=CRM"&gt;http://code.msdn.microsoft.com/Project/ProjectDirectory.aspx?ProjectSearchText=CRM&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crm.dynamics.com/"&gt;http://crm.dynamics.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crm.davidyack.com/"&gt;http://crm.davidyack.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crm.georged.id.au/"&gt;http://crm.georged.id.au/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crm.ittoolbox.com/blogs/news-and-views/"&gt;http://crm.ittoolbox.com/blogs/news-and-views/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crmblog.saratogaus.com/"&gt;http://crmblog.saratogaus.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crmdynamo.com/"&gt;http://crmdynamo.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crmmusings.blogspot.com/"&gt;http://crmmusings.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crmrocks.net/"&gt;http://crmrocks.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crmscape.blogspot.com/"&gt;http://crmscape.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://demiliani.com/blog/Default.aspx"&gt;http://demiliani.com/blog/Default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dmcrm.blogspot.com/"&gt;http://dmcrm.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://dynamicscrmblog.com/"&gt;http://dynamicscrmblog.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Microsoft_Dynamics_CRM"&gt;http://en.wikipedia.org/wiki/Microsoft_Dynamics_CRM&lt;/a&gt;&lt;br /&gt;&lt;a href="http://guyriddle.spaces.live.com/"&gt;http://guyriddle.spaces.live.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://icu-mscrm.blogspot.com/"&gt;http://icu-mscrm.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jianwang.blogspot.com/"&gt;http://jianwang.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://marioraunig.blogspot.com/"&gt;http://marioraunig.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://microsoft-crm-au.spaces.live.com/blog/"&gt;http://microsoft-crm-au.spaces.live.com/blog/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://microsoft-crm.spaces.live.com/?b502dc08"&gt;http://microsoft-crm.spaces.live.com/?b502dc08&lt;/a&gt;&lt;br /&gt;&lt;a href="http://microsoft-dynamics-crm-4-live-titan.blogspot.com/"&gt;http://microsoft-dynamics-crm-4-live-titan.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://microsoftdynamicscrm.blogspot.com/"&gt;http://microsoftdynamicscrm.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mscrm-developer.blogspot.com/"&gt;http://mscrm-developer.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mscrm4ever.blogspot.com/"&gt;http://mscrm4ever.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mscrmrocks.blogspot.com/"&gt;http://mscrmrocks.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mscrmtools.blogspot.com/"&gt;http://mscrmtools.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mscrmuk.blogspot.com/"&gt;http://mscrmuk.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdynamicscrm-e.blogspot.com/"&gt;http://msdynamicscrm-e.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://navintmicrosoftcrm.blogspot.com/"&gt;http://navintmicrosoftcrm.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rc.crm.dynamics.com/rc/regcont/en_us/opdefault.aspx"&gt;http://rc.crm.dynamics.com/rc/regcont/en_us/opdefault.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ronaldlemmen.blogspot.com/"&gt;http://ronaldlemmen.blogspot.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://social.microsoft.com/Forums/en-US/crm/threads"&gt;http://social.microsoft.com/Forums/en-US/crm/threads&lt;/a&gt;&lt;br /&gt;&lt;a href="http://social.microsoft.com/Forums/en-US/crmdeployment/threads"&gt;http://social.microsoft.com/Forums/en-US/crmdeployment/threads&lt;/a&gt;&lt;br /&gt;&lt;a href="http://social.microsoft.com/Forums/en-US/crmdevelopment/threads"&gt;http://social.microsoft.com/Forums/en-US/crmdevelopment/threads&lt;/a&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/ph/12976"&gt;http://support.microsoft.com/ph/12976&lt;/a&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/search/default.aspx?mode=a&amp;query=CRM+4.0&amp;spid=global&amp;catalog=LCID"&gt;http://support.microsoft.com/search/default.aspx?mode=a&amp;query=CRM+4.0&amp;spid=global&amp;catalog=LCID&lt;/a&gt;&lt;br /&gt;&lt;a href="http://thecrmarchitect.com/"&gt;http://thecrmarchitect.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://umarkhan.wordpress.com/"&gt;http://umarkhan.wordpress.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.altriva.com/AltrivaBlog/tabid/61/Default.aspx"&gt;http://www.altriva.com/AltrivaBlog/tabid/61/Default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.arkesystems.com/blog/"&gt;http://www.arkesystems.com/blog/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://consulting.ascentium.com/blog/crm/Default.aspx"&gt;http://consulting.ascentium.com/blog/crm/Default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.askcrm.com/"&gt;http://www.askcrm.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.changingera.com/category/crm/"&gt;http://www.changingera.com/category/crm/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=crm"&gt;http://www.codeplex.com/Project/ProjectDirectory.aspx?ProjectSearchText=crm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.cornerstonesls.com/Blogs/tabid/73/Default.aspx"&gt;http://www.cornerstonesls.com/Blogs/tabid/73/Default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.crmlady.com/"&gt;http://www.crmlady.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.crmwatcher.com/"&gt;http://www.crmwatcher.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.dynamicscare.com/blog/"&gt;http://www.dynamicscare.com/blog/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.friendlycrmonster.com/"&gt;http://www.friendlycrmonster.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ibisinccrm.com/"&gt;http://www.ibisinccrm.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.microsoft.com/dynamics/crm/default.mspx"&gt;http://www.microsoft.com/dynamics/crm/default.mspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.orbitone.com/en/blog/default.aspx"&gt;http://www.orbitone.com/en/blog/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.stunnware.com/crm2/"&gt;http://www.stunnware.com/crm2/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.tekoppele.com/blog/default.aspx"&gt;http://www.tekoppele.com/blog/default.aspx&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.unitek.com/training/microsoft/crm/blog/"&gt;http://www.unitek.com/training/microsoft/crm/blog/&lt;/a&gt;&lt;br /&gt;&lt;a href="https://community.dynamics.com/crm/home.aspx"&gt;https://community.dynamics.com/crm/home.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-6569080342842308570?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/6569080342842308570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/short-list-of-dynamics-crm-gurus.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/6569080342842308570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/6569080342842308570'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/short-list-of-dynamics-crm-gurus.html' title='A short list of Dynamics CRM gurus'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-2912253639775548949</id><published>2009-11-18T17:20:00.000-08:00</published><updated>2009-11-18T18:40:15.996-08:00</updated><title type='text'>Formatting output from CrmDiagTool4</title><content type='html'>I'm sure you know about the utility that will interrogate a CRM server and export CRM configuration details such as server details, Registry keys, CRM website details, TCP/IP, Active Directory settings, etc. The utility goes by the name "&lt;a href="http://blogs.msdn.com/benlec/archive/2008/03/04/crmdiagtool4-for-microsoft-crm-4-0-has-been-released.aspx"&gt;CrmDiagTool4&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;To make the output of the utility more readable, I put together this short VBA script that you can run in Word 2003 or 2007.&lt;br /&gt;&lt;br /&gt;First, run CrmDiagTool4.exe and export the system report. Then copy and paste the resulting report text into Word. You'll probably want to set the page orientation to Landscape, the margins to .25-inch, and the font for all text to Courier New 8pt.&lt;br /&gt;&lt;br /&gt;Next, paste this script into the VBA editor and run it. It simply changes the formatting of the major report sections (lines beginning and ending with several dashes) to the Heading 1 format.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;br /&gt;Sub FixDiagToolOutput()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim headingText As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim range As range&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For Each para In ActiveDocument.Paragraphs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If Mid(para.range.Text, 1, 10) = "----------" Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;headingText = Replace(para.range.Text, "-", "")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set range = para.range&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range.Text = headingText&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;range.Style = ActiveDocument.Styles("Heading 1")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next para&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox "Done"&lt;br /&gt;End Sub&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-2912253639775548949?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/2912253639775548949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/11/formatting-output-from-crmdiagtool4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2912253639775548949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/2912253639775548949'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/11/formatting-output-from-crmdiagtool4.html' title='Formatting output from CrmDiagTool4'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-7613223242095381846</id><published>2009-10-27T10:55:00.000-07:00</published><updated>2009-10-27T11:17:04.918-07:00</updated><title type='text'>CRM documentation tool: Fixing scripts</title><content type='html'>In a previous post I mentioned that the &lt;a href="http://crm4documentation.codeplex.com/"&gt;CRM 4.0 Documentation tool&lt;/a&gt; can export scripts from Dynamics CRM forms and attributes. One of the problems with the tool, though, is that it copies the JScript code verbatim from the exported CRM customizations xml file into Excel, complete with escaped greater-than and less-than characters. For example, a less-than character will appear in the script as &lt;span style="font-family:courier new;"&gt;&amp;amp;#60;&lt;/span&gt; instead of "&lt;span style="font-family:courier new;"&gt;&lt;&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;To fix the script code once it's in Excel, search and replace the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;Replace &amp;amp;#60; with &lt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Replace &amp;amp;#62; with &gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/span&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-7613223242095381846?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/7613223242095381846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/10/crm-documentation-tool-fixing-scripts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7613223242095381846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7613223242095381846'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/10/crm-documentation-tool-fixing-scripts.html' title='CRM documentation tool: Fixing scripts'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-7511693145686487153</id><published>2009-08-26T19:17:00.000-07:00</published><updated>2009-08-26T19:27:36.233-07:00</updated><title type='text'>NullReferenceException: Microsoft.Crm.ObjectModel.OrganizationUIService.LabelLoaderPublished.LoadMetadataLabel</title><content type='html'>&lt;strong&gt;WARNING&lt;/strong&gt;: Back up your CRM database if you decide to follow the steps below!&lt;br /&gt;&lt;br /&gt;If you see the following error in the CRM trace/log file (as I did today on a VPC… for no apparent reason):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;&lt;span style="font-size:85%;"&gt;Stack Trace Info: [NullReferenceException: Object reference not set to an instance of an object.]&lt;br /&gt;at Microsoft.Crm.ObjectModel.OrganizationUIService.LabelLoaderPublished.LoadMetadataLabel(Int32 entityType, String attributeName, ExecutionContext context)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The problem might be that there’s an old attribute being referenced in the entity’s form. To determine this and remove the bad form &lt;row&gt; &lt;row&gt;from the form's xml definition, open the OrganizationUIBase table and look for the object type id for the problem entity (e.g., 10016). Copy the FormXml to notepad and save the file with an xml extension. Open the file in IE or other xml viewer/editor and look for an attribute that no longer exists. In notepad or in your xml editor, remove the problematic &lt;row&gt; node, copy the new xml, and paste it into the FormXml in the OrganizationUIBase table. Restart IIS and then see if you can now export, publish, or do other work with the entity.&lt;br /&gt;&lt;br /&gt;Of course, any direct change to the CRM database is not supported by Microsoft and should only be done as a last resort. Since I was working on a non-production VPC I went ahead and made the change... and it did the trick. Again, I have no idea how the problem occurred. The problem entity was fine the last time I loaded the VPC and today I couldn't publish, remove attributes, or export. Strange, very strange.&lt;br /&gt;&lt;br /&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-7511693145686487153?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/7511693145686487153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/08/nullreferenceexception.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7511693145686487153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7511693145686487153'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/08/nullreferenceexception.html' title='NullReferenceException: Microsoft.Crm.ObjectModel.OrganizationUIService.LabelLoaderPublished.LoadMetadataLabel'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-598872865225776605</id><published>2009-08-12T15:30:00.000-07:00</published><updated>2009-08-12T15:57:25.914-07:00</updated><title type='text'>Bingdown</title><content type='html'>I coined a new term today: &lt;strong&gt;Bingdown&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Definition: A depressed state one reaches when Bing doesn't deliver what HAS to be out there.&lt;br /&gt;&lt;br /&gt;Today's Bingdown: azure "dynamics crm" asp.net authentication token site:microsoft.com -faq&lt;br /&gt;&lt;br /&gt;Another Bingdown (well, a partial Bingdown): "how to lose weight while programming"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-598872865225776605?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/598872865225776605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/08/bingdown.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/598872865225776605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/598872865225776605'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/08/bingdown.html' title='Bingdown'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-1319613447861275666</id><published>2009-08-09T22:53:00.000-07:00</published><updated>2009-10-28T10:30:56.579-07:00</updated><title type='text'>Enhancing the Dynamics CRM 4.0 Documentation Generator</title><content type='html'>Like me, &lt;a href="http://dynamicscrmblog.com/"&gt;Phil Edry&lt;/a&gt; (also with &lt;a href="http://www.altriva.com/"&gt;Altriva Solutions&lt;/a&gt;) is constantly on the lookout for Dynamics CRM development tools, blog posts, etc. that help us to become more productive for our clients. And we return the favor to the community by blogging, sharing code, and participating on forums.&lt;br /&gt;&lt;br /&gt;Today, I want to share some code. But first you need to know about the gem of a CRM utility that Phil discovered last week on CodePlex: &lt;a href="http://crm4documentation.codeplex.com/"&gt;Microsoft Dynamics CRM 4.0 Documentation Generator&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After the 2 minute install of this tool and 2 minute export of your CRM application's customizations (XML), you can produce (in Excel) documentation that provides a list of all attributes on each form, the script of all objects on the forms, picklist values, and more. This can save hours in documentation time for anyone responsible for the configuration or maintenance of a Dynamics CRM 4.0 system.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_h9ZquLCH7cY/Sn_FTZCmgNI/AAAAAAAAADc/XroO5x1v5BY/s1600-h/crm_script_lines.png"&gt;&lt;img style="WIDTH: 400px; HEIGHT: 70px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5368226217778905298" border="0" alt="" src="http://1.bp.blogspot.com/_h9ZquLCH7cY/Sn_FTZCmgNI/AAAAAAAAADc/XroO5x1v5BY/s400/crm_script_lines.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the benefits of having this customization information in Excel is that it opens up the possibility to write VBA code to further analyze the information. That's what I've done with the code shown below.&lt;br /&gt;&lt;br /&gt;This VBA code loops through each entity (listed on the Form worksheets) and for each attribute it determines whether the attribute is referenced in any of the JScript code on the form or any of the attribute onChange events. When the attribute is identified in a code line, it places the code line number(s) on the attribute's detail row. For many Dynamics CRM installations, this could save additional hours of work.&lt;br /&gt;&lt;br /&gt;First, run the Documentation Generator tool. Then, open up the Excel VBA code editor, double-click the ThisWorkbook object, paste this code and click Run. Within 10 seconds you'll have additional details in your Excel entity/attribute report.&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:80;"&gt;&lt;span style="font-size:80;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:78%;"&gt;Sub IdentifyFieldsReferencedInScript()&lt;br /&gt;Dim columnOrdinalForScriptLineNumbers As Integer&lt;br /&gt;Dim formWorksheetName As String&lt;br /&gt;Dim formWorksheetRowNumber As Integer&lt;br /&gt;Dim formWorksheetAttribName As String&lt;br /&gt;Dim scriptWorksheetName As String&lt;br /&gt;Dim scriptWorksheet As Worksheet&lt;br /&gt;Dim scriptWorksheetRowNumber As Integer&lt;br /&gt;Dim scriptWorksheetBlankLineCounter As Integer&lt;br /&gt;Dim scriptLineNumbersForAttribute As String&lt;br /&gt;Dim scriptText As String&lt;br /&gt;Dim currentEntityName As String&lt;br /&gt;&lt;br /&gt;Application.ScreenUpdating = False&lt;br /&gt;&lt;br /&gt;columnOrdinalForScriptLineNumbers = 6&lt;br /&gt;&lt;br /&gt;'* Loop through each worksheet. Process worksheets that end with "-Form".&lt;br /&gt;For Each xlSheet In ActiveWorkbook.Worksheets&lt;br /&gt;If Right(xlSheet.Name, 5) = "-Form" Then&lt;br /&gt;&lt;br /&gt;formWorksheetName = xlSheet.Name&lt;br /&gt;currentEntityName = Left(formWorksheetName, (Len(formWorksheetName) - 5))&lt;br /&gt;scriptWorksheetName = currentEntityName &amp;amp; "-Script"&lt;br /&gt;&lt;br /&gt;'* Check for existence of a Script worksheet for the current entity.&lt;br /&gt;On Error Resume Next&lt;br /&gt;Err.Clear&lt;br /&gt;Set scriptWorksheet = ActiveWorkbook.Worksheets(scriptWorksheetName)&lt;br /&gt;If Err.Number &lt;&gt; 0 Then&lt;br /&gt;MsgBox "At least one script worksheet is missing. Execution halted."&lt;br /&gt;Exit For&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;formWorksheetRowNumber = 5&lt;br /&gt;scriptLineNumbersForAttribute = Empty&lt;br /&gt;&lt;br /&gt;'* Loop through each attribute on the current form&lt;br /&gt;Do&lt;br /&gt;formWorksheetAttribName = xlSheet.Cells(formWorksheetRowNumber, 1)&lt;br /&gt;If formWorksheetAttribName &lt;&gt; "Field" And Left(formWorksheetAttribName, 7) &lt;&gt; "Section" And formWorksheetAttribName &lt;&gt; Empty Then&lt;br /&gt;scriptWorksheetRowNumber = 1&lt;br /&gt;scriptLineNumbersForAttribute = Empty&lt;br /&gt;scriptWorksheetBlankLineCounter = 0&lt;br /&gt;&lt;br /&gt;Do&lt;br /&gt;scriptText = scriptWorksheet.Cells(scriptWorksheetRowNumber, 6)&lt;br /&gt;If InStr(1, scriptText, formWorksheetAttribName) Then&lt;br /&gt;If scriptLineNumbersForAttribute = Empty Then&lt;br /&gt;scriptLineNumbersForAttribute = CStr(scriptWorksheetRowNumber)&lt;br /&gt;Else&lt;br /&gt;scriptLineNumbersForAttribute = scriptLineNumbersForAttribute &amp;amp; "" &amp;amp; CStr(scriptWorksheetRowNumber)&lt;br /&gt;End If&lt;br /&gt;Else&lt;br /&gt;If scriptText = Empty Then&lt;br /&gt;scriptWorksheetBlankLineCounter = scriptWorksheetBlankLineCounter + 1&lt;br /&gt;Else&lt;br /&gt;scriptWorksheetBlankLineCounter = 0&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;scriptWorksheetRowNumber = scriptWorksheetRowNumber + 1&lt;br /&gt;Loop While scriptWorksheetBlankLineCounter &lt; formworksheetrownumber =" formWorksheetRowNumber"&gt; Empty&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;Next xlSheet&lt;br /&gt;&lt;br /&gt;Application.ScreenUpdating = True&lt;br /&gt;&lt;br /&gt;MsgBox "Process complete."&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;There's lots more that can be built on top of the documentation generator utility. For example, VBA can be used to build a table of contents for easier access to the worksheets. Also, for a given attribute, you could run dynamic SQL queries to determine, for example, how often the attribute is populated (% utilization) and how often picklist options are selected. Or, through CRM API calls, it would be useful to know the names of attributes that are not on the entity's form -- this would help to provide a total picture of each entity.&lt;br /&gt;&lt;br /&gt;If I build more functionality on top of the documentation tool's output I'll be sure to post the details here. Meanwhile, let me know if you have other ideas for how to make this tool's output more useful. It's great as it is, but there's definitely potential to make it even better.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;-Tim &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-1319613447861275666?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/1319613447861275666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/08/like-me-phil-edry-also-with-altriva.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1319613447861275666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1319613447861275666'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/08/like-me-phil-edry-also-with-altriva.html' title='Enhancing the Dynamics CRM 4.0 Documentation Generator'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_h9ZquLCH7cY/Sn_FTZCmgNI/AAAAAAAAADc/XroO5x1v5BY/s72-c/crm_script_lines.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-7241918238217016628</id><published>2009-07-29T17:49:00.000-07:00</published><updated>2009-07-29T17:55:25.261-07:00</updated><title type='text'>Custom calendar in CRM UI</title><content type='html'>While working on a project for a client at &lt;a href="http://www.altriva.com" target="_blank"&gt;Altriva&lt;/a&gt;, a need emerged for a custom event calendar within the CRM UI. Using a pre-built calendar along with some custom code to store events (maintained in CRM) into an XML file, I was able to get this functionality in place pretty quickly. &lt;br /&gt;&lt;br /&gt;Please read more about the options for implementing a custom calendar in Dynamics CRM 4.0 in the &lt;a href="http://www.altriva.com/AltrivaBlog/PostID/15.aspx" target="_blank"&gt;Altriva Blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-7241918238217016628?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/7241918238217016628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/07/custom-calendar-in-crm-ui.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7241918238217016628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7241918238217016628'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/07/custom-calendar-in-crm-ui.html' title='Custom calendar in CRM UI'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-3408755787608788524</id><published>2009-03-17T12:00:00.000-07:00</published><updated>2009-03-17T12:18:18.446-07:00</updated><title type='text'>MSCRMKeyGenerator - Expired key</title><content type='html'>Yesterday I mentioned that I received a working backup of customer's CRM 4.0 system in a VPC. This morning, when attempting to load the CRM Web UI I was confronted with an error, which led to this information in the Application Event Log:&lt;br /&gt;&lt;br /&gt;Source: MSCRMKeyGenerator&lt;br /&gt;Event ID: 18949&lt;br /&gt;Error (partial): Current active key (KeyType : CrmWRPCTokenKey) is expired.  This can indicate that a key is not being regenerated properly.&lt;br /&gt;&lt;br /&gt;The most common fix for this problem is to restart the Microsoft CRM Asynchronous Processing Service but the service wouldn't start for me. Phil Edry, my esteemed colleague here at Altriva, said "try Rollup 2... that might fix it".&lt;br /&gt;&lt;br /&gt;I owe him a beer... it worked.&lt;br /&gt;&lt;br /&gt;Exactly why the "active key" expired and what Rollup 2 did to fix it still remains a mystery to me, but I have too much work to do to investigate it now. If you have some more details on this, though, please let us all know.  Thanks,   -TD&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-3408755787608788524?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/3408755787608788524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/03/mscrmkeygenerator-expired-key.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3408755787608788524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3408755787608788524'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/03/mscrmkeygenerator-expired-key.html' title='MSCRMKeyGenerator - Expired key'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-4249270229184092329</id><published>2009-03-16T15:30:00.000-07:00</published><updated>2009-03-16T15:41:44.935-07:00</updated><title type='text'>Plugin Registration Tool FileNotFoundException</title><content type='html'>If you run into this error when attempting to register a plug-in...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'PluginRegistration, Version=2.2.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.   at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark&amp;amp; stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;... you might read elsewhere that you need to copy microsoft.crm.sdk.dll and microsoft.crm.sdktypeproxy.dll to the same folder as the Plugin Registration Tool's executable. Although that might work for you, it didn't work for me today. I'm working on a VPC with a customer's instance of CRM 4.0 restored onto it and attempting to register a plug-in led to the unhandled exception. (I tried version 2.1 and 2.2 of the registration tool.)&lt;br /&gt;&lt;br /&gt;The "fix" was to load the PluginRegistrationTool.sln solution (Visual Studio 2005) and recompile. The application then allowed me to register the plug-in. It apparently found itself!?  :-)&lt;br /&gt;&lt;br /&gt;-Tim&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-4249270229184092329?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/4249270229184092329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/03/plugin-registration-tool.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4249270229184092329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4249270229184092329'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/03/plugin-registration-tool.html' title='Plugin Registration Tool FileNotFoundException'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-5182241146217765611</id><published>2009-01-12T17:55:00.000-08:00</published><updated>2009-07-06T08:59:09.732-07:00</updated><title type='text'>Infragistics WebGrid and CRM 4.0</title><content type='html'>&lt;div&gt;A common request I hear from our clients is for inline editing of data within grid views in CRM. Many of them would love to see this functionality in Dynamics CRM 5.0. Occasionally, though, one of our clients has a strong enough need for this capability (e.g., for rapid data entry, Excel-like functionality, etc.) and asks us to provide it.&lt;br /&gt;&lt;br /&gt;On a recent project, I worked with a company to replace an Excel-based data collection process (where Excel files are distributed, collected, and consolidated) with a web-based application. The goal was to provide the same general capabilities provided by Excel (ease of data entry, grid-based interface, calculated fields, drop-down picklists, data validation, etc.) but provide it over the web and connect the application with the company's Dynamics CRM 4.0 system. And, of course, the page couldn't post back to the server after entering data in a cell so the use of Ajax was mandatory.&lt;br /&gt;&lt;br /&gt;Our client had already invested in ASP.NET components from &lt;a href="http://www.infragistics.com/default.aspx"&gt;Infragistics&lt;/a&gt; for other projects so I downloaded the components and took a close look at the capabilities, particularly the Ajax, grid, and inline editing features. Fortunately, I became convinced that the components would meet the needs of the project very well so I proceeded with the application's design, estimates, and prototypes.&lt;br /&gt;&lt;br /&gt;(Infragistics offers a 30-day trial of their components, so you can give them a test drive before forking over the thousand bucks.)&lt;br /&gt;&lt;br /&gt;Downloading and installing the ASP.NET controls was simple. Being new to Infragistics components, though, I was initially tripped-up by their use of three names for their two grid products. Here's the deal: the "UltraWebGrid" and the "WebGrid" are the same product. This isn't at all obvious when first looking at the documentation. The "DataGrid" is the latest grid component, but we didn't use it due to its lack of support for hierarchical data (e.g., ADO.NET DataSet with multiple related DataTables).&lt;br /&gt;&lt;br /&gt;To get started with the WebGrid, simple drag it onto the web form from the NetAdvantage 8.3 Web toolbox section in Visual Studio (we used Visual Studio 2005).&lt;br /&gt;&lt;br /&gt;The easy way to get data to appear in the grid is to bind the grid to a data source. For example, you can use Visual Studio to create a DataSet that uses the ADO.NET SqlDataAdapter to query one or more CRM Filtered Views. The WebGrid provides a style editor that you can use to set inline editing rules, column widths, fonts, alternating row coloring, etc.&lt;br /&gt;&lt;br /&gt;Connecting the WebGrid to a SQL query is fine for display purposes, but you can't (or shouldn't) write data back to CRM directly to the CRM database tables. So you won't get the "quick-and-dirty" benefit of binding the WebGrid to CRM because the grid won't be able to dynamically update the database when inline changes are made.&lt;br /&gt;&lt;br /&gt;Although I had to write a lot of code to get data into the grid and write updates back to CRM, it was surprising easy to get all the parts working. The WebGrid provides a rich object model that allows you to configure and access all parts of the grid object, from the height, width, and overall style of the grid down to what should happen after someone types data into a cell.&lt;br /&gt;&lt;br /&gt;Here's a screenshot of the application. I had to keep it small to protect the data (I'll try to upload a bigger data-wiped version later) but I mainly wanted to show the overall appearance of the grid and provide an example of the inline popup WebCombo control.&lt;br /&gt;&lt;br /&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 320px; FLOAT: left; HEIGHT: 231px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5355377064310567890" border="0" alt="" src="http://2.bp.blogspot.com/_h9ZquLCH7cY/SlIfEOSBc9I/AAAAAAAAADM/i0sHXj13CyI/s320/infragistics.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Here's a quick rundown of the architecture for this application:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Upon application startup, I gather the default filter criteria from the filter options (e.g., date range, owner, etc.). The Infragistics date picker control came in handy for date filtering. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;I then pass the filter conditions to a method that dynamically builds the SQL WHERE clause for the main grid data. The data is stored in related DataTable objects. The WebGrid supports hierarchical datasets, so once you've populated the DataSet you can bind it to the grid and it takes care of rending parent/child rows. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Once I have the data, I call a custom method to configure the grid columns. This involves setting the type of control for each column. Essentially, you can tell the grid whether a cell should provide a text field (with optional masking/formatting), a dropdown box, a WebCombo control, date picker, image, calculated value, etc. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;With the data in the DataSet and all columns configured, I then bind the data to the WebGrid. That gets the data on the screen, but that's only the beginning. The next part of the project involved writing a lot of JavaScript to handle the various actions that can happen in the grid. For example, when the user clicks into a cell, I sometimes want an Infragistics WebCombo to appear to allow the user to select from a popup grid. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Saving data from the WebGrid back to CRM involves 1) Creating a Save button (turn-off the auto-postback functionality), 2) When Save is clicked, construct a DynamicEntity (it helps to have some wrapper/helper code for this part to build the SOAP) and set the name of the target attribute and its value, and 3) Use XmlHttpRequest to call the CRM Web Service with either a Create, Update, or Delete command in the SOAP XML.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;One of the biggest challenges I faced on the project was using Ajax to dynamically filter the contents that appear in the Infragistics WebCombo objects used in the grid. For example, when the user selects an option on a parent row, I needed to filter the available options in the WebCombo for a cell that resides on a child row. The way I did this was 1) Create a JavaScript event handler for when the user clicks into a cell that needs a filtered combobox, 2) Formulate a CRM SDK query and use Ajax to get back a collection of CRM entitiese, 3) Clear the contents of the WebCombo that's linked to the clicked cell, and 4) Use the Infragistics WebCombo API to dynamically create option rows.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Infragistics provides an abundance of &lt;a href="http://samples.infragistics.com/2008.3/WebFeatureBrowser/Default.aspx"&gt;online samples&lt;/a&gt;, knowledge base articles, and sample applications to help you ramp-up on their controls.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;All in all, the Infragistics ASP.NET controls provided us with a great collection of tools to provide an Excel-like interface for our client. They can now update CRM data from a web grid, which provides them with the rapid data-entry interface that they needed.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-5182241146217765611?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/5182241146217765611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/01/infragistics-webgrid-and-crm-40.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/5182241146217765611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/5182241146217765611'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/01/infragistics-webgrid-and-crm-40.html' title='Infragistics WebGrid and CRM 4.0'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_h9ZquLCH7cY/SlIfEOSBc9I/AAAAAAAAADM/i0sHXj13CyI/s72-c/infragistics.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-3251254918522115923</id><published>2009-01-12T17:16:00.000-08:00</published><updated>2009-01-12T17:53:38.176-08:00</updated><title type='text'>CRM 4.0 Development Tools</title><content type='html'>Here's a list of &lt;em&gt;freeware&lt;/em&gt; development tools for Dynamics CRM 4.0 that you might find useful. Thanks to all of the authors and publishers of these apps!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/benlec/archive/2008/03/04/crmdiagtool4-for-microsoft-crm-4-0-has-been-released.aspx"&gt;CRM 4.0 Diagnostics Tool&lt;/a&gt; - Exports server and CRM details to file. It's a good idea to run this periodically and keep backups to help with system troubleshooting.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.stunnware.com/crm2/topic.aspx?id=FindingData6"&gt;CRM 4.0 FetchXmlWizard (stunnware)&lt;/a&gt; - Helps build source code to call the CRM SDK. This was written for 3.0 but it still (mostly) works for 4.0.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.msdn.microsoft.com/mscrm4formreporter"&gt;CRM 4.0 Form (Entity &amp;amp; Attribute) Reporter&lt;/a&gt; - Builds a Word document from exported CRM customizations.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/joris_kalz/archive/2008/08/04/microsoft-dynamics-crm-jscript-export-tool.aspx"&gt;CRM 4.0 JavaScript Export Tool&lt;/a&gt; - Exports JavaScript (JScript) from forms. This is especially helpful for keeping track of code changes in a source control system.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.stunnware.com/crm2/topic.aspx?id=MetadataViewer2"&gt;CRM 4.0 Metadata Viewer (stunnware)&lt;/a&gt; - Browse CRM metadata including entities, attributes, data types, relationships, etc.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.stunnware.com/crm2/topic.aspx?id=Framework9"&gt;CRM 4.0 Trace Log Viewer (stunnware)&lt;/a&gt; - Helps with viewing CRM trace log files.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Please &lt;a href="mailto:tdutch@gmail.com"&gt;let me know&lt;/a&gt; if there's a tool you've found useful that's not on this list. Thanks!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-3251254918522115923?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/3251254918522115923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2009/01/crm-40-development-tools.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3251254918522115923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3251254918522115923'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2009/01/crm-40-development-tools.html' title='CRM 4.0 Development Tools'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-7110807349109258174</id><published>2008-12-31T10:26:00.000-08:00</published><updated>2008-12-31T12:01:06.213-08:00</updated><title type='text'>Success with Microsoft Dynamics CRM 4.0</title><content type='html'>&lt;a href="http://www.altriva.com/"&gt;Altriva&lt;/a&gt; has kept me very busy since joining them in October '08. My first project for them was a CRM 4.0 new deployment for a large manufacturer in the Seattle area. There are 12 users up and running on the system now and they're enjoying the increased information and productivity the application provides.&lt;br /&gt;&lt;br /&gt;The group that I worked with are responsible for providing support to their worldwide dealer network. They can now access information that was previously difficult to come by such as each dealer's employee hierarchy, current and past service cases, a record of all correspondence, inventory information, and a knowledge base.&lt;br /&gt;&lt;br /&gt;Besides helping to build requirements, installing and configuring CRM, and working with IT on architecture decisions, I also had fun (really!) working with SQL Server Integration Services (SSIS) to feed the company's master dealer information into CRM. This integration (well, ETL process actually) is scheduled to run each night using SQL Agent. The SSIS package queries from a SQL 2000 database and calls the CRM 4.0 Web Service to insert or update dealer information in CRM. The &lt;a href="https://community.dynamics.com/blogs/cscrmblog/comments/3407.aspx?wa=wsignin1.0"&gt;article written by CRM MVP Darren Liu&lt;/a&gt; helped a lot to put this integration together.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_h9ZquLCH7cY/SVvKoawupuI/AAAAAAAAACg/wRXl4amAk4o/s1600-h/success.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286041383376692962" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 128px; CURSOR: hand; HEIGHT: 168px; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_h9ZquLCH7cY/SVvKoawupuI/AAAAAAAAACg/wRXl4amAk4o/s400/success.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;While I was working on that project, there were three people around the office that were diligently working to finish the book &lt;a href="http://www.amazon.com/Success-Microsoft-Dynamics-CRM-4-0/dp/1430216042"&gt;Success with Microsoft Dynamics CRM 4.0&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;After working with several others in the past who have written a technical book (or started one) I've come to recognize that it takes an enormous amount of discipline, depth of knowledge, caffeine, understanding family members, and ability to get by with little sleep to plan, write, and finalize the content for a book like this.  Watching these otherwise friendly clean-cut guys turn into disheveled and mumbling animals was not pretty to see, but they're back to normal again and we'll all be more successful with our CRM deployments because of their insanity.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-7110807349109258174?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/7110807349109258174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/12/success-with-microsoft-dynamics-crm-40.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7110807349109258174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/7110807349109258174'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/12/success-with-microsoft-dynamics-crm-40.html' title='Success with Microsoft Dynamics CRM 4.0'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_h9ZquLCH7cY/SVvKoawupuI/AAAAAAAAACg/wRXl4amAk4o/s72-c/success.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-3944477213762794833</id><published>2008-10-01T12:53:00.000-07:00</published><updated>2008-10-01T13:49:11.035-07:00</updated><title type='text'>Dynamics CRM 4.0 Quick Reference</title><content type='html'>&lt;div&gt;When I've been in CRM design meetings, writing code, working with a new client, or helping someone ramp-up on CRM 4.0, I always thought it would be helpful to have a "CRM 4.0 Quick Reference" handy. I've had to rely on the reference between my ears, which isn't always reliable.&lt;br /&gt;&lt;br /&gt;So I got up early a few days last week and put one together.&lt;br /&gt;&lt;br /&gt;Now, I realize the content I find most valuable in a &lt;a href="http://sites.google.com/site/tdutch/Home/MicrosoftDynamicsCrm4QuickReference.pdf"&gt;Dynamics CRM 4.0 Quick Reference&lt;/a&gt; is not necessarily the content you would've chosen. So, if you send an e-mail to me at &lt;a href="mailto:tdutch@gmail.com"&gt;tdutch@gmail.com&lt;/a&gt; I'll send the Word version of the document to you. You can then start with what I've done and tailor it to meet your needs. Of course, it would be great if you share your version with the CRM community as well!&lt;br /&gt;&lt;br /&gt;Here's a list of the major sections I've chosen for version 1.0 of the quick reference:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Page 1&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;What's New in 4.0 ("Titan")&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Selling Points&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Major Product Components&lt;/li&gt;&lt;br /&gt;&lt;li&gt;CRM 4.0 Server Editions&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Deployment Scenarios&lt;/li&gt;&lt;br /&gt;&lt;li&gt;On-Premise Requirements&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Importing Data&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Unsupported Customizations&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Integration&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Performance and Scalability&lt;/li&gt;&lt;br /&gt;&lt;li&gt;UI Customization (ISV.Config and SiteMap)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Miscellaneous&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Reporting Options&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Workflow&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Outlook Client&lt;/li&gt;&lt;br /&gt;&lt;li&gt;E-mail Functionality&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Core System Entities&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Asynchronous Service&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;strong&gt;Page 2&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Forms and Controls&lt;/li&gt;&lt;br /&gt;&lt;li&gt;SDK&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Accessing CrmService (Sample Code)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;IPluginExecutionContext Interface&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Technologies&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Plug-Ins (Plugins)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Workflow Assemblies&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Entity Relationships&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://sites.google.com/site/tdutch/Home/MicrosoftDynamicsCrm4QuickReference.pdf"&gt;&lt;img id="BLOGGER_PHOTO_ID_5252289616739285586" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_h9ZquLCH7cY/SOPhlB83ulI/AAAAAAAAAB4/L9vS-5KIDco/s400/crm4quickrefthumb1.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-3944477213762794833?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/3944477213762794833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/10/dynamics-crm-40-quick-reference.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3944477213762794833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3944477213762794833'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/10/dynamics-crm-40-quick-reference.html' title='Dynamics CRM 4.0 Quick Reference'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_h9ZquLCH7cY/SOPhlB83ulI/AAAAAAAAAB4/L9vS-5KIDco/s72-c/crm4quickrefthumb1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-4162719570265060169</id><published>2008-09-01T21:19:00.000-07:00</published><updated>2008-09-02T01:12:12.255-07:00</updated><title type='text'>High-level tasks for a Dynamics CRM 4.0 project</title><content type='html'>In a previous post, I listed many of the technical skills that a Dynamics CRM 4.0 implementation team likely needs to possess in order to design, code, deploy, and support a truly useful and rock solid system. In this post, I'm going to share some thoughts on the roles and tasks that go into successfully launching a Dynamics CRM system.&lt;br /&gt;&lt;br /&gt;On my CRM projects over the years, I've worn the hat of most of the project role members you'll see below - sometimes many of them at the same time. On a CRM deployment with only 10 users, I was the sole contributor - from business analyst to C# developer and everything in between. But most often I've worked on a 2-5 member team, with the largest deployment coming in at 500+ users.&lt;br /&gt;&lt;br /&gt;Let's take a look at the hats that you might have to wear on your next project by stepping through the high-level tasks of a Dynamics CRM 4.0 project.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Needs Assessment&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Goals and Tasks:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gain a thorough understanding of the needs of the stakeholders and their business and end-users.&lt;/li&gt;&lt;li&gt;Identify and meet with key business stakeholders and domain experts. Ask lots of questions and write down every answer.&lt;/li&gt;&lt;li&gt;Create and distribute documentation listing the project vision, scope, risks, and assumptions.&lt;/li&gt;&lt;li&gt;Understand and communicate the project scope. What's in and what's out?&lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Team Members:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Business Analyst&lt;/li&gt;&lt;li&gt;Project Manager&lt;/li&gt;&lt;li&gt;Senior Developer&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;Just a thought...&lt;/strong&gt; Isn't it awesome at this stage of the project to know that, with Dynamics CRM 4.0, you can deliver an extremely robust CRM or line-of-business application for dozens or hundreds of users in less time than it takes an average IT shop to decide between .NET vs. Java or thick-client vs. browser-based? Think about it... you're out of the gate with a solid and proven enterprise software architectural design including role-based security, web services API, metadata-driven UI and business object engine, customization tools and much more without writing a single line of code. Now, designing business objects, writing plugins, creating SRS reports, and integrating the system with other systems takes time and skill, but the point is that you can focus much more on the needs of the business and less on how you're going to provide e-mail templates, workflow, or hundreds of other features -- because many of them are already ready to go! Anyway, just a thought...&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;Project Plans&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Goals and Tasks:&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Define the work that will be done on the project and who will do it. This typically involves creating a statement of work (SOW), requirements specification, use cases, test and defect tracking plans, a list of resources and their availability, a work breakdown structure (tasks and time estimates), and a project schedule.&lt;/li&gt;&lt;li&gt;Requirements Elicitation: Gather, understand, review, and articulate the needs of the system's stakeholders and users. Observe current business processes, interview users and stakeholders, and distribute summaries for verification.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Team Members: &lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Project Manager&lt;/li&gt;&lt;li&gt;Test Lead&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Dynamics CRM 4.0 Implementation Plan&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;At this point, you should carefully read the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=1ceb5e01-de9f-48c0-8ce2-51633ebf4714&amp;amp;displaylang=en"&gt;Dynamics CRM 4.0 Implementation Guide&lt;/a&gt; to gain an understanding of Microsoft's recommended approach to planning, designing, configuring, customizing, and deploying a CRM 4.0 system. However, as lengthy and detailed as the Planning and Installation Guides are, they don't cover many of the real-world project topics such as setting up and using a defect tracking system, utilizing a source code repository, or conducting system testing. I'll cover these topics below.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Team Members: &lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Project Manager&lt;/li&gt;&lt;li&gt;Development Lead&lt;/li&gt;&lt;li&gt;Test Lead&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Project and File Management Tools&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Below are some of the tools I put in place before starting in on a Dynamics CRM 4.0 deployment.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;Requirements Management&lt;/u&gt;: Ideally, system requirements should be maintained in a system that's accessible to all project team members and stakeholders. In the past, I've used the customer's Dynamics CRM system (in a stable environment) for this purpose. I created a custom "System Requirements" entity and added attributes such as requirement name, id, description, priority, time estimate, key stakeholder(s), questions/answers, requirement elicitation status, implementation status, etc. If it's not possible for you to utilize the CRM system for this purpose then Excel (maintained in SharePoint, of course) works well, too.&lt;/li&gt;&lt;li&gt;&lt;u&gt;Version Control&lt;/u&gt;: It's essential to set up a version control system (such as Microsoft Visual SourceSafe) to safely store and track documentation, source code, exported CRM XML-based customization files, and other system artifacts. Also, assign someone the task of making backups of the file repository and keeping a copy off-site (if allowed by the company).&lt;/li&gt;&lt;li&gt;&lt;u&gt;Defect Tracking&lt;/u&gt;: Given the ease of customization in Dynamics CRM 4.0, you could utilize the "test" system for tracking defects. However, if this is not practical or possible then you'll find several excellent choices for logging and tracking the status of system defects. Systems that I've used in the past (that I've liked) include &lt;a href="http://www.fogcreek.com/FogBUGZ/"&gt;FogBugz&lt;/a&gt; and &lt;a href="http://www.atlassian.com/software/jira/"&gt;Jira&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;u&gt;Automated Builds&lt;/u&gt;: If your CRM 4.0 deployment includes plugins, custom ASP.NET applications, Windows services, or other compiled code, consider taking the extra time to automate the compilation and deployment of all software components. Tools such as &lt;a href="http://msdn.microsoft.com/en-us/library/wea2sca5(VS.80).aspx"&gt;MSBuild&lt;/a&gt; and &lt;a href="http://nant.sourceforge.net/"&gt;NAnt&lt;/a&gt; help make full automation of builds and deployment a reality. The benefits of this type of automation are that you don't have to build and deploy manually hundreds of times (thus saving you lots of time in the long run) and you'll end-up with fast and consistent deployments.&lt;/li&gt;&lt;li&gt;SQL Server Backups, scheduled at least daily. Backing up the CRM databases will not only preserve your hard work designing entities and attributes but will also store the hundreds of lines of JScript you've no doubt written for your project. Needless to say, this is a critical task that should be scheduled and verified at least once per day.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Team Members: &lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Project Manager&lt;/li&gt;&lt;li&gt;All Developers&lt;/li&gt;&lt;li&gt;All Testers&lt;/li&gt;&lt;li&gt;System Stakeholders&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;System Configuration and Customization&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Note: This section is incomplete. I'll fill-in the details here soon.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Entities and attributes&lt;/li&gt;&lt;li&gt;Forms: layout, data validation, JScript code, dynamic picklists, tabs, views&lt;/li&gt;&lt;li&gt;Navigation: SiteMap, isv.config&lt;/li&gt;&lt;li&gt;Security Roles&lt;/li&gt;&lt;li&gt;E-mail: inbound, outbound, tracking, templates&lt;/li&gt;&lt;li&gt;Reports&lt;/li&gt;&lt;li&gt;Workflow&lt;/li&gt;&lt;li&gt;Plugins and workflow assemblies&lt;/li&gt;&lt;li&gt;Custom applications: ASP.NET, IFRAME, ISV folder&lt;/li&gt;&lt;li&gt;Systems Integration&lt;/li&gt;&lt;li&gt;Outlook considerations: customizations, offline/online&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;u&gt;&lt;span style="font-size:130%;"&gt;Testing&lt;/span&gt;&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Goals and Tasks: &lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Make sure that the system does what the users and stakeholders want it to do and as agreed upon in the SOW and requirements documentation.&lt;/li&gt;&lt;li&gt;Execute the test plan. Log all defects.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Many more project details coming soon... please check back for an update to this posting.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-4162719570265060169?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/4162719570265060169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/09/high-level-tasks-of-dynamics-crm-40.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4162719570265060169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4162719570265060169'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/09/high-level-tasks-of-dynamics-crm-40.html' title='High-level tasks for a Dynamics CRM 4.0 project'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-200707350771498208</id><published>2008-07-30T11:31:00.000-07:00</published><updated>2008-07-30T11:45:30.862-07:00</updated><title type='text'>I just want to copy all entity notes to the Windows Clipboard!</title><content type='html'>A client called me up today and asked how she can copy all of the notes written for an entity to the Windows Clipboard. (Her company is still on version 3.0.) I told her "All you have to do is click the Notes tab on the entity record, click inside the Notes area, press Ctrl+A to copy all of the text, and then press Ctrl+C to copy the text."  Her response: "Um, that doesn't work."&lt;br /&gt;&lt;br /&gt;What!? Come on, that has to work. But then it hit me... that doesn't work... I tried that in 4.0 recently and it didn't work there either.&lt;br /&gt;&lt;br /&gt;She needed all of the notes copied out of the entity ASAP so here's the "work around" (because isn't this really a feature flaw?!) I gave her:&lt;br /&gt;&lt;br /&gt;1) Open the entity record.&lt;br /&gt;2) Click the Print button.&lt;br /&gt;3) Set the printer to Microsoft XPS Document Writer.&lt;br /&gt;4) Click Print and provide a file name.&lt;br /&gt;5) Open that file... it loads in IE. You can then highlight the text and copy it to the clipboard.&lt;br /&gt;&lt;br /&gt;She said, hesitantly... "Okay, um, thanks."&lt;br /&gt;&lt;br /&gt;The next time I'm in working on her company's system I'll create a solution (likely a report) that makes copying notes to the clipboard much easier, but if you're reading this and realize that I completely missed a built-in way of copying all entity notes please let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-200707350771498208?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/200707350771498208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/i-just-want-to-copy-all-entity-notes-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/200707350771498208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/200707350771498208'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/i-just-want-to-copy-all-entity-notes-to.html' title='I just want to copy all entity notes to the Windows Clipboard!'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-3264498596401280907</id><published>2008-07-19T23:22:00.000-07:00</published><updated>2008-07-19T23:31:06.878-07:00</updated><title type='text'>Getting Fiddler to work on the CRM 4.0 VPC</title><content type='html'>After loading &lt;a href="http://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/a&gt; for the first time on the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=dd939ed9-87a5-4c13-b212-a922cc02b469&amp;amp;displaylang=en"&gt;CRM 4.0 VPC&lt;/a&gt;, you'll likely see an error on startup. Fiddler indicates that it cannot listen on port 8888.&lt;br /&gt;&lt;br /&gt;Here's how to get Fiddler working on the VPC:&lt;br /&gt;&lt;br /&gt;1) Configure Fiddler to listen on port 8889. Then restart the app.&lt;br /&gt;&lt;br /&gt;2) Rather than browsing localhost:5555 to load CRM, use this URL instead: &lt;a href="http://moss.litwareinc.com:5555/loader.aspx"&gt;http://moss.litwareinc.com:5555/loader.aspx&lt;/a&gt;. Fiddler cannot capture requests on localhost but can when the machine name is used instead.&lt;br /&gt;&lt;br /&gt;After making those two adjustments you should be all set!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-3264498596401280907?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/3264498596401280907/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/getting-fiddler-to-work-on-crm-40-vpc.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3264498596401280907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3264498596401280907'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/getting-fiddler-to-work-on-crm-40-vpc.html' title='Getting Fiddler to work on the CRM 4.0 VPC'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-1814275533164445567</id><published>2008-07-17T12:33:00.000-07:00</published><updated>2008-12-09T18:14:13.576-08:00</updated><title type='text'>Build a combined activity view in Dynamics CRM 4.0</title><content type='html'>I'm often asked whether it's possible in 4.0 to view all activity related to an entity, regardless of whether the activity item has been sent, completed, or closed? Another common question is whether it's possible to view the sender and recipient(s) of an e-mail in a CRM grid view.&lt;br /&gt;&lt;br /&gt;Perhaps those capabilities will appear in 5.0 but in 4.0 you'll have to build or buy a solution for this. One of my clients decided to have my team build this functionality and the screen below gives you a glimpse of what it turned-out like. Note that I had to gray-out some of the entries to protect private information.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_h9ZquLCH7cY/SH-gsv3JuRI/AAAAAAAAABw/-WdnG-E6EvY/s1600-h/CaseActivities.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5224070783395543314" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_h9ZquLCH7cY/SH-gsv3JuRI/AAAAAAAAABw/-WdnG-E6EvY/s400/CaseActivities.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;Besides listing open and closed (History) activities in a single grid, we also built a preview pane to allow users to quickly view e-mail content and other activity details.&lt;br /&gt;&lt;br /&gt;I'm not authorized to provide the source code for this solution but I can provide an overview of the solution in case you want to build something like this.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Application development:&lt;/strong&gt; Visual Studio 2008 targeting .NET 3.0&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ASPX overview:&lt;/strong&gt; The ASPX page uses the standard ASP.NET GridView control. The middle section of the page includes a vertical resizing "control" (a table with a background image and linked JScript to provide sizing functionality). The preview pane consists of a textarea and iframe. The textarea is used to show non-HTML activity details (i.e., Tasks) and e-mail content is shown in the IFRAME.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Query:&lt;/strong&gt; We debated whether to call the CRM Web Service to query for activities or whether it was better to use SQL (ADO.NET) via classes in System.Data.SqlClient. For performance reasons we decided to use SQL. The query consists of one query for each activity type combined with the SQL SELECT UNION clause.  In the screenshot, you'll see a combobox that allows activity type filtering. We pass that selection into a parameter into the SQL query.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Grid View Columns: &lt;/strong&gt;The activity grid view contains the following columns: Activity Type, Created On, Subject, Description (e.g., a substring of the body of an e-mail), Source (e-mail sender), To (recipient(s)), Status, Owner, Created By, Modified By, Last Updated, Priority, and Resolution.  Users can sort on any of those columns.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Other Features:&lt;/strong&gt; We also provided the ability to export the grid to Excel and the ability to delete activities that are open/pending.  That last feature was requested because the client turned off the ability to delete activities for all user roles but they wanted users to be able to delete open or pending activity, such as an e-mail that was drafted but not sent.&lt;br /&gt;&lt;br /&gt;Lastly, we deployed the solution as a virtual directory under the Microsoft Dynamics CRM 4.0 Web application. I know this is "unsupported" by Microsoft but the client had already built custom pages and placed them in a virtual under the CRM root so we went with their approach.&lt;br /&gt;&lt;br /&gt;Let's just hope that 5.0 includes lots of new UI capabilities to make this type of view possible. And drag-and-drop column reordering, colorized rows (based on business logic), and inline editing would also be great to have!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-1814275533164445567?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/1814275533164445567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/build-combined-activity-view-in.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1814275533164445567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1814275533164445567'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/build-combined-activity-view-in.html' title='Build a combined activity view in Dynamics CRM 4.0'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_h9ZquLCH7cY/SH-gsv3JuRI/AAAAAAAAABw/-WdnG-E6EvY/s72-c/CaseActivities.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-870641670840084899</id><published>2008-07-17T00:19:00.000-07:00</published><updated>2008-07-17T10:46:46.971-07:00</updated><title type='text'>Determine attribute utilization for CRM entities</title><content type='html'>Upgrading Dynamics CRM 3.0 systems to 4.0 has kept me very busy lately. I've been involved with four upgrades in the past few months and have more on the horizon I'm sure.&lt;br /&gt;&lt;br /&gt;On one of the upgrade projects, the client's previous IT staff built-up the Account entity to include about 300 attributes. Now, I'm not one to quickly judge this as a bad idea without getting the facts and rationale for having so many custom attributes. Although I wouldn't have designed the entity the same way (I would've used a few picklists to replace the 100+ bit fields) the current design was built, was working, and it wasn't in the budget to change that part of the system.&lt;br /&gt;&lt;p&gt;But the question I had was this, "What percentage of each Account attribute has a value (is not null)?". Knowing the answer to this, and knowing what types of clients, partners, suppliers, etc. were stored in the Account entity, might lead to some decisions on whether all of the attributes are really necessary or whether a particular company type might be best spun-off to a new entity.&lt;/p&gt;&lt;p&gt;At the bottom of this posting I provide the T-SQL script I put together to answer the "percentage of attribute utilization" question.&lt;/p&gt;&lt;p&gt;After running the script, I found one classification of companies that accounted for 80% of the 150,000 Account records. But that company type only stored data in 10% of the 300 attributes! In other words, there were approximately 35,000,000 fields in SQL Server with NULL values for those Account records!&lt;/p&gt;Conversely, the other types of companies stored in the Account entity utilized 90% of all account attributes. So, most account attributes were being populated, but not for a very large percentage of account records.&lt;br /&gt;&lt;br /&gt;The problem with having unpopulated attributes is not so much the unnecessary database overhead but the complexity of the Account form when users only need to fill-in 25 or so fields for one of the records types but need to populate up to 300 fields for other account types. That leads to a lot of confusion about what data is required in the UI. Building reports, too, becomes much more difficult with so many attributes.&lt;br /&gt;&lt;br /&gt;Here's the T-SQL script I created for this attribute utilization analysis. Again, this will help you determine what percentage of each attribute in the Account entity has a non-null value. Of course, you can tweak this code to analyze any other entity or even all entities and attributes!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;set nocount on&lt;br /&gt;declare @table varchar(255)&lt;br /&gt;declare @col varchar(255)&lt;br /&gt;declare @datatype varchar(255)&lt;br /&gt;declare @sql varchar(1000)&lt;br /&gt;declare @total_recs int&lt;br /&gt;declare @total_non_null_recs int&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;declare cur cursor for&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;select table_name, column_name, data_type&lt;br /&gt;from information_schema.columns&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;where table_name = 'FilteredAccount' -- tweak this&lt;br /&gt;order by [table_name], [ordinal_position]&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;open cur&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:78%;"&gt;fetch next from cur into @table, @col, @datatype&lt;br /&gt;while (@@fetch_status &gt; -1)&lt;br /&gt;begin&lt;br /&gt;set @sql = 'declare @total_recs float; select @total_recs = count(*) from ' + @table + ';'&lt;br /&gt;set @sql = @sql + 'declare @total_non_null_recs float;'&lt;br /&gt;set @sql = @sql + 'select @total_non_null_recs = count(*) from ' + @table + ' where [' + @col + '] is not null;'&lt;br /&gt;set @sql = @sql + 'declare @percent_data_availability int;if @total_recs &gt; 0 begin select @percent_data_availability = round((@total_non_null_recs / @total_recs) * 100, 0) end else begin select @percent_data_availability = 0 end;'&lt;br /&gt;set @sql = @sql + 'print ' + '''' + @table + ',' + @col + ',' + '''' + ' + convert(varchar(10),@percent_data_availability)'&lt;br /&gt;execute (@sql)&lt;br /&gt;fetch next from cur into @table, @col, @datatype&lt;br /&gt;end&lt;br /&gt;close cur&lt;br /&gt;deallocate cur &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:78%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The output of this script appears, in SQL Server Management Studio, on the Messages tab in the query results area of the query window.&lt;br /&gt;&lt;br /&gt;The ouput includes the table name, attribute name, and an integer representing the percentage of records where the attribute has a non-null value. For example, the output below means that 78% of the address1_city attributes in all records in the FilteredAccount view has a value:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;FilteredAccount,address1_city,78&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In conclusion, you can use this script or something like it to quickly determine which entities and attributes in your CRM system has a value. If you see a low percentage for an attribute that you think should be much higher then that will likely lead you to take action, such as requiring values in the UI or perhaps removing the attribute altogether.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-870641670840084899?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/870641670840084899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/determine-attribute-utilization-for-crm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/870641670840084899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/870641670840084899'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/determine-attribute-utilization-for-crm.html' title='Determine attribute utilization for CRM entities'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-526311075319480187</id><published>2008-07-08T13:47:00.000-07:00</published><updated>2008-07-19T23:20:21.972-07:00</updated><title type='text'>When a system problem occurs, start here...</title><content type='html'>&lt;p&gt;Since I mostly deal with the technical side of Microsoft Dynamics CRM 4.0 implementations, including planning, deployment, development (JScript, plug-ins, workflow .NET assemblies, systems integration, etc.), I am often the person to whom system problems get escalated. One of the practices that I've found beneficial is to save all MSCRM information I can get my hands on including product documentation, KB articles, blogs, code samples, newsgroups, etc. and&lt;br /&gt;index all of it with &lt;a href="http://www.dtsearch.com/PLF_desktop_2.html"&gt;dtSearch&lt;/a&gt;. With a product as widely sold and used as CRM 4.0, there's likely a solution (or a solid clue) out there in the cloud and having that information indexed into a single source makes for rapid problem resolution.&lt;/p&gt;&lt;p&gt;Another practice I've followed is being consistent with how I record and track system problems. By recording the precise problem and/or error message(s), the status of the issue, the fixes attempted, screenshots, etc. the result is typically an organized and thoughtful approach to system diagnosis and resolution. The side benefit is that I then have documentation that may help me or others in the future. Of course, if the client I'm working with has a defect tracking system then that's where this information will go, but it's good to have a separate copy, too, so that the information is easier to locate in the future.&lt;/p&gt;&lt;p&gt;Below is the basic template I use when faced with a system issue. After resolving the issue, I update my personal kb in dtSearch and if I ever face the same problem in the future the solution will be easy to find.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;[Client] - [Project] - Issue - [Brief Problem Description]&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;Date Reported:&lt;/b&gt; [Date]&lt;br /&gt;&lt;b&gt;Reported By:&lt;/b&gt; [Person who identified the problem]&lt;br /&gt;&lt;b&gt;Owner:&lt;/b&gt; [Tim Dutcher]&lt;br /&gt;&lt;b&gt;Priority:&lt;/b&gt; [One of the following: Urgent, High, Medium, Low]&lt;br /&gt;&lt;b&gt;Status:&lt;/b&gt; [One of the following: Open, In Progress, Resolved, Reopened, Closed]&lt;br /&gt;&lt;b&gt;Environment:&lt;/b&gt; [One of the following: Dev, UAT, Production]&lt;br /&gt;&lt;b&gt;Keywords:&lt;/b&gt; [Enter keywords that will help find this document via full-text search.]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color:#999999;"&gt;&lt;i&gt;Other details to record at the top might include: Requirement # or name, total time invested, and due date.&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Table of Contents&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;Insert TOC here.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Issue Description&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;Enter full description of the issue here.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Error messages&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;Includes errors logged to Windows Event Log, CRM log files, IIS log, Custom log&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;strong&gt;Screenshots&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;How to Reproduce&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Preconditions&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Steps&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style="font-size:130%;"&gt;Resolution Actions and Results&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;Note: Before taking any actions to resolve the issue, make backups of the CRM customizations and system files (server\bin, ISV, and wwwroot), config files, databases, and other files/settings as necessary.&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;[Date/Time] - [Person's initials] - &lt;em&gt;&lt;span style="color:#999999;"&gt;Action taken and results. Also list open questions (highlight in red).&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;Check the following resources for information. If helpful information is found then record the URL and copy the key points from the content.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://www.dogpile.com/"&gt;&lt;span style="color:#c0c0c0;"&gt;Online search&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=1CEB5E01-DE9F-48C0-8CE2-51633EBF4714&amp;amp;displaylang=en"&gt;&lt;span style="color:#c0c0c0;"&gt;Dynamics CRM 4.0 Implementation Guide&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://community.dynamics.com/content/crmnewsgroups.aspx?GroupID=22"&gt;&lt;em&gt;&lt;span style="color:#c0c0c0;"&gt;Dynamics CRM newsgroups&lt;/span&gt;&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=82e632a7-faf9-41e0-8ec1-a2662aae9dfb&amp;amp;displaylang=en"&gt;&lt;em&gt;&lt;span style="color:#c0c0c0;"&gt;Dynamics CRM SDK&lt;/span&gt;&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#c0c0c0;"&gt;Local knowledge base (indexed documents, e-mail, web content, etc.)&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://technet.microsoft.com/en-us/library/cc151073.aspx"&gt;&lt;span style="color:#c0c0c0;"&gt;Windows Event Log&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://support.microsoft.com/kb/907490"&gt;&lt;span style="color:#c0c0c0;"&gt;Dynamics CRM log files&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#c0c0c0;"&gt; (\Program Files\Microsoft CRM\Trace\)&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms525410.aspx"&gt;&lt;span style="color:#c0c0c0;"&gt;IIS log files&lt;/span&gt;&lt;/a&gt;&lt;span style="color:#c0c0c0;"&gt; (\Windows\System32\Logs\)&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://www.fiddlertool.com/fiddler/"&gt;&lt;span style="color:#c0c0c0;"&gt;Fiddler&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://technet.microsoft.com/en-us/library/ms181091.aspx"&gt;&lt;span style="color:#c0c0c0;"&gt;SQL Profiler&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx?PHPSESSID=d926"&gt;&lt;span style="color:#c0c0c0;"&gt;SysInternals Process Monitor&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;&lt;a href="http://blogs.msdn.com/benlec/archive/2008/03/04/crmdiagtool4-for-microsoft-crm-4-0-has-been-released.aspx"&gt;&lt;span style="color:#c0c0c0;"&gt;CRMDiagTool4&lt;/span&gt;&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Resolution Options&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;List the pros and cons of each resolution option.&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;b&gt;Final Resolution&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#999999;"&gt;&lt;em&gt;Provide thorough, step-by-step details to resolve the problem. List the name of all files changed in source control.&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Other Details&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;&lt;span style="color:#999999;"&gt;If debugging code, capture details of classes visited, variables, location of exception(s), commentary about code (possible areas of fault). Also record areas where additional logging would be beneficial.&lt;/span&gt;&lt;/em&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-526311075319480187?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/526311075319480187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/when-system-problem-occurs-start-here.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/526311075319480187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/526311075319480187'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/07/when-system-problem-occurs-start-here.html' title='When a system problem occurs, start here...'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-4108020892166303783</id><published>2008-06-27T13:25:00.000-07:00</published><updated>2008-06-27T13:30:33.933-07:00</updated><title type='text'>Are you sure you want to navigate away from this page?</title><content type='html'>&lt;p&gt;Within a form's onload script, it's sometimes necessary to override the default value of a field. On a recent project, I ran into a scenario where this became necessary for the previous development team. They implemented a custom encryption solution where client-side code called a web service to decrypt CRM data. The script then set the DataValue (field text value) of various fields to the decrypted value.&lt;/p&gt;&lt;p&gt;The side-effect of that code was that every time a user opened a record and then closed it (not making any changes), they were prompted with an alert box with the question "Are you sure you want to navigate away from this page? Your changes have not been saved.". Needing to click OK after viewing records became very annoying for users so they asked me whether there was anything that could be done to avoid this unnecessary message.&lt;/p&gt;&lt;p&gt;In looking at the SDK and the built-in code that determines whether a form is "dirty", I discovered that it's possible to set the defaultValue of a control to the current DataValue of the control. In other words, after making changes to the properties of a control (those that use the defaultValue and DataValue properties), you can reset the default value for the control to the data value that was set by other code.&lt;/p&gt;&lt;p&gt;My first attempt at this was to place the following at the bottom of the form's onload script:&lt;br /&gt;&lt;br /&gt;&lt;span class="style2"   style="font-family:courier new;font-size:85%;"&gt;crmForm.all.new_regionid.defaultValue = crmForm.all.new_regionid.DataValue;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I thought for sure that would solve the problem, but it didn't. Due to the placement of the onload code in the rendered page, this code ran too early and thus did not have the desired effect. &lt;/p&gt;&lt;p&gt;The use of the JScript function "setTimeout" did the trick, as in this example:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;window.setTimeout("crmForm.all.new_attorney.defaultValue = crmForm.all.new_attorney.DataValue", 2000) &lt;/span&gt;&lt;/p&gt;&lt;p&gt;I placed that line at the bottom of the form's onload script and the unwanted "are you sure" prompt stopped appearing.&lt;/p&gt;&lt;p&gt;The use of setTimeout means that the user must keep the form open for at least the number of seconds you specify for the code to work. Unless someone opened a form accidentally, two seconds should allow the code to work a vast majority of the time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-4108020892166303783?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/4108020892166303783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/are-you-sure-you-want-to-navigate-away.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4108020892166303783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4108020892166303783'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/are-you-sure-you-want-to-navigate-away.html' title='Are you sure you want to navigate away from this page?'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-3121143667183908228</id><published>2008-06-16T10:30:00.000-07:00</published><updated>2010-01-24T23:44:41.444-08:00</updated><title type='text'>What you need to know</title><content type='html'>A coworker and I were discussing over lunch last week all of the skills that a person needs to possess to properly plan for a Dynamics CRM 4.0 installation, to configure and customize the application, and to keep the application up and running 24x7. This topic came up as we talked about different professions and the level of ongoing learning that's required. For example, his fiancee is studying for the Bar Exam so we talked about the need in that profession to stay on top of the ever-changing legal landscape and courtroom rules to perform that job effectively.&lt;br /&gt;&lt;br /&gt;Those responsible for implementing Dynamics CRM, too, need to keep on top of an ever-changing technology landscape while remaining skilled with dozens of existing technologies. When we started naming the skills needed to deploy, customize, and maintain a Dynamics CRM deployment we were surprised at how long the list became. But it explained the late nights and weekends that are sometimes necessary to do our job effectively.&lt;br /&gt;&lt;br /&gt;Here's the list of Dynamics CRM implementation skills we came up with, in no particular order:&lt;br /&gt;&lt;br /&gt;Dynamics CRM planning, installation, configuration&lt;br /&gt;All Dynamics CRM features and functions (UI, SDK, Filtered views, etc.)&lt;br /&gt;General business savvy (sales, marketing, support, industry-specific)&lt;br /&gt;JavaScript/JScript&lt;br /&gt;Client-side script debugging&lt;br /&gt;HTML&lt;br /&gt;HTML DOM&lt;br /&gt;XML&lt;br /&gt;XML DOM&lt;br /&gt;SOAP&lt;br /&gt;Fiddler output analysis&lt;br /&gt;AJAX&lt;br /&gt;Cascading Style Sheets&lt;br /&gt;CSS behaviors (HTC files)&lt;br /&gt;Object-oriented programming (OOP)&lt;br /&gt;.NET framework&lt;br /&gt;ASP.NET (page development and Web Services)&lt;br /&gt;ADO.NET&lt;br /&gt;C#&lt;br /&gt;Relational database concepts&lt;br /&gt;SQL Server administration&lt;br /&gt;SQL language&lt;br /&gt;SQL clustering&lt;br /&gt;T-SQL development / stored procedures&lt;br /&gt;SQL Reporting Services&lt;br /&gt;Windows Server 2003 / 2008&lt;br /&gt;IIS configuration&lt;br /&gt;SMTP&lt;br /&gt;SSL&lt;br /&gt;Windows Services&lt;br /&gt;Active Directory&lt;br /&gt;Server/network security&lt;br /&gt;Microsoft Exchange&lt;br /&gt;Microsoft MOM&lt;br /&gt;Hardware deployment&lt;br /&gt;TCP/IP (at least the basics)&lt;br /&gt;Microsoft Office&lt;br /&gt;Data Migration&lt;br /&gt;Windows Workflow Foundation&lt;br /&gt;Windows Communication Framework&lt;br /&gt;Debugging (client-side, .NET, SQL)&lt;br /&gt;Systems Integration (messaging, BizTalk, etc.)&lt;br /&gt;Load balancing&lt;br /&gt;Web farms&lt;br /&gt;High-availability (HA) system architecture&lt;br /&gt;ActiveX / COM&lt;br /&gt;Visual Studio 2010 (Added this one and the skills below in January 2010)...&lt;br /&gt;.NET Framework 4.0&lt;br /&gt;C# 4.0&lt;br /&gt;SQL Server 2008&lt;br /&gt;XAML&lt;br /&gt;SharePoint 2010&lt;br /&gt;JQuery and other JavaScript libraries&lt;br /&gt;Microsoft Azure&lt;br /&gt;&lt;br /&gt;In reading this list again, it's understandable why SaaS is catching on! That's a lot to know -- and to keep up on on a regular basis.&lt;br /&gt;&lt;br /&gt;Still, think about the trade-offs of moving to a SaaS environment. If you really want your information technology to fit your business and not the other way around then it's often worth hiring people who can (and enjoy) working with the technologies noted above. For some reason, I'm one of those. Am I insane? Perhaps. But getting all of those pieces working smoothly and tailoring solutions to a business is very rewarding. And if my Dynamics CRM clients are seeing a return on their investment then this is a win for everyone involved.&lt;br /&gt;&lt;br /&gt;Now, please excuse me. I haven't had a chance to crack the seal on my Silverlight Unleashed book yet so I have some reading to do...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-3121143667183908228?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/3121143667183908228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/what-you-need-to-know.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3121143667183908228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/3121143667183908228'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/what-you-need-to-know.html' title='What you need to know'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-510645543926316703</id><published>2008-06-09T15:04:00.000-07:00</published><updated>2008-12-09T18:14:15.307-08:00</updated><title type='text'>An easy way to debug client-side code</title><content type='html'>On a recent project CRM 4.0), I was asked to revise the default behaviour of the "Convert Activity... To Case" option on the E-mail form. The client did not want the modal dialog box to appear (the one prompting for the Customer and Subject) and wanted instead to set default values in code. The business purpose for the change was to increase productivity and avoid incorrect data-entry by their 20+ users, who use that feature several times each day.&lt;br /&gt;&lt;br /&gt;Below is a step-by-step process for making this change.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;em&gt;&lt;span style="font-size:85%;"&gt;Note: Since this example requires a change to a core CRM js file, Microsoft considers this an "unsupported" customization.&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;In order to debug the "To Case" command (outlined below) I loaded my favorite IE browser add-in development tool... IE WebDeveloper. (See my previous blogs about this product.) &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_h9ZquLCH7cY/SE20JfE_QeI/AAAAAAAAAAo/GW21InQbRiA/s1600-h/tocase.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5210018418991776226" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_h9ZquLCH7cY/SE20JfE_QeI/AAAAAAAAAAo/GW21InQbRiA/s400/tocase.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Using IE WebDeveloper, I was able to determine that the To Case menu option calls the function &lt;em&gt;convertToCase&lt;/em&gt; with a parameter of 4202. &lt;/div&gt;&lt;br /&gt;&lt;div&gt;The screenshot below shows the "To Case" menu option (in the HTML DOM) highlighted on the left and the JScript function outlined on the right.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/_h9ZquLCH7cY/SE22QPE_QfI/AAAAAAAAAAw/bfsF4el5Sl8/s1600-h/js.jpg"&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_h9ZquLCH7cY/SE229vE_QgI/AAAAAAAAAA4/G1zqnrsb4Qo/s1600-h/js.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5210021515663196674" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_h9ZquLCH7cY/SE229vE_QgI/AAAAAAAAAA4/G1zqnrsb4Qo/s400/js.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;To start debugging the &lt;em&gt;convertToCase(4202)&lt;/em&gt; function call, I used the Run Scripts feature of IE WebDeveloper to execute the JScript &lt;em&gt;debugger&lt;/em&gt; statement along with the function, as shown below:&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://4.bp.blogspot.com/_h9ZquLCH7cY/SE24JfE_QhI/AAAAAAAAABA/QLHDU3U3yRw/s1600-h/runscript.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5210022817038287378" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_h9ZquLCH7cY/SE24JfE_QhI/AAAAAAAAABA/QLHDU3U3yRw/s400/runscript.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;After clicking Run, I started debugging with Visual Studio 2008.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_h9ZquLCH7cY/SE24-fE_QiI/AAAAAAAAABI/iHlGXfeXpxw/s1600-h/debug.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5210023727571354146" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_h9ZquLCH7cY/SE24-fE_QiI/AAAAAAAAABI/iHlGXfeXpxw/s400/debug.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since the script is running in the context of the current CRM web page, I was then able to step into the convertToCase function, which it turns out resides in \inetpub\wwwroot\_static\Activities\Activity.js.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Finally, I revised convertToCase (removed the code that opened the modal window) to my liking and debugged through the code a few more times to make sure my customization worked as planned.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The coolest part of using IE WebDeveloper to help out with this customization is not needing to place the debugger statement inside a script file -- I was able to start debugging immediately within the current page. This same technique can be used to fire onLoad, onChange, or any other window/document/element event. For example, to fire onLoad you can run this in the IE WebDeveloper:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;debugger;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;crmForm_window_onload0();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Again, this lets you step through the onLoad script of any form without the need to place a debugger statement in the form code.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;As another example, assume you want to fire the onClick message for a custom button added via ISV.Config and debug into the JScript that CRM constructs. Run this code in the IE WebDeveloper script window to start a debug session in Visual Studio:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var customButton = document.getElementById("ISV_New_4_GPInvoiceLookup").childNodes.item(0).childNodes.item(0).childNodes.item(1);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;var evt = document.createEventObject();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;debugger;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;customButton.fireEvent("onclick", evt);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-510645543926316703?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/510645543926316703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/easy-way-to-debug-client-side-code.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/510645543926316703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/510645543926316703'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/easy-way-to-debug-client-side-code.html' title='An easy way to debug client-side code'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_h9ZquLCH7cY/SE20JfE_QeI/AAAAAAAAAAo/GW21InQbRiA/s72-c/tocase.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-4351247722010380298</id><published>2008-06-08T15:57:00.000-07:00</published><updated>2008-06-08T17:19:02.661-07:00</updated><title type='text'>IE WebDeveloper</title><content type='html'>A while back I discovered a great browser add-in and development tool named &lt;a href="http://www.ieinspector.com/dominspector/index.html"&gt;IE &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;WebDeveloper&lt;/span&gt;&lt;/a&gt;. Although there are some &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=e59c3964-672d-4511-bb3e-2d5e1db91038&amp;amp;displaylang=en"&gt;similar&lt;/a&gt; add-ins available that are free, it's worth the small price to get the extra features in this app.&lt;br /&gt;&lt;br /&gt;Here's how I find myself using IE &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;WebDeveloper&lt;/span&gt; while working on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;CRM&lt;/span&gt; 4.0 implementations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get the schema name of any attribute on a form.&lt;/li&gt;&lt;li&gt;Execute scripts (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;jscript&lt;/span&gt;/javascript) against the current page. Examples: fire the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;onLoad&lt;/span&gt; event for the page or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;onChange&lt;/span&gt; for any field, test your code on the live &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;CRM&lt;/span&gt; form page (current DOM) before publishing it, manipulate the browser DOM interactively to test custom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;UI&lt;/span&gt; functionality, or write and run a script to list all "dirty" fields on a form.&lt;/li&gt;&lt;li&gt;View the script tied to any DOM element. I use this as a quick way to view the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;onChange&lt;/span&gt; code for fields.&lt;/li&gt;&lt;li&gt;Interactively change the content, attributes, and style for any DOM element. This is useful for placing custom elements on the page, such as an icon next to a field. My team did this recently to provide real-time duplicate checking for data entered into a field. Being able to place images on the form, nudge them around, etc. saved a lot of time and guesswork. (Of course, what I described was an "unsupported" customization.)&lt;/li&gt;&lt;li&gt;Get the id (&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Guid&lt;/span&gt;) of an entity listed in a grid.&lt;/li&gt;&lt;li&gt;Capture all window, document, and element events. I used this recently on a custom ASP.NET page (integrated into &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;CRM&lt;/span&gt;) to write code to handle various mouse events.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Besides being able to easily browse up and down the page DOM, the second most useful feature of IE &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;WebDeveloper&lt;/span&gt; is the ability to run scripts interactively against the current page. You can dynamically hide and show tabs, test field validation code, loop through elements to perform actions on them, and just about anything else you might need to do to interact with any screen in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;CRM&lt;/span&gt;. It really takes the guesswork out of how &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;CRM&lt;/span&gt; pages are constructed and how to customize them.&lt;/p&gt;&lt;p&gt;As for other browser tools, I also use &lt;a href="http://blazingtools.com/is.html"&gt;Instant Source&lt;/a&gt; for interactively browsing the page DOM and &lt;a href="http://www.fiddlertool.com/fiddler/"&gt;Fiddler&lt;/a&gt; to help with performance and troubleshooting.&lt;/p&gt;&lt;p&gt;Lastly, if you have a weekend (and hard drive) to fill and want to add to your development tool collection, then it's hard to find a larger collection of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;dev&lt;/span&gt; tools than &lt;a href="http://www.hanselman.com/blog/ScottHanselmans2007UltimateDeveloperAndPowerUsersToolListForWindows.aspx"&gt;Scott &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Hanselman's&lt;/span&gt;&lt;/a&gt; "ultimate tools" page.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-4351247722010380298?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/4351247722010380298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/ie-webdeveloper.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4351247722010380298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/4351247722010380298'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/ie-webdeveloper.html' title='IE WebDeveloper'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4595918998034640424.post-1636167207138717235</id><published>2008-06-08T13:42:00.000-07:00</published><updated>2008-06-08T15:22:02.421-07:00</updated><title type='text'>A wealth of knowledge... and how to keep up.</title><content type='html'>If you implement Dynamics CRM full-time like I do, you want to be sure to keep up on the latest SDK releases, sample code, tools, tips, tricks, etc.  One app that makes this easier is &lt;a href="http://www.copernic.com/en/products/agent/professional.html"&gt;Copernic Agent Pro&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;With Copernic's web page tracking feature, you enter links for the pages you want to track, set up the tracking schedule, and it will send an e-mail to you with the pages that were updated. It even highlights the content that's new or updated.&lt;br /&gt;&lt;br /&gt;The app's main feature is to search for web content, filter-out missing pages and those that don't contain the words (or Boolean expression) that you specify, and to highlight the search "hits". &lt;br /&gt;&lt;br /&gt;In my next blog I'll list the 40+ blog sites and general MSCRM sites that I have Copernic tracking for me each day. Now, if only it would consolidate all blog updates into one Word doc or PDF and load it to my Amazon Kindle for my daily commute... panacea!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4595918998034640424-1636167207138717235?l=mscrmrocks.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://mscrmrocks.blogspot.com/feeds/1636167207138717235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/wealth-of-knowledge-and-how-to-keep-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1636167207138717235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4595918998034640424/posts/default/1636167207138717235'/><link rel='alternate' type='text/html' href='http://mscrmrocks.blogspot.com/2008/06/wealth-of-knowledge-and-how-to-keep-up.html' title='A wealth of knowledge... and how to keep up.'/><author><name>Tim Dutcher</name><uri>http://www.blogger.com/profile/06470686235614348020</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
