<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkQERX88fCp7ImA9WhBUFE8.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451</id><updated>2013-05-01T08:58:24.174-06:00</updated><category term="grid refresh" /><category term="windows server 2008" /><category term="crm 2011" /><category term="contract" /><category term="javascript" /><category term="updated previous post" /><category term="plug-in" /><category term="iis performance" /><category term="AJAX" /><category term="wsdl" /><category term="grid" /><category term="XMLHTTP" /><category term="Embedded Advanced Find View" /><category term="microsoft crm mvp" /><category term="form customization" /><category term="crm javascript library" /><category term="Advanced Find" /><category term="crm 4" /><category term="telerik" /><category term="xml serialization" /><category term="grid editor" /><category term="lookup customization" /><category term="lookupsingle.aspx" /><category term="crm community" /><category term="XRM Virtual" /><category term="workflows" /><category term="vba" /><category term="windows server 2003" /><category term="data management" /><category term="reports" /><category term="silverlight" /><category term="technet wiki" /><category term="Retrieve" /><category term="web services" /><category term="DynamicEntityArrayProperty" /><category term="impersonation" /><category term="C#" /><category term="RetrieveMultiple" /><category term="activityparty" /><category term="ExecuteMultiple" /><category term="ssrs" /><category term="crm tools list" /><category term="CRMUG" /><category term="itdiots" /><category term="twitter" /><category term="code efficiently" /><category term="sql server 2012" /><category term="book review" /><category term="crm performance" /><category term="multiple sort" /><category term="great customer service" /><category term="ui customization" /><category term="N:N Relationships" /><category term="partylist" /><category term="bulk delete" /><title>CRM Entropy - A Microsoft Dynamics CRM Blog</title><subtitle type="html">Tales of a Microsoft Dynamics CRM Developer</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://crmentropy.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>85</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/CrmEntropy" /><feedburner:info uri="crmentropy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>CrmEntropy</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;Dk4NRnw6eyp7ImA9WhBWGE0.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-6445028944505720329</id><published>2013-04-11T22:11:00.001-06:00</published><updated>2013-04-12T16:16:37.213-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-12T16:16:37.213-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ui customization" /><title>Love Your UI: Icons for CRM</title><content type="html">&lt;p&gt;I’m going to make an unusual break from my normal kind of post to talk about customizing Dynamics CRM with paid utilities, and specifically about sourcing professional-appearing icons for CRM’s UI.&amp;#160; The topic doesn’t occur very often in the forums, and generally &lt;a href="http://jlattimer.blogspot.com/2013/03/tips-on-finding-icons-for-custom.html" target="_blank"&gt;the advice has been to search Google&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I can’t discount that method, as I’ve used it in the past to locate royalty-free, attribution-free, and open-licensed sets of icons.&amp;#160; While the quality of many sets are great, the bulk of files are cumbersome to manage, and customizing them requires a significant investment of time and energy.&amp;#160; Looking into “modern” Microsoft interfaces with flattened icons, there are very few free options that match this style and look good doing it.&amp;#160; (However, if you’re looking for a good compilation of options, &lt;a href="http://css-tricks.com/flat-icons-icon-fonts/" target="_blank"&gt;look no further than Chris Coyier&lt;/a&gt;.)&lt;/p&gt;  &lt;p&gt;What an illuminating experience working with &lt;a href="http://www.axialis.com/iconworkshop/" target="_blank"&gt;Axialis IconWorkshop&lt;/a&gt; has been!&amp;#160; I inquired about the product about 6 months back, and was very graciously granted a gratis license to &lt;a href="http://www.axialis.com/stock-icons/pure-flat-2013-toolbar.html" target="_blank"&gt;their full “Pure Flat” icon sets&lt;/a&gt;.&amp;#160; I’ve had a handful of opportunities to use them, since, in conjunction with the IconWorkshop to author and customize the results.&amp;#160; Here’s a breakdown comparison of my previous “Google discovery” experience, and using a professional tool:&lt;/p&gt;  &lt;h3&gt;Locating an Icon&lt;/h3&gt;  &lt;h5&gt;Using Google:&lt;/h5&gt;  &lt;p&gt;Generally, I don’t use Google to find a single icon.&amp;#160; There is a significant amount of danger for violating copyright and intellectual-property rights.&amp;#160; Icon authors are hard working people too, and icon theft is one of the unspoken undercurrents of web applications, due in part to lazy people like I used to be.&lt;/p&gt;  &lt;p&gt;So, the last few times that I used Google, I went straight for “open-source, royalty-free, copyright-free” icon libraries.&amp;#160; There are many, but obtaining them from reputable sites can take some work.&amp;#160; Then, they are bundled into zip files (typically), and generally contain thousands or tens-of-thousands of icon files.&amp;#160; Filenames are the primary descriptors to search on, so if nothing turns up for a basic term, trying variations… or at worst, scanning through thumbnails, are best bets.&lt;/p&gt;  &lt;p&gt;   &lt;table cellspacing="0" cellpadding="2" width="420" border="0"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" width="360"&gt;&lt;strong&gt;Experience Ratings (1 best – 5 worst)&lt;/strong&gt; &lt;/td&gt;          &lt;td valign="top" width="58"&gt;&amp;#160;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="360"&gt;Time Consumption &lt;/td&gt;          &lt;td valign="top" width="58"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="360"&gt;Skill Required&lt;/td&gt;          &lt;td valign="top" width="58"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td valign="top" width="360"&gt;Efficiency of Desired Outcome&lt;/td&gt;          &lt;td valign="top" width="58"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;     &lt;/tbody&gt;&lt;/table&gt; &lt;/p&gt;  &lt;p&gt;Finding icons that are legal to use can be a struggle, and sorting and managing the various packing and naming conventions often leave much to be desired when it comes to cataloging or describing collections.&lt;/p&gt;  &lt;h5&gt;Using IconWorkshop:&lt;/h5&gt;  &lt;p&gt;Searching through icons that are imported into Axialis Librarian is a fast process, and only made faster, I think, due to indexing of the files.&amp;#160; This indexing extends to metadata keywords, but unfortunately the Axialis icon sets don’t come preloaded with any (at least not by my sampling).&amp;#160; Adding your own keywords takes time, but can certainly help improve it.&amp;#160; For the basis of rating this experience, though, I will not consider it an advantage.&lt;/p&gt;  &lt;p&gt;When it comes to the image you want to use, Axialis has many libraries with an impressive number of icons, but they don’t yet have a “full set” purchase experience—unless you use their in-site contact form to inquire about it.&amp;#160; Their prices are fair for long-term use, and more importantly, they include “base” icon images and “overlay” images that can be easily combined to create new permutations easily.&amp;#160; Searches will generally turn up both, however variety is going to cost you.&amp;#160; That said, it’s generally easy to figure out which set likely contains the candidate icon you want.&lt;/p&gt;  &lt;p&gt;Thankfully, you can import assets from other libraries (especially any “free” sets you may already have), and the IconWorkshop can be useful for searching those, as well.&amp;#160; Depending on how you look at it, Axialis icon sets are not given first-class status over other libraries--and that’s either noble, or a lost opportunity. &lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="420" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="360"&gt;&lt;strong&gt;Experience Ratings (1 best – 5 worst)&lt;/strong&gt; &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Time Consumption &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Skill Required&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Efficiency of Desired Outcome&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;While IconWorkshop helps with searching and organizing, Axialis’ icon sets are hamstringed by lack of useful keyword metadata accompanying their files.&amp;#160; They could have taken a “2” or “1” rating in the efficiency department, and probably lower in other areas.&amp;#160; However, the improved organization and the search capabilities maintain a slight edge over searching through the file system with something like &lt;a href="http://www.mythicsoft.com/page.aspx?type=agentransack&amp;amp;page=home" target="_blank"&gt;Agent Ransack&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Icon Set Quality&lt;/h3&gt;  &lt;h5&gt;Using Google:&lt;/h5&gt;  &lt;p&gt;“Free” icon sets come in varying styles and quality, so it’s hard to judge them collectively.&amp;#160; Often, it’s difficult to find a icon that comes in several native sizes.&amp;#160; Most “free” sets offer one or two sizes, and are often capped at 32x32, so scaling up or down impacts quality by producing pixelated or blurry results, respectively.&amp;#160; Within Dynamics CRM, 32x32 and 16x16 are used throughout the ribbons, grids, and menus; however, custom controls and pages can benefit from larger or smaller icons.&amp;#160; I have often found myself repeating the searching phase to find several icons that closely match each other in the various sizes.&lt;/p&gt;  &lt;p&gt;File formats are another issue, although generally minor given a good image editor.&amp;#160; Sets generally come in one or two formats, and they may or may not implement transparency.&amp;#160; It becomes important to check and convert, where necessary, to meet your needs.&amp;#160; (JPEG and GIF to PNG, for example.&amp;#160; Maybe that’s only &lt;em&gt;my&lt;/em&gt; need, so your mileage may vary.)&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="420" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="360"&gt;&lt;strong&gt;Experience Ratings (1 best – 5 worst)&lt;/strong&gt; &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Time Consumption &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Skill Required&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Efficiency of Desired Outcome&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Across the board, for most cases, if you find an icon you want, and are either lucky enough to have it looking good in every size you need it, or content with visual scaling effects, this is not a bad option.&amp;#160; In my experience, however, it tends to be fairly mediocre.&lt;/p&gt;  &lt;h5&gt;Using Axialis Icons:&lt;/h5&gt;  &lt;p&gt;The best thing I can say:&amp;#160; 256x256 all the way down to 16x16 of hand-crafted icon goodness.&amp;#160; Each set comes in ICO, BMP, and PNG formats, which covers the Web and Windows spectrum nicely.&amp;#160; On top of this, overlays are separated into their own files with transparency masks as companions.&amp;#160; These only factor into the ratings of this category insofar as they also come in native resolutions that are clean, well-scaled, and visually appealing at all sizes; and also that Axialis has pre-combined many “obvious” overlay and base image permutations.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="420" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="360"&gt;&lt;strong&gt;Experience Ratings (1 best – 5 worst)&lt;/strong&gt; &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Time Consumption &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Skill Required&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Efficiency of Desired Outcome&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Having pre-built ranges and formats adds a tremendous amount of space to the icon libraries, but the convenience of always having a size and format that works without additional thought is hard to trade away after experiencing it.&amp;#160; The quality and appearance of each image is strikingly good.&amp;#160; However, I do wish the files had an SVG or font-based format—I haven’t needed those for CRM yet, so that doesn’t affect my rating.&lt;/p&gt;  &lt;h3&gt;Customizing an Icon&lt;/h3&gt;  &lt;h5&gt;Using GIMP:&lt;/h5&gt;  &lt;p&gt;I’m not going to throw Google under the bus in the image editing department.&amp;#160; There are lots of icon editors available, and image manipulation suites.&amp;#160; My personal favorite is &lt;a href="http://www.gimp.org/" target="_blank"&gt;GIMP&lt;/a&gt;.&amp;#160; It has many of the features I need for advanced image editing, and it’s open source.&amp;#160; After 10 years, I’m fairly comfortable performing a wide variety of tasks.&lt;/p&gt;  &lt;p&gt;Unfortunately, small images don’t feel comfortable in suites meant for larger ones, but it works.&amp;#160; Layers are especially handy for putting together transparency masks and overlays… but overlays are uncommon to find in free icon sets, so most overlays I’ve used were custom produced, adding a lot of time for clean results.&lt;/p&gt;  &lt;p&gt;GIMP’s main advantage is its tremendous image editing capabilities—professional caliber features.&amp;#160; However, its learning curve is equally tremendous, and I never quite found the time to automate some repeated tasks.&amp;#160; It does, however, produce superior quality.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="420" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="360"&gt;&lt;strong&gt;Experience Ratings (1 best – 5 worst)&lt;/strong&gt; &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Time Consumption &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Skill Required&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Efficiency of Desired Outcome&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;Unfortunately, GIMP really just helps me “limp” with free icons, helping me cleanup scaling quirks, add custom overlays, or modify palettes.&amp;#160; The time investment is not insignificant, though.&amp;#160; I just didn’t realize it could be so much better.&lt;/p&gt;  &lt;h5&gt;Using IconWorkshop and Axialis Icons:&lt;/h5&gt;  &lt;p&gt;IconWorkshop has a feature that will compile and combine in all permutations, the overlays and base images you specify, to automatically produce an array of sizes and decorations without additional effort.&amp;#160; This is one of the faster ways to simply knock-out the 32x32 and 16x16 sizes I desire for CRM 2011.&amp;#160; &lt;/p&gt;  &lt;p&gt;The image editing capabilities of IconWorkshop are lackluster, and just advanced enough to satisfy the needs of basic manipulation.&amp;#160; Thankfully, I find myself working within their base+overlay formulas well enough that I haven’t had to step outside of IconWorkshop for anything more advanced.&amp;#160; It’s a borderline comfort, but it fits well for the purpose.&lt;/p&gt;  &lt;p&gt;It’s obvious that combining images is IconWorkshop’s strong suit, and that’s why Axialis’ icon sets are amazing within it.&amp;#160; The sets can stand alone, and IconWorkshop can do its deal with any source, but together they offer a purpose-built system that streamlines the whole process of tailoring icons—if you require it.&amp;#160; Again, Axialis has taken the liberty of combining common base and overlay permutations and included them in their large icon set files, so that reduces the need for customizing in the first place (or simplifies recombinant decoration).&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="420" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="360"&gt;&lt;strong&gt;Experience Ratings (1 best – 5 worst)&lt;/strong&gt; &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&amp;#160;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Time Consumption &lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Skill Required&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="360"&gt;Efficiency of Desired Outcome&lt;/td&gt;        &lt;td valign="top" width="58"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;By using a simpler tool and products that are built to work with it in an optimized fashion, I have shaved a lot of time from the process of building a slick-looking, custom UI within Dynamics CRM.&lt;/p&gt;  &lt;h3&gt;Average Scores:&lt;/h3&gt;  &lt;table cellspacing="0" cellpadding="2" width="420" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="276"&gt;         &lt;p&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="66"&gt;“Free”&lt;/td&gt;        &lt;td valign="top" width="59"&gt;Axialis&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="276"&gt;Time Consumption &lt;/td&gt;        &lt;td valign="top" width="66"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="59"&gt;2.33&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="276"&gt;Skill Required&lt;/td&gt;        &lt;td valign="top" width="66"&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="59"&gt;2&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="276"&gt;Efficiency of Desired Outcome&lt;/td&gt;        &lt;td valign="top" width="66"&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="59"&gt;2.66&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;I’m starting to understand the adage: “It’s not nobler to do by hand, what can be better and faster done with a tool, when lunch is on the line.”&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/oHy4gBVBhiE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/6445028944505720329/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2013/04/love-your-ui-icons-for-crm.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/6445028944505720329?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/6445028944505720329?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/oHy4gBVBhiE/love-your-ui-icons-for-crm.html" title="Love Your UI: Icons for CRM" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2013/04/love-your-ui-icons-for-crm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8GQ3w-cCp7ImA9WhBREUw.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-8240125787425371408</id><published>2013-02-28T20:04:00.001-07:00</published><updated>2013-02-28T22:13:42.258-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-28T22:13:42.258-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="workflows" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 4" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="data management" /><title>High Availability Workflows</title><content type="html">&lt;p&gt;Since joining &lt;a href="http://www.avtex.com" target="_blank"&gt;Avtex&lt;/a&gt;, I have been able to expand my horizons and gain exposure to customers with unique needs.&amp;#160; I try, as hard as possible, to incorporate or build on top of CRM’s out-of-box experience, and refrain from writing code I don’t have to.&amp;#160; To that end, I’d like to share a simple solution to making Workflows trigger while they’re deactivated for updating.&lt;/p&gt;  &lt;p&gt;It’s no secret that business processes change on-the-fly.&amp;#160; Implementing changes to active Workflows can be tricky, from an availability standpoint.&amp;#160; Most companies adopt a routine of modifying Workflow designs afterhours, or with operations momentarily held until the modification is complete.&amp;#160; This presents a dynamic and potentially troubling hurdle for “always on” companies.&lt;/p&gt;  &lt;p&gt;Because Workflows are listeners to CRM operations, rather than direct participants, any downtime with a particular Workflow means that it’s no longer listening to events.&amp;#160; This allows for the potential of unapplied business logic, and can be very difficult to diagnose or troubleshoot.&lt;/p&gt;  &lt;p&gt;Though the space of downtime can be reduced to mere minutes—by developing in an alternate environment and shipping the updated Workflow in as a Solution—the window of opportunity for actions to tip-toe past a disabled Workflow still exists.&amp;#160; For some companies, this is simply unacceptable.&lt;/p&gt;  &lt;p&gt;However, you can use the out-of-box Workflow abilities to create high availability Workflows that can be taken offline, modified, and then reactivated, all without missing a single event that was triggered while the Workflow was offline.&amp;#160; This works by splitting the Workflow’s functionality into two separate Worfklows:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;An event listening “Dispatcher” Workflow; and&lt;/li&gt;    &lt;li&gt;A “Business Logic” application Workflow&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;By isolating the business logic into a “child Workflow” which is called by its corresponding Dispatcher, one can take the Business Logic offline, while leaving the Dispatcher functional.&amp;#160; This allows the configured triggers of the Dispatcher to operate continuously, though the step which calls the Business Logic counterpart will fail during the downtime.&lt;/p&gt;  &lt;p&gt;Though the Dispatcher jobs enter a “Waiting” state, they will be easy to identify (especially if you allow them to delete themselves when they’re successful) in order to resume.&amp;#160; This behavior is generally sufficient enough to allow a wider window for Business Logic adjustment, without requiring additional intervention to process the new logic against records that are awaiting to execute the new logic.&amp;#160; That brings up another excellent advantage to this pattern:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;With Dispatchers, you can immediately terminate existing logic and immediately register all further processing against future logic.&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;em&gt;Note:&amp;#160; You cannot retarget a different workflow, as that would require taking the Dispatcher offline—which defeats the purpose.&amp;#160; The System Job acts as a cloned instance of a Workflow, so the Dispatcher will always target a specific, business-logic Workflow.&amp;#160; You can approximate a retargeting scenario with Dispatcher juggling, but it would involve trigger overlapping mitigation.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Here’s an example scenario that uses a Dispatcher to update an Account using the Dispatcher and Business Logic pattern:&lt;/p&gt;  &lt;p&gt;First, create the Business Logic workflow, and for “Available to Run” select “As a child process”.&amp;#160; Remove all selections from “Options for Automatic Processes”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-tZcBRRoLnYI/UTAas09t2GI/AAAAAAAAAgY/hLmwo3GF2XE/s1600-h/image%25255B38%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-r7s7feYLEzU/UTAataVcPwI/AAAAAAAAAgg/xRT5S1APqQQ/image_thumb%25255B26%25255D.png?imgmax=800" width="599" height="453" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then, create the Dispatcher workflow with the “Options for Automatic Processes” setting you desire, and configure it to call your Business Logic workflow.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-Yv85K7waOeY/UTAatl4lR9I/AAAAAAAAAgo/0IGY_PHHnFo/s1600-h/image%25255B37%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-ZM7kA_ieIH8/UTAauCi0mGI/AAAAAAAAAgw/kpPHJVk-CdA/image_thumb%25255B25%25255D.png?imgmax=800" width="599" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You may now activate both.&amp;#160; Your Dispatcher is diligently watching the events, and the Business Logic is processing your rules.&lt;/p&gt;  &lt;p&gt;Here is what happens when you deactivate the Business Logic workflow to make modifications:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-2dBus3gFDTI/UTAau4LkUZI/AAAAAAAAAg4/KzuBM28vIHk/s1600-h/image%25255B36%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-N-Vqpa0Zi-s/UTAavFMsTSI/AAAAAAAAAhA/BtVS-TdAr_E/image_thumb%25255B24%25255D.png?imgmax=800" width="599" height="113" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;My example uses a Dispatcher that listens to Account creation, so when I create a new account, here is what I see in the “Workflows” associated to it:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-_zyXK-dU9Po/UTAavqZB29I/AAAAAAAAAhI/RT0Jn3RpC5w/s1600-h/image%25255B35%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-3oPQDJ6U7yQ/UTAavyjqW3I/AAAAAAAAAhQ/pNfxh0wGKpE/image_thumb%25255B23%25255D.png?imgmax=800" width="599" height="237" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you can see, the Dispatcher caught the event, and then entered a “Waiting” state.&amp;#160; If we examine the job, we can see the error:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-l7RzJQaJf3A/UTAawKPgcAI/AAAAAAAAAhY/nfQNkAG4fjg/s1600-h/image%25255B34%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-JCuP9mhrm-w/UTAawrVXIpI/AAAAAAAAAhg/ZUWSNVVe-Zo/image_thumb%25255B22%25255D.png?imgmax=800" width="599" height="403" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It failed on the step that calls my Business Logic.&amp;#160; This job will remain in this state until I resume it.&amp;#160; After completing my modifications to Business Logic, I’ll reactivate it.&amp;#160; Then, I need to identify all my outstanding Dispatcher jobs:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-bqVyT5EBn9I/UTAaxBRHpTI/AAAAAAAAAho/5KW6ig0-r0M/s1600-h/image%25255B33%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-uUvXXYeZfQY/UTAaxbVOuVI/AAAAAAAAAhw/zNdUopfDNhQ/image_thumb%25255B21%25255D.png?imgmax=800" width="599" height="230" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Then, resume them with the confidence that I have missed no important triggers while my Business Logic was momentarily offline:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/-WtaFsodyQP0/UTAaxyABoFI/AAAAAAAAAh4/9xXIEwHegSU/s1600-h/image%25255B42%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-TRtNiG1kXJE/UTAayZPOJ3I/AAAAAAAAAiA/v2VPENctgfQ/image_thumb%25255B28%25255D.png?imgmax=800" width="599" height="220" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;That said, I always perform a quick validation, just to be sure:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/-dFo2sA8Hd74/UTAaymfjGcI/AAAAAAAAAiI/ExfCZLY8kXY/s1600-h/image%25255B46%25255D.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-EvQlNXsQvyM/UTAazJ4_V_I/AAAAAAAAAiQ/K9fPC63sD0Q/image_thumb%25255B30%25255D.png?imgmax=800" width="599" height="158" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/H5W7GD3HE08" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/8240125787425371408/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2013/02/high-availability-workflows.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8240125787425371408?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8240125787425371408?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/H5W7GD3HE08/high-availability-workflows.html" title="High Availability Workflows" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-r7s7feYLEzU/UTAataVcPwI/AAAAAAAAAgg/xRT5S1APqQQ/s72-c/image_thumb%25255B26%25255D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2013/02/high-availability-workflows.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8FR346eCp7ImA9WhBTFk8.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-8606552402114340694</id><published>2013-02-11T16:53:00.001-07:00</published><updated>2013-02-11T16:53:36.010-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-11T16:53:36.010-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ExecuteMultiple" /><category scheme="http://www.blogger.com/atom/ns#" term="code efficiently" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>A Potent Cocktail: ExecuteMultiple and LINQ</title><content type="html">&lt;p&gt;I love it when technologies using the same framework marry together like peaches and cream.&amp;#160; Today, I want to cover the intersection of CRM 2011’s new &lt;a href="http://msdn.microsoft.com/en-us/library/jj863631.aspx" target="_blank"&gt;ExecuteMultiple capabilities&lt;/a&gt; and my love of &lt;a href="http://msdn.microsoft.com/en-us/library/vstudio/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt;.&amp;#160; Just to be clear, I’m &lt;strong&gt;not&lt;/strong&gt; talking about using LINQ provider for CRM, though you can certainly use that to produce a collection of records upon which to perform some operation in bulk.&lt;/p&gt;  &lt;p&gt;Instead, I’d like to show you an elegant snippet of code that demonstrates the power of ExecuteMultiple with the cleanliness of succinct LINQ.&amp;#160; Given an EntityCollection —&lt;em&gt;someRecords— &lt;/em&gt;suppose that you need to increment some integer —&lt;em&gt;my_integer—&lt;/em&gt; on each of the contained records.&amp;#160; For the purposes of this example, I’ll be using the late-bound &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.entity.aspx" target="_blank"&gt;Entity&lt;/a&gt; type.&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;// Start our request with some basic initialization&lt;/span&gt;
ExecuteMultipleRequest bulkIncrementRequest = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExecuteMultipleRequest()
{
    Settings = &lt;span class="kwrd"&gt;new&lt;/span&gt; ExecuteMultipleSettings()
    {
        ContinueOnError = &lt;span class="kwrd"&gt;true&lt;/span&gt;,
        ReturnResponses = &lt;span class="kwrd"&gt;true&lt;/span&gt;
    },
    Requests = &lt;span class="kwrd"&gt;new&lt;/span&gt; OrganizationRequestCollection()
}

&lt;span class="rem"&gt;// Compile the collection of requests&lt;/span&gt;
bulkIncrementRequest.Requests.AddRange( from record &lt;span class="kwrd"&gt;in&lt;/span&gt; someRecords.Entities
                                        &lt;span class="kwrd"&gt;where&lt;/span&gt; record.Contains( &lt;span class="str"&gt;&amp;quot;my_integer&amp;quot;&lt;/span&gt; )
                                        select &lt;span class="kwrd"&gt;new&lt;/span&gt; UpdateRequest() 
                                        { 
                                            Entity = &lt;span class="kwrd"&gt;new&lt;/span&gt; Entity( &lt;span class="str"&gt;&amp;quot;someRecord&amp;quot;&lt;/span&gt; )
                                            {
                                                Id = record.Id,
                                                Attributes = {
                                                    &lt;span class="kwrd"&gt;new&lt;/span&gt; KeyValuePair( &lt;span class="str"&gt;&amp;quot;my_integer&amp;quot;&lt;/span&gt;,
                                                        ( ( Int32 ) record[ &lt;span class="str"&gt;&amp;quot;my_integer&amp;quot;&lt;/span&gt; ] ) + 1 )
                                                }
                                            }
                                        } );

&lt;span class="rem"&gt;// Excute the requests&lt;/span&gt;
ExecuteMultipleResponse bulkIncrementResponse = ( ExecuteMultipleResponse ) service.Execute( bulkIncrementRequest );

&lt;span class="rem"&gt;// Check &amp;quot;IsFaulted&amp;quot; to determine if any of the submitted requests failed&lt;/span&gt;
&lt;span class="kwrd"&gt;if&lt;/span&gt; ( bulkIncrementResponse.IsFaulted )
{
    Int32 errorCount = ( from incrementResponse &lt;span class="kwrd"&gt;in&lt;/span&gt; bulkIncrementResponse.Responses
                         &lt;span class="kwrd"&gt;where&lt;/span&gt; incrementResponse.Fault != &lt;span class="kwrd"&gt;null&lt;/span&gt;
                         select incrementResponse ).Count();
}&lt;/pre&gt;

&lt;p&gt;By using LINQ to inject the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.organizationrequestcollection_members.aspx" target="_blank"&gt;AddRange&lt;/a&gt; method of &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.xrm.sdk.messages.executemultiplerequest.requests.aspx" target="_blank"&gt;Requests&lt;/a&gt;, I was able to compound the code that loops through each record, selects the original value, increments it, and produces a request to update the record.&amp;#160; &lt;/p&gt;

&lt;p&gt;Keen observers notice that I created a new Entity object from the old one; this is a best-practice to avoid triggering updates on attributes undesirably.&amp;#160; However, it also allows me to perform the increment operation inline.&amp;#160; I’m sure you could inject this operation into a secondary where statement, but I think that makes the query logic less readable.&amp;#160; But your mileage may vary.&amp;#160; :)&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/2vBd_6QqO8M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/8606552402114340694/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2013/02/a-potent-cocktail-executemultiple-and.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8606552402114340694?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8606552402114340694?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/2vBd_6QqO8M/a-potent-cocktail-executemultiple-and.html" title="A Potent Cocktail: ExecuteMultiple and LINQ" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2013/02/a-potent-cocktail-executemultiple-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QHRno7fyp7ImA9WhBWGE0.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-2293770346717800055</id><published>2013-02-06T06:26:00.001-07:00</published><updated>2013-04-12T16:22:17.407-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-12T16:22:17.407-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="lookup customization" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="ui customization" /><title>Add Parameters to CRM 2011 Lookup Dialog</title><content type="html">&lt;h2&gt;Alternate Title: How to hide the “New” or “Properties” button from the CRM 2011 Lookup Dialog.&lt;/h2&gt;  &lt;p&gt;Following on the heels of &lt;a href="http://crmentropy.blogspot.com/2013/02/custom-crm-2011-form-notifications-for.html" target="_blank"&gt;yesterday’s post&lt;/a&gt;, I have finally discovered a way to eliminate the pesky “New” and “Properties” buttons from the Lookup dialog.&amp;#160; This was, again, easier accomplished in the previous version of CRM, with the following code:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;crmForm.all.&amp;lt;lookup&amp;gt;.AddParam(&lt;span class="str"&gt;&amp;quot;ShowNewButton&amp;quot;&lt;/span&gt;, 0);&lt;/pre&gt;
&lt;/div&gt;



&lt;p&gt;As we’ve seen before, this function did not disappear from CRM 2011—it was simply moved.&amp;#160; Now, this function is invoked somewhat implicitly via a behavioral association to a highly organized JavaScript object structure.&amp;#160; Yet again, hours of pouring over Developer Tools in Internet Explorer (this time with a lot more Profiling and debugging), I have figured out how Microsoft does it.&lt;/p&gt;

&lt;p&gt;Here’s the new way to hide the “New” button:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; lookupControl = Sys.Application.findComponent(&lt;span class="str"&gt;&amp;quot;some_lookupid&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (lookupControl != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    lookupControl._element._behaviors[0].AddParam(&lt;span class="str"&gt;&amp;quot;ShowNewButton&amp;quot;&lt;/span&gt;, 0);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;



&lt;p&gt;Like most of the things on this blog, this is highly unsupported, but I personally believe that this is a harmless hack.&amp;#160; There is one caveat, however, to the above code:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The ‘_behaviors’ member is a collection of references to classes.&amp;#160; For every Lookup I could find, there was only one entry, and it exposed the “AddParam” function.&amp;#160; Conceivably, there could be other Lookups with multiple behaviors, and the first item in ‘_behaviors’ may not be the one you want.&amp;#160; You have been warned.&lt;/li&gt;
&lt;/ul&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/mtVPGW2-6dk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/2293770346717800055/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2013/02/add-parameters-to-crm-2011-lookup-dialog.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/2293770346717800055?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/2293770346717800055?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/mtVPGW2-6dk/add-parameters-to-crm-2011-lookup-dialog.html" title="Add Parameters to CRM 2011 Lookup Dialog" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>5</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2013/02/add-parameters-to-crm-2011-lookup-dialog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QHRno6eyp7ImA9WhBWGE0.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-750372065134861157</id><published>2013-02-05T06:15:00.001-07:00</published><updated>2013-04-12T16:22:17.413-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-12T16:22:17.413-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="form customization" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="ui customization" /><title>Custom CRM 2011 Form Notifications for UR12</title><content type="html">&lt;p&gt;&lt;strong&gt;[UPDATE:&lt;/strong&gt; 2013.04.12 I added some additional tricks to this code, at the bottom.&lt;strong&gt;]&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Before Update Rollup 12, it was relatively simple to use the original “form alert” hack (seen &lt;a href="http://www.avanadeblog.com/xrm/2011/06/showing-custom-alerts-in-2011.html" target="_blank"&gt;here&lt;/a&gt;, &lt;a href="http://sliong.wordpress.com/2012/04/12/show-info-warning-error-message-in-crm-2011-notification-area-with-javascript/" target="_blank"&gt;here&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/b/johnsullivan/archive/2011/11/02/crm-2011-custom-form-notification.aspx" target="_blank"&gt;here&lt;/a&gt;, and &lt;a href="http://mscrmbi.blogspot.com/2012/04/crm-2011-add-notifications-to-entity.html" target="_blank"&gt;here&lt;/a&gt;) to produce custom, inline alerts and notices for the end user.&amp;#160; It’s a great feature of the form, and I wish I knew why using it is unsupported.&lt;/p&gt;  &lt;p&gt;Alas, many realized that these customizations would be undone by Update Rollup 12, and indeed they have.&amp;#160; So, allow me to show you what appears to be the “Microsoft” way of accessing the new form notification system.&amp;#160; The added bonus is that this method requires no additional libraries or external references, and should be cross-browser.&amp;#160; (Disclaimer: the following information was not released or documented by Microsoft; I discovered it after a few hours of pouring over Developer Tools in IE10.)&lt;/p&gt;  &lt;p&gt;The original hack could never have been cross-browser, because it relied on the “htc” behavior file which backed the original “crmNotifications” element.&amp;#160; Fortunately, these functions haven’t changed… just moved to a new home.&amp;#160; Here’s the old way (pre-UR12):&lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; notificationsArea = document.getElementById(&lt;span class="str"&gt;'crmNotifications'&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;notificationsArea.AddNotification(&lt;span class="str"&gt;'noteId1'&lt;/span&gt;, 1, &lt;span class="str"&gt;'namespace'&lt;/span&gt;, &lt;span class="str"&gt;'Message.'&lt;/span&gt;);&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;And here’s the new way (post-UR12):&lt;/p&gt;

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; notificationsList = Sys.Application.findComponent(&lt;span class="str"&gt;'crmNotifications'&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;notificationsList.AddNotification(&lt;span class="str"&gt;'noteId1'&lt;/span&gt;, 1, &lt;span class="str"&gt;'namespace'&lt;/span&gt;, &lt;span class="str"&gt;'Message.'&lt;/span&gt;);&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Both examples do the same thing in their respective CRM 2011 revisions.&amp;#160; This customization remains as unsupported as it ever was; however there is relatively little danger in using it.&lt;/p&gt;

&lt;p&gt;Here are some additional tricks you can use:&lt;/p&gt;



&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;notificationList.SetNotifications();&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;
That will reset the notifications array with an empty set.&amp;#160; Also, you can hide the notifications area by using:

&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;notificationList.SetVisible(&lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/igsmHvV8n-g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/750372065134861157/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2013/02/custom-crm-2011-form-notifications-for.html#comment-form" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/750372065134861157?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/750372065134861157?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/igsmHvV8n-g/custom-crm-2011-form-notifications-for.html" title="Custom CRM 2011 Form Notifications for UR12" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>12</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2013/02/custom-crm-2011-form-notifications-for.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8CQXc_fip7ImA9WhNWEUo.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-856523652819963133</id><published>2012-12-10T14:11:00.001-07:00</published><updated>2012-12-10T14:11:00.946-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-10T14:11:00.946-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="ssrs" /><category scheme="http://www.blogger.com/atom/ns#" term="impersonation" /><category scheme="http://www.blogger.com/atom/ns#" term="sql server 2012" /><title>SSRS Execution Account Needs PrivUserGroup</title><content type="html">&lt;p&gt;I discovered, somewhat by accident, that if you specify an Execution Account in the SQL Server Reporting Services Configuration Wizard, the specified account will provide the security context for SSRS Web Services when using the CRM Reporting Extensions (SRS Data Connector).&amp;#160; Sound complicated?&amp;#160; It’s really not.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://msdn.microsoft.com/en-us/library/ms181156.aspx" target="_blank"&gt;Execution Account&lt;/a&gt; is SSRS’s way to connect to external resources which do not require login (or those for which no other credentials have been configured).&amp;#160; This keeps the SSRS service account safe from making any external connection with its own credentials.&amp;#160; CRM’s “SRS Data Connector” removes credential requirements in favor of an alternate impersonation scheme (which eliminates double-hop Kerberos, and makes reports easier to access).&lt;/p&gt;  &lt;p&gt;Perhaps that was obvious to people with more SSRS education, but I thought it was a maintenance account.&amp;#160; /shrug&amp;#160; A brand-new installation is likely the place you’ll run into this issue.&amp;#160; Unfortunately, the real causes of the failure are best viewed from the SSRS logs.&lt;/p&gt;  &lt;p&gt;The problem manifests as the following exception:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Cannot create a connection to data source 'CRM'.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;But ultimately is caused by this exception: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Immediate caller &amp;lt;SQL Server Reporting Services Execution Account&amp;gt; has insufficient privilege to run report as user &amp;lt;SID&amp;gt;&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So the long and short of it:&amp;#160; if you specify an Execution Account for SSRS, and use CRM’s “SRS Data Connector”, then the Execution Account needs to be added manually to “PrivUserGroup”.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/WFioKvRIQoE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/856523652819963133/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/12/ssrs-execution-account-needs.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/856523652819963133?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/856523652819963133?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/WFioKvRIQoE/ssrs-execution-account-needs.html" title="SSRS Execution Account Needs PrivUserGroup" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/12/ssrs-execution-account-needs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAGQH08eSp7ImA9WhNTFUo.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-6482200714980054760</id><published>2012-10-18T10:28:00.001-06:00</published><updated>2012-10-18T10:28:41.371-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-18T10:28:41.371-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="code efficiently" /><category scheme="http://www.blogger.com/atom/ns#" term="telerik" /><category scheme="http://www.blogger.com/atom/ns#" term="great customer service" /><title>Telerik wins a cookie!</title><content type="html">&lt;p&gt;I’ve had the fortunate opportunity to be working with Telerik (&lt;a href="http://www.telerik.com"&gt;www.telerik.com&lt;/a&gt;) tools in my Visual Studio development environment for a while now, and I like them.&amp;#160; &lt;a href="http://www.telerik.com/products/memory-performance-profiler.aspx" target="_blank"&gt;JustTrace&lt;/a&gt;, &lt;a href="http://www.telerik.com/products/justcode.aspx" target="_blank"&gt;JustCode&lt;/a&gt;, and &lt;a href="http://www.telerik.com/products/decompiler.aspx" target="_blank"&gt;JustDecompile&lt;/a&gt; are fantastic development accelerators that should be an integral part of any serious developer’s toolset.&amp;#160; However, it was an experience with a recent software update that really set Telerik apart, in my mind, from any other software I’ve used to date.&lt;/p&gt;  &lt;p&gt;Recently, Telerik has introduced a Control Panel utility that centrally manages the installation and download of their products.&amp;#160; It’s quite handy, and saves a great deal of time and effort.&amp;#160; While I was using it to process updates yesterday, the installation of Telerik’s &lt;a href="http://www.telerik.com/products/orm.aspx" target="_blank"&gt;OpenAccess ORM&lt;/a&gt; product failed.&amp;#160; I tried to update it once or twice more, through the Control Panel, and each time it failed, I used the “Send Feedback” button—thinking that perhaps the error was due to some flaw in the update, and maybe this report would be aggregated with others to help isolate a bug.&lt;/p&gt;  &lt;p&gt;I couldn’t have been more wrong.&lt;/p&gt;  &lt;p&gt;Unlike other software vendors, Telerik takes its feedback very seriously, and those simple little buttons that relay crash data back to vendors generally does nothing helpful for the user—unless you’re using a Telerik product.&lt;/p&gt;  &lt;p&gt;Today, I received an email from Petar Raykov, in the Telerik support team, who not only personally identified my reports, but suggested—very kindly—that I should consider shutting down Visual Studio when I apply updates, because file locks were likely the cause.&lt;/p&gt;  &lt;p&gt;Man, do I feel stupid and important all in the same breath.&amp;#160; Of course, I should have known to close VS2012; but didn’t think it would be a problem since I originally installed the components on my still-present VS2010 installation.&amp;#160; However, the fact that I was personally contacted by Telerik, after using just a simple button on the product to send off exception data, astounded me.&amp;#160; Compound that with the fact that I expressed no severity or need to address this problem, and what you get is the picture of a company that just &lt;em&gt;cares&lt;/em&gt; about how its software works for &lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;Thank you, Petar.&amp;#160; Thank you, Telerik.&amp;#160; You’ve earned the highest marks in my book for quality of service and support by being proactive and concerned about the basic experience of your product.&amp;#160; I will continue to recommend your line of developer toolkits wherever I go, and share this story as I do it!&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/432-1gpfqZI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/6482200714980054760/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/10/telerik-wins-cookie.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/6482200714980054760?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/6482200714980054760?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/432-1gpfqZI/telerik-wins-cookie.html" title="Telerik wins a cookie!" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/10/telerik-wins-cookie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0AAQns5fSp7ImA9WhJSEUU.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-4652170203359781319</id><published>2012-07-01T16:29:00.001-06:00</published><updated>2012-07-01T16:29:03.525-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-01T16:29:03.525-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="microsoft crm mvp" /><title>My Third MVP Award</title><content type="html">&lt;p&gt;Microsoft graciously renewed my MVP status for 2012, as I found out today.&amp;nbsp; I don’t know why it keeps happening, but I love it and hope always to be worthy of it.&amp;nbsp; Having grown much closer to my MVP compatriots this year, more than previous years thanks to the MVP Summit, I am honored again to be placed among their ranks.&lt;/p&gt; &lt;p&gt;Ordinarily, I would have lots to say about it… but I can only thank Microsoft for yet another opportunity to continue in this capacity, and hope strongly that I will not disappoint the Dynamics CRM team in continuing to help steer the product’s development.&amp;nbsp; Also, I thank the community that has supported me all these years, and hope to be worthy in their eyes as well.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/xeOYU0Da2m8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/4652170203359781319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/07/my-third-mvp-award.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4652170203359781319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4652170203359781319?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/xeOYU0Da2m8/my-third-mvp-award.html" title="My Third MVP Award" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/07/my-third-mvp-award.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AGSHs9fip7ImA9WhVUGUk.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-5493457235080805839</id><published>2012-05-25T06:42:00.001-06:00</published><updated>2012-05-25T06:42:09.566-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-25T06:42:09.566-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="code efficiently" /><title>NDepend v4 Released</title><content type="html">&lt;p&gt;I’ve mentioned &lt;a href="http://www.ndepend.com/" target="_blank"&gt;NDepend&lt;/a&gt; a scant few times, mostly because I’ve used it in limited fashion.&amp;#160; Though &lt;a href="http://www.ndepend.com/CQL.htm" target="_blank"&gt;CQL&lt;/a&gt; was easy enough to learn, I found it difficult to quickly put together complex analytical queries against my code.&amp;#160; Patrick Smacchia answered my unannounced plight in the &lt;a href="http://www.ndepend.com/NDependV4.aspx#" target="_blank"&gt;Version 4 release of NDepend&lt;/a&gt; with the revolution that is &lt;a href="http://www.ndepend.com/Features.aspx#CQL" target="_blank"&gt;CQLinq&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;By bridging the best of the CQL and Linq worlds together, Patrick has truly delivered the most effective and rapid-use code quality tool for .Net development.&amp;#160; NDepend has moved from being a utility of convenience to a core necessity in my personal development.&amp;#160; Regardless of whether or not you have experience with code quality tools for .Net development, &lt;a href="http://www.ndepend.com/NDependDownload.aspx" target="_blank"&gt;I highly recommend investigating NDepend&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I look forward to continuing my use and integration of this latest version into my projects and using the power of CQLinq to its fullest extent.&amp;#160; Thank you, Patrick!&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/c2BpHDO_UiE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/5493457235080805839/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/05/ndepend-v4-released.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/5493457235080805839?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/5493457235080805839?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/c2BpHDO_UiE/ndepend-v4-released.html" title="NDepend v4 Released" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/05/ndepend-v4-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMDQn89fCp7ImA9WhVWF08.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-3092675519427825962</id><published>2012-04-29T13:41:00.001-06:00</published><updated>2012-04-29T13:41:13.164-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-29T13:41:13.164-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="plug-in" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 4" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><title>CRM, Cookies, and You</title><content type="html">&lt;p&gt;I went out on an adventure to find out if I could pass extra data into a web service Message from the client, and discovered that it is possible to set a cookie at the browser (or an ISV page, if you’re into that kind of thing), and pick it up inside of a Plugin.&amp;nbsp; There are a few limitations and gotchas to this process, not the least of which being that this is considered an unsupported customization.&lt;/p&gt; &lt;p&gt;However, there are often interesting needs and situations for which you may want to pass extra data along to a Plugin, but don’t really have a good way to do it.&amp;nbsp; For instance, I wanted to watch a sub-grid for changes to records and identify only those changes which were made while the parent record was opened.&amp;nbsp; In this case, I wanted to catch an array of changes once the parent record was saved, and I needed this array to be specific to the singular “session” of the form’s lifetime on the screen.&amp;nbsp; (If anyone can think of an alternate, supported method for this that doesn’t involve a ridiculous amount of return trips to CRM, I’d love to hear it.)&lt;/p&gt; &lt;p&gt;Practically speaking, I was producing a rich audit trail with contextual links to changes with related records.&amp;nbsp; Because this was for CRM 4, there was no existing audit feature as with CRM 2011—however, I’m fairly certain this process can be applied to CRM 2011 with the consideration that it may fail in sandbox mode.&lt;/p&gt; &lt;p&gt;What I did was push indicators from the child window into a JavaScript array running on the parent window.&amp;nbsp; Then, I serialized these indicators into a JSON string, and established a cookie (again, in JavaScript).&amp;nbsp; By examining the “Request.Cookies” object at the plugin (after importing the necessary namespaces), I could identify and deserialize the contents and perform work at the Plugin.&lt;/p&gt; &lt;p&gt;Also, I discovered that “Response.Cookies” can be loaded with information by an ISV page (though depreciated in CRM 2011, are still available for on-premise use) and also discovered by the Plugin.&amp;nbsp; This can effectively overload a CRM web service transaction with extra information without messy things like temporary records (which will shoot SQL indexes to hell) and extra attributes.&lt;/p&gt; &lt;p&gt;I ran into trouble, however, when trying to set a cookie from JavaScript within an ISV page.&amp;nbsp; The Plugin would not identify this cookie, and I believe it’s due to the difference in the way the browser treats cookies from the runtime versus cookies from the domain (served in the HTTP response of the ISV page).&lt;/p&gt; &lt;p&gt;So, what are the limitations and gotchas?&lt;/p&gt; &lt;ol&gt; &lt;li&gt;THIS IS AN UNSUPPORTED CUSTOMIZATION&lt;/li&gt; &lt;li&gt;CRM 2011 Plugins operating within sandbox mode will probably be prevented from accessing the “Request” or “Response” from the “Page” context.&amp;nbsp; Again, I haven’t tried this with CRM 2011 yet, but that’s the assumption I’d have to make.&lt;/li&gt; &lt;li&gt;The Plugin will only have access to the cookie from the “Page” context while operating synchronously.&lt;/li&gt; &lt;li&gt;Cookies are persistent.&amp;nbsp; Most web developers understand this, but it’s easy to forget.&amp;nbsp; Once a cookie is set, it must be forcibly removed or allowed to expire.&amp;nbsp; Never assume that a cookie will not have survived its previous instantiation.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Cookies can be a two-way street of information, so there are likely many different and exciting uses for them to extend CRM’s functionality and encourage cross-talk between various UI elements that may otherwise have no sensible means of sharing data.&amp;nbsp; If you have used Cookies with CRM before, I’d love to hear what purpose they served!&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/c-oTBUG7gUU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/3092675519427825962/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/04/crm-cookies-and-you.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/3092675519427825962?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/3092675519427825962?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/c-oTBUG7gUU/crm-cookies-and-you.html" title="CRM, Cookies, and You" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/04/crm-cookies-and-you.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMEQnk6cSp7ImA9WhVTGU0.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-4288146237401507591</id><published>2012-03-04T16:43:00.001-07:00</published><updated>2012-03-04T17:30:03.719-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-04T17:30:03.719-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crm community" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft crm mvp" /><title>So This Is What I Missed…</title><content type="html">&lt;p&gt;I’ve successfully returned alive from my attendance of the &lt;a href="http://www.2012mvpsummit.com/" target="_blank"&gt;Microsoft 2012 MVP Summit&lt;/a&gt;.&amp;#160; This was a minor concern, given that I was stricken with a bout of vertigo that still troubles me to a lesser extent today.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://crmentropy.blogspot.com/2011/02/its-been-quiet.html" target="_blank"&gt;I missed last year’s Summit&lt;/a&gt;, and was quite anxious to attend this year’s event. This extended delay in participation allowed me to accrue more familiarity with the MVP world, and the topics reserved for NDA-backed channels. Thankfully, &lt;a href="http://www.journeyteam.com/" target="_blank"&gt;JourneyTEAM&lt;/a&gt; helped me attend during one of the largest projects I’ve ever been assigned. &lt;/p&gt;  &lt;p&gt;The single greatest thing I’m looking forward to in the Dynamics CRM 2011 updates to come will be [CENSORED].&amp;#160; Sorry, folks.&amp;#160; You won’t find me spilling the beans of Geek Vegas here, because after partaking in the greatest conference of MVP minds throughout the entire world, I have found an appreciated value in my nondisclosure agreement.&lt;/p&gt;  &lt;p&gt;Many folks don’t truly understand the impact or the purpose of this Summit.&amp;#160; Even as a second-year MVP, I didn’t fully understand.&amp;#160; In fact, based solely on the stories that do make it out of this event, an outsider may believe the experience to be purely about back-patting, drinking, and self-sustaining ego building.&amp;#160; I cannot state more emphatically than in bold text the following rebuttal:&amp;#160; &lt;strong&gt;this is not the case&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;That said, I was not surprised to learn that of 55 Dynamics CRM MVPs, our attendance total was 41.&amp;#160; That means that 3 out of every 4 Dynamics CRM MVPs were at the summit, providing a voice for the community directly to the product teams.&amp;#160; We truly represented every aspect of our community, from independent developers to ISVs, from small businesses to enterprises, and from end-users to administrators.&lt;/p&gt;  &lt;p&gt;Microsoft’s product teams generally have little or selective involvement in direct customer engagement.&amp;#160; Most of Microsoft’s public-facing customer involvement comes from either partners or Microsoft Support.&amp;#160; This layer of abstraction and occlusion, though necessary, provides little for a product team by the way of direction.&amp;#160; The MVPs are representative of the entire community, and help direct Microsoft’s products through updates, versions, and feature additions.&lt;/p&gt;  &lt;p&gt;We love it.&amp;#160; It was no more apparent than during some of the more heated discussions and debates that littered the entire Summit experience.&amp;#160; Yet, at the end of the day, we all gathered at various Seattle bars to unwind with rounds of beers and drinks with umbrellas (you know who you were).&lt;/p&gt;  &lt;p&gt;This isn’t a collection or even a community of experts.&amp;#160; It’s a family.&amp;#160; And I am damn proud to take part in it.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/HYpjyDNPBtk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/4288146237401507591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/03/so-this-is-what-i-missed.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4288146237401507591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4288146237401507591?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/HYpjyDNPBtk/so-this-is-what-i-missed.html" title="So This Is What I Missed…" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/03/so-this-is-what-i-missed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEDQHwzcCp7ImA9WhRWGUs.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-8075230202928313049</id><published>2012-01-07T13:21:00.001-07:00</published><updated>2012-01-07T13:21:11.288-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-07T13:21:11.288-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="XRM Virtual" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft crm mvp" /><title>XRM Virtual Presentation</title><content type="html">&lt;p&gt;On Jan. 10th, I’ll be making a presentation along such revered Dynamics CRM MVPs as &lt;a href="https://twitter.com/#!/coloradojules"&gt;Julie Yack&lt;/a&gt;, &lt;a href="https://twitter.com/#!/scottsewell"&gt;Scott Sewell&lt;/a&gt;, &lt;a href="https://twitter.com/#!/edwardsdna"&gt;Donna Edwards&lt;/a&gt;, &lt;a href="https://twitter.com/#!/leontribe"&gt;Leon Tribe&lt;/a&gt;, &lt;a href="https://twitter.com/#!/Shan_McArthur"&gt;Shan McArthur&lt;/a&gt;, and &lt;a href="https://twitter.com/#!/mitchmilam"&gt;Mitch Milam&lt;/a&gt;.&amp;nbsp; Our topic matter will be specifically those lessons we’ve learned the hard way over our varied experiences with CRM.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.xrmvirtual.com/"&gt;XRM Virtual&lt;/a&gt; is an open-membership user group with a lean toward developers and integrators.&amp;nbsp; If you’d like to register to attend this presentation, visit the &lt;a href="http://www.xrmvirtual.com/events/mvp_lessons_CRM2011"&gt;Event Page&lt;/a&gt;.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/KHo31MaeRWI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/8075230202928313049/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/01/xrm-virtual-presentation.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8075230202928313049?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8075230202928313049?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/KHo31MaeRWI/xrm-virtual-presentation.html" title="XRM Virtual Presentation" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/01/xrm-virtual-presentation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04AQ3k-eSp7ImA9WhRWFEg.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-8634497520827370756</id><published>2012-01-01T16:19:00.001-07:00</published><updated>2012-01-01T16:19:02.751-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-01T16:19:02.751-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crm community" /><title>Google+ Page for Dynamics CRM</title><content type="html">&lt;p&gt;Lately, I’ve been trying to coalesce information streamed around various channels to which I’m attuned into a new &lt;a href="https://plus.google.com/b/117560607999887530349/"&gt;Google+ page for Dynamics CRM&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Personally, I’ve become a heavier &lt;a href="https://plus.google.com/"&gt;G+&lt;/a&gt; user than Facebook, and not just because of its rock-solid performance—but because of many important privacy and intellectual property practices.&amp;#160; I’d recommend it for anyone looking to break out of Facebook once and for all.&lt;/p&gt;  &lt;p&gt;LinkedIn is still a great professional resource for sourcing CRM talent and even assistance, so you’re sure to find great resources there too.&amp;#160; But its format and membership are rather rigidly defined compared to Facebook or Google+.&lt;/p&gt;  &lt;p&gt;In any event, I welcome any contributions and “circling” of the G+ page, and hope to make it an active and engaging space for the CRM community, apart from the &lt;a href="http://social.microsoft.com/Forums/en-US/category/dynamics"&gt;Microsoft public CRM forums&lt;/a&gt; where I can also be found.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/4mZvLvljIDw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/8634497520827370756/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2012/01/google-page-for-dynamics-crm.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8634497520827370756?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8634497520827370756?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/4mZvLvljIDw/google-page-for-dynamics-crm.html" title="Google+ Page for Dynamics CRM" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2012/01/google-page-for-dynamics-crm.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0UMQn84eCp7ImA9WhRXE04.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-6846722234938136125</id><published>2011-12-19T15:05:00.001-07:00</published><updated>2011-12-19T17:01:23.130-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-19T17:01:23.130-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="plug-in" /><category scheme="http://www.blogger.com/atom/ns#" term="code efficiently" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 4" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="xml serialization" /><title>Using XML-based Plug-in Configuration</title><content type="html">&lt;p&gt;For more complicated and feature-rich Plug-in customizations for CRM, it can be appealing to use highly dynamic configurations.&amp;nbsp; The Plug-in model offers simple string parameters to allow for the open interpretation by Plug-in developers.&amp;nbsp; One of the more efficient and flexible configuration mechanisms is XML.&lt;/p&gt; &lt;p&gt;With XML configuration, there are three methods that can be used to varying degrees of efficacy:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Hard-parsing; dissecting XML with String manipulation (useful in dire situations)  &lt;li&gt;XmlDocument parsing and node traversal; similar to JavaScript DOM manipulation and perhaps easier for web developers to grasp  &lt;li&gt;XML-serialized classes; deserializing XML into one or more strongly-typed classes that represent the configuration&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;For the purposes of this post, I’m going to focus on the method that I prefer and find superior to the others:&amp;nbsp; XML-serialized classes.&amp;nbsp; The reason I believe this is superior is for the following reasons:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Serialized classes can be versioned with namespace declarations; meaning that updating code and providing for new configuration specifications can preserve older versions  &lt;li&gt;Hard-parsing and XmlDocument traversal requires significantly more code to determine what was passed  &lt;li&gt;Serialization and deserialization work both ways; Plug-in configuration can be performed by a utility (think Silverlight!) that understands the .Net class representing the configuration, and easily construct the XML; this ability is simplified to a great extent with WCF Data Contracts (which we’ll get to in a moment)  &lt;li&gt;Hard-parsing and XmlDocument traversal code requires more effort to update or alter the configuration schema  &lt;li&gt;Hard-parsing and XmlDocument traversal work better in situations when the XML document and its contents are either  &lt;ol&gt; &lt;li&gt;Very simple and statically defined  &lt;li&gt;Totally unknown and dynamic&lt;/li&gt;&lt;/ol&gt; &lt;li&gt;Serialized classes define a rigid standard and schema for the configuration, but also offer a significant amount of flexibility while simplifying the interpretation of the configuration&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;As a caveat, I should state that I’m extremely comfortable with XmlDocument use.&amp;nbsp; I’ve used it many times, and found it a natural fit for my long experience with JavaScript DOM programming.&amp;nbsp; However, I recently implemented a project that needed a highly structured and very robust configuration model, and decided to look for ways to reduce the amount of code I needed to write.&amp;nbsp; Additionally, I needed the process to be flexible, as I might change my mind about the operational needs from the configuration as the code evolved.&lt;/p&gt; &lt;p&gt;Starting with the concept of deserializing .Net classes from XML, I searched for the best method of implementation for CRM that I could identify.&amp;nbsp; I found that there are a few ways within the .Net framework to serialize and deserialize classes into and from XML.&amp;nbsp; Some are more flexible than others, but the CRM platform offers unique challenges that pretty much made my answer for me:&amp;nbsp; WCF Data Contracts.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/"&gt;Why WCF Data Contracts?&lt;/a&gt;&amp;nbsp; Well, I like to deploy my assemblies to the database.&amp;nbsp; This is a practice that helps assure the interoperability of my code with CRM Online.&lt;/p&gt; &lt;p&gt;The problem with traditional, old-school XmlSerializer methods is that .Net requires the original assembly to be file-system accessible in order to reference for compilation into a “[foo].XmlSerializers.dll” assembly.&amp;nbsp; If you really didn’t know what these assemblies were (as I didn’t) before now, allow me to explain.&amp;nbsp; The XmlSerializer routines require strongly-typed interpretive classes that are Reflected out of the original assembly and built “on-the-fly” by the .Net CLR.&amp;nbsp; It cannot achieve this with assemblies that exist only in memory, as database-deployed assemblies are.&amp;nbsp; Therefore when CRM attempts to deserialize by calling these interpretive classes, they don’t exist—causing an “Object Is Not An Instance” exception.&lt;/p&gt; &lt;p&gt;Experienced developers know that these XmlSerializer assemblies don’t have to be built “on-the-fly”, and they can certainly be assembled and distributed in conjunction with the original assembly.&amp;nbsp; However, CRM doesn’t support a shared-assembly model for database deployment.&amp;nbsp; The assemblies could be deployed to disk or GAC, but again this isn’t compatible with CRM Online.&lt;/p&gt; &lt;p&gt;If you’re thinking, as I did, that perhaps the assemblies can be merged together with ILmerge and deployed together, think again.&amp;nbsp; ILmerge generates a new AssemblyId attribute for the combined assembly metadata—which is only a problem for a the “[foo].XmlSerializers.dll” assembly because it strictly validates the AssemblyId of the calling code; and it imprints on the original assembly.&lt;/p&gt; &lt;p&gt;Before I discovered WCF Data Contracts, I was desperate enough to output the generated code for the XmlSerializer assembly and inject it into my project.&amp;nbsp; This is as ugly and highly ill-advised as it is time-consuming.&amp;nbsp; So, if you’re considering XML configuration for CRM Plug-ins, I strongly recommend using WCF Data Contracts.&lt;/p&gt; &lt;p&gt;For more reading, see &lt;a href="http://msdn.microsoft.com/en-us/library/ms733127.aspx"&gt;the MSDN Article on WCF Data Contracts&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Some tricky “gotchas” with using WCF Data Contracts for newbies:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The order of XML nodes must be alphabetically ordered by their declared Data Contract name; this is a deserialization optimization requirement, and can be massaged to a certain extent &lt;a href="http://msdn.microsoft.com/en-us/library/ms729813.aspx"&gt;by using advanced Data Contract directives&lt;/a&gt;.  &lt;li&gt;There are no deserialized “attributes” for XML nodes.&amp;nbsp; The only supported XML-node attributes are namespace declarations.&amp;nbsp; Every Data Member is its own node, and its contents become the deserialized value.&lt;/li&gt;&lt;/ul&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/QQcZ-ka4eLg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/6846722234938136125/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/12/using-xml-based-plug-in-configuration.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/6846722234938136125?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/6846722234938136125?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/QQcZ-ka4eLg/using-xml-based-plug-in-configuration.html" title="Using XML-based Plug-in Configuration" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>4</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/12/using-xml-based-plug-in-configuration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08GQHo4fip7ImA9WhRTE04.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-1194127452876035124</id><published>2011-11-03T09:57:00.001-06:00</published><updated>2011-11-03T09:57:01.436-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-03T09:57:01.436-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crm 4" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="grid editor" /><title>Call for Comments: CRM 2011 Grid Editor</title><content type="html">&lt;p&gt;One of the primary sources of traffic to my blog comes from my &lt;a href="http://crmentropy.blogspot.com/p/javascript-grid-editor.html"&gt;CRM 4 Grid Editor utility&lt;/a&gt;.&amp;nbsp; Every day, it seems, some new visitor lands on my blog (according to Google Analytics) looking for this project.&amp;nbsp; It seems to me, then, that the sooner I can update the utility to work with CRM 2011, the less disappointed these visitors may be.&lt;/p&gt; &lt;p&gt;First and foremost, I’d like to make a solemn announcement:&amp;nbsp; &lt;strong&gt;I will no longer continue development on the CRM 4 Grid Editor&lt;/strong&gt;.&amp;nbsp; It’s reign started rather late in the CRM 4 life-cycle, and now that we’re well into CRM 2011’s life-cycle, I don’t see much benefit from continuing to develop it.&amp;nbsp; For those who patiently waited for many bug fixes and feature enhancements, I apologize.&amp;nbsp; Regular readers of this space know &lt;a href="http://crmentropy.blogspot.com/2011/02/its-been-quiet.html"&gt;why I had to drop the project&lt;/a&gt; at the beginning of the year, and the unfortunate side-effect culminates with this announcement.&lt;/p&gt; &lt;p&gt;All is not for naught, however, as I intend to start very soon on the CRM 2011 Grid Editor update.&amp;nbsp; In light of the experience I’ve had with implementers of the CRM 4 version, I’ve come to a few design decisions about the update that will impact the product overall:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;I will no longer “hack” the CRM Grid control in an unsupported fashion.&lt;/li&gt; &lt;li&gt;I will no longer reuse CRM input controls in an unsupported fashion.&lt;/li&gt; &lt;li&gt;I will provide all of the feature enhancements and bug fixes that I had originally intended for the CRM 4 Grid Editor.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Understandably, these decisions will impact the total amount of time necessary to develop this project—but I may not be alone.&amp;nbsp; Finally, I may actually have some help from interested contributors within the ranks of Microsoft.&amp;nbsp; This kind of collaboration excites me, because it means that the turn-around for development could be much quicker and the end-result should be more uniform with the overall CRM experience.&lt;/p&gt; &lt;p&gt;The purpose of this announcement is to solicit comments from you about the features you would like to see from this effort, and the relative importance you might place upon them.&amp;nbsp; If you’ve used the CRM 4 Grid Editor, then you’ll be in a good position to know what has already been accomplished.&amp;nbsp; If not, however, I still want to hear your feedback.&lt;/p&gt; &lt;p&gt;So, kick me some comments below in this early, planning phase of the project so I can give appropriate consideration to the needs of the Dynamics CRM community.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/B9zpAfMSMDg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/1194127452876035124/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/11/call-for-comments-crm-2011-grid-editor.html#comment-form" title="24 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/1194127452876035124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/1194127452876035124?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/B9zpAfMSMDg/call-for-comments-crm-2011-grid-editor.html" title="Call for Comments: CRM 2011 Grid Editor" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>24</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/11/call-for-comments-crm-2011-grid-editor.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMFSXg9eCp7ImA9WhdbGU8.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-3010220268384014304</id><published>2011-10-18T01:53:00.001-06:00</published><updated>2011-10-18T01:53:38.660-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-18T01:53:38.660-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CRMUG" /><category scheme="http://www.blogger.com/atom/ns#" term="itdiots" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 4" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><title>Upgrade CRM 4 to 2011: For ITdiots</title><content type="html">&lt;h3&gt;Q: Who’s an ITdiot?&amp;nbsp; A: Me.&lt;/h3&gt; &lt;p&gt;I’ve been involved in the IT world since my early teen years.&amp;nbsp; It started as the family computer expert, and evolved into advanced circuit configuration for ISPs and eventually a fulltime network administrator gig.&amp;nbsp; All the while, I nurtured and evolved my passion for development.&lt;/p&gt; &lt;p&gt;Ordinarily, this blog is dedicated to the later talent and my trials and tribulations therewith.&amp;nbsp; However, I cannot deny that the foundations of my career and experience have solid roots in the IT realm.&amp;nbsp; Having never acquired any formal education for either talent is what makes me, your friendly (mostly) neighborhood CRM MVP, an ITdiot.&lt;/p&gt; &lt;p&gt;If it weren’t for Google, I wouldn’t have much of a career.&amp;nbsp; While some things in the IT world have become intrinsically intuitive, I would be remiss to ignore the fact that my first real job at an Internet Helpdesk left me puzzled for longer than I care to admit as to why “.net” or “.org” worked to execute things on the computer, and “.com” was so much more prevalent than “.exe”.&lt;/p&gt; &lt;p&gt;At any rate, I recently gave &lt;a href="http://www.crmug.com/events/CRMUGITSupport10142011" target="_blank"&gt;a presentation for CRMUG geared toward the IT Crowd&lt;/a&gt;—not the British comedy (although if you’re in IT and haven’t yet seen it, you &lt;a href="http://www.imdb.com/title/tt0487831/" target="_blank"&gt;should&lt;/a&gt;), but my &lt;em&gt;people&lt;/em&gt;.&amp;nbsp; So, the following guide complements that presentation and the material I covered, and all that I had wished to cover but ran out of time for.&amp;nbsp; This is a basic list of the considerations I make when considering the move from CRM 4 to CRM 2011.&lt;/p&gt; &lt;h3&gt;CRM 2011 On-Premise Upgrade Requirements&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Windows Server 2008 SP2 or R2; 64-bit&lt;/li&gt; &lt;li&gt;SQL Server 2008 SP1; 64-bit&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Recommend a different SQL server than what hosts CRM 4 (otherwise, it will upgrade the CRM 4 configuration and default org databases in-place)&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Removal of any unsupported customizations (see IRAD at bottom)&lt;/li&gt; &lt;li&gt;An active CRM Administrator account &lt;a href="http://www.crmsoftwareblog.com/2011/07/user-mapping-error-upgrading-to-microsoft-dynamics-crm-2011/"&gt;http://www.crmsoftwareblog.com/2011/07/user-mapping-error-upgrading-to-microsoft-dynamics-crm-2011/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;What about Online?&lt;/h3&gt; &lt;h5&gt;Pros:&lt;/h5&gt; &lt;ul&gt; &lt;li&gt;Reduced IT overhead; from infrastructure to support&lt;/li&gt; &lt;li&gt;Reduced deployment timeframe&lt;/li&gt; &lt;li&gt;Automatic/Scheduled updating&lt;/li&gt; &lt;ul&gt; &lt;li&gt;“Scheduled” becomes “Automatic” within a year&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Aligns with Office 365 and SharePoint Online&lt;/li&gt; &lt;li&gt;Provides an easy to use Internet Lead Capture feature&lt;/li&gt; &lt;li&gt;Can be redeployed as 2011 On-Premise &lt;li&gt;Federated authentication is just around the corner (R7; Q4 2011 Service Update)&lt;/li&gt;&lt;/ul&gt; &lt;h5&gt;Cons:&lt;/h5&gt; &lt;ul&gt; &lt;li&gt;May not be ideal for integrated systems (ERP, Accounting, etc)&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Limited functionality connecting from CRM to external resource&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;No support for custom Workflow actions&lt;/li&gt; &lt;li&gt;Limits on number of Workflows and custom entities (200?)  &lt;li&gt;Externally hosted email router (on-premise, hosting provider)&lt;/li&gt; &lt;li&gt;FetchXML reports only&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Helpful Overviews&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;The Official Word &lt;a href="http://technet.microsoft.com/en-us/library/gg554717.aspx"&gt;http://technet.microsoft.com/en-us/library/gg554717.aspx&lt;/a&gt; &lt;li&gt;Business and Technical Impact Considerations &lt;a href="http://blog.sonomapartners.com/2011/04/upgrading-to-crm-2011-our-story.html"&gt;http://blog.sonomapartners.com/2011/04/upgrading-to-crm-2011-our-story.html&lt;/a&gt; &lt;li&gt;Step-by-step guide &lt;a href="http://weblogs.asp.net/pabloperalta/archive/2010/11/01/step-by-step-installing-crm-2011-on-premise-and-migrating-from-dynamics-crm-4-0-32-bits-on-premise.aspx"&gt;http://weblogs.asp.net/pabloperalta/archive/2010/11/01/step-by-step-installing-crm-2011-on-premise-and-migrating-from-dynamics-crm-4-0-32-bits-on-premise.aspx&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Upgrade Methods&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Direct upgrade&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Universally considered the riskiest route&lt;/li&gt; &lt;li&gt;Fastest/easiest option for GAC-deployed custom assemblies&lt;/li&gt; &lt;li&gt;Use virtual machines for Intermediary transition to land CRM 4, and good testing space for CRM 2011: &lt;a href="http://rondegiusti.wordpress.com/2011/03/01/steps-when-upgrading-migrating-from-ms-crm-4-to-crm-2011/"&gt;http://rondegiusti.wordpress.com/2011/03/01/steps-when-upgrading-migrating-from-ms-crm-4-to-crm-2011/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Import CRM 4 Org to virgin CRM 2011 install ("Microsoft Migration")&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Universally considered the safest route&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt; &lt;li&gt;Allows you to reserve a backup database copy and perform the import several times if necessary to massage the process for heavily customized CRM 4 environments&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt; &lt;li&gt;Doesn't import GAC and Disk deployed custom assemblies&lt;/li&gt;&lt;/ul&gt; &lt;ul&gt; &lt;li&gt;Least impact to production environment and faster than using VMs &lt;li&gt;Requires some work to avoid the limitation of importing an org once &lt;a href="http://www.dynamicscrmtrickbag.com/2011/04/08/migrating-from-crm-4-0-to-dynamics-crm-2011/"&gt;http://www.dynamicscrmtrickbag.com/2011/04/08/migrating-from-crm-4-0-to-dynamics-crm-2011/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Integration utility to ship CRM 4 data (Scribe, InaPort) &lt;a href="http://blogs.msdn.com/b/crm/archive/2011/09/30/using-inaplex-inaport-for-data-integration-with-microsoft-dynamics-crm.aspx"&gt;http://blogs.msdn.com/b/crm/archive/2011/09/30/using-inaplex-inaport-for-data-integration-with-microsoft-dynamics-crm.aspx&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Handy for selective data import, obsoleting customizations that were problematic or could use changing&lt;/li&gt; &lt;li&gt;Difficult to ship CRM 4 custom assemblies (use the CRM 4 Plugin Export utility to help)&lt;/li&gt; &lt;li&gt;In short: a great way to break the "direct update" chain&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;h3&gt;Social Experiences&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;New Outlook Client behaviors: &lt;a href="http://niiranen.eu/crm/2011/03/upgrade-gotchas-outlook-client-for-dynamics-crm-2011/"&gt;http://niiranen.eu/crm/2011/03/upgrade-gotchas-outlook-client-for-dynamics-crm-2011/&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Opt for 32-bit over 64-bit Outlook Client, at least for a while&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Silverlight compatibility issue; until Silverlight 5 rolls out. Many Marketplace solutions and customizations using Silverlight may not work in 64-bit Outlook.&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;No more favorite folders&lt;/li&gt; &lt;ul&gt; &lt;li&gt;To restore, one must disable the Outlook 2010 Solutions module; this may also impact Marketplace solutions or desired functionality&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Windows Live Essentials&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Avoid using, or be prepared repair installations of its component&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;li&gt;Old Outlook Client behaviors: &lt;a href="http://blogs.msdn.com/b/ukcrm/archive/2011/04/22/crm-4-0-client-upgrade-to-crm-2011.aspx"&gt;http://blogs.msdn.com/b/ukcrm/archive/2011/04/22/crm-4-0-client-upgrade-to-crm-2011.aspx&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;UR7 is compatible with CRM 2011 &lt;li&gt;Offline functionality is disabled&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Moving from CRM 4 Online to CRM 2011 On-Premise: &lt;a href="http://www.magnetism.co.nz/blog/11-04-15/Issues_Upgrading_from_Dynamics_CRM_4_0_to_2011.aspx"&gt;http://www.magnetism.co.nz/blog/11-04-15/Issues_Upgrading_from_Dynamics_CRM_4_0_to_2011.aspx&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Be sure to check that On-Premise users exist for mapping &lt;li&gt;Administrator account mapping should be manually mapped for accuracy&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;CRM 2011 may throw JavaScript errors, even when CRM 4 wasn't customized with JavaScript: &lt;a href="http://blogs.msdn.com/b/emeadcrmsupport/archive/2011/08/31/crm-2011-form-errors-when-opening-non-customised-forms-object-doesn-t-support-property-or-method-form-load.aspx"&gt;http://blogs.msdn.com/b/emeadcrmsupport/archive/2011/08/31/crm-2011-form-errors-when-opening-non-customised-forms-object-doesn-t-support-property-or-method-form-load.aspx&lt;/a&gt;&lt;/li&gt; &lt;ul&gt; &lt;li&gt;A RewriteModule problem may exist in IIS 7, and need to be reinstalled&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;h3&gt;Personal Upgrade Process&lt;/h3&gt; &lt;ul&gt; &lt;li&gt;Avoiding more than one direct upgrade&lt;/li&gt; &lt;ul&gt; &lt;li&gt;Never upgrade from CRM 3 to CRM 4 and then to CRM 2011; always make a clean break somewhere in the chain to avoid esoteric issues caused by upgrades daisy-chained this way&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;Wait for first adopters to uncover problems (sorry first adopters!)&lt;/li&gt; &lt;li&gt;Virtual Machines!&lt;/li&gt; &lt;ul&gt; &lt;li&gt;VMs are your IT friend.&amp;nbsp; If you don’t think you can afford it, go grab &lt;a href="http://downloads.vmware.com/d/info/datacenter_cloud_infrastructure/vmware_vsphere_hypervisor_esxi/5_0" target="_blank"&gt;VMWare ESXi&lt;/a&gt;—it’s free, man&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;[IRAD] unsupported customizations&lt;/li&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Identify&lt;/strong&gt;: know where you’re currently using them, and what they do&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Remove&lt;/strong&gt;: eliminate them to avoid upgrade issues&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Analyze&lt;/strong&gt;: determine whether or not new functionality allows you to replace them with supported customizations/features&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Deploy&lt;/strong&gt;: after the upgrade, update and redeploy any unsupported customizations deemed necessary for business&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/WWW3tAVVZfs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/3010220268384014304/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/10/upgrade-crm-4-to-2011-for-itdiots.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/3010220268384014304?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/3010220268384014304?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/WWW3tAVVZfs/upgrade-crm-4-to-2011-for-itdiots.html" title="Upgrade CRM 4 to 2011: For ITdiots" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/10/upgrade-crm-4-to-2011-for-itdiots.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMMRH49cCp7ImA9WhdbEEs.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-3764091997844816963</id><published>2011-10-08T02:28:00.001-06:00</published><updated>2011-10-08T02:28:05.068-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-08T02:28:05.068-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crm community" /><title>Farewell, Jim Glass</title><content type="html">&lt;p&gt;With &lt;a href="http://blogs.msdn.com/b/jim_glass/archive/2011/10/06/goodbye-microsoft-hello-world.aspx"&gt;Jim’s recent announcement of his retirement from Microsoft&lt;/a&gt;, I thought I’d make a little space here to immortalize my thoughts of a man I never got to meet in person, but dearly wished to.&lt;/p&gt;  &lt;p&gt;There’s something to be said about the Dynamics CRM community: chiefly that it is the most vibrant and active product community around any single Microsoft product.&amp;#160; Why? Two reasons:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;As I have long believed and been rewarded for such faith, it is simply the best product Microsoft has ever brought to market (that isn’t an Operating System); and&lt;/li&gt;    &lt;li&gt;Fantastic community leadership, fostering an open, engaging dialog between the users of the product and the experts that know it.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Jim Glass is directly responsible for both.&amp;#160; There’s no objective way for me to quantify that, however, so take that declaration as the biased opinion of one happy CRM MVP.&lt;/p&gt;  &lt;p&gt;I’ve never known a CRM world without Jim, and long before I entered the MVP space, I met Jim on the battlegrounds we call the public CRM forums.&amp;#160; Jim was always watching, carefully moderating and steering the forum to productive ends.&amp;#160; He encouraged the MVPs, on a regular basis, to contribute and participate with the community at large—and the forums were just that.&lt;/p&gt;  &lt;p&gt;There is no mistaking the emptiness that I feel now that I know he’s gone, and I wait patiently for his successor to fill his space as best as possible (daunting though that may be).&amp;#160; Since I never had the opportunity to pay my respects and give my appreciation to Jim in person, I find myself obligated by duty to honor his legacy by applying myself to the forums in a way I know he would wish.&lt;/p&gt;  &lt;p&gt;Those who knew Jim understand the impact and the gravity his absence will generate.&amp;#160; Those who didn’t, may never understand what he did to improve their experience with CRM, the product or the community.&amp;#160; In some small way, I wish I could impart that feeling; but I doubt I have the raw ability to put in words what Jim has done, for me—for us.&amp;#160; I will miss him, and follow his social publications with great interest.&lt;/p&gt;  &lt;p&gt;Farewell, Jim. To have known you from afar, is better than to never have known you at all.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“To leave, or not to leave--that is the question.       &lt;br /&gt;Whether ‘tis nobler in the mind to suffer        &lt;br /&gt;The pings and queries of MVP misfortune        &lt;br /&gt;Or to take charms against a sea of blogs        &lt;br /&gt;And by composing, mend them. To pry, to seek—        &lt;br /&gt;No more—and by seek to say we end        &lt;br /&gt;The madness, and the thousand natural questions        &lt;br /&gt;An MVP is heir to.”&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/n8hUaBdjinI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/3764091997844816963/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/10/farewell-jim-glass.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/3764091997844816963?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/3764091997844816963?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/n8hUaBdjinI/farewell-jim-glass.html" title="Farewell, Jim Glass" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/10/farewell-jim-glass.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4ERHg6eCp7ImA9WhdUEUo.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-5177352858356365138</id><published>2011-09-27T20:58:00.001-06:00</published><updated>2011-09-27T21:01:45.610-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-27T21:01:45.610-06:00</app:edited><title>60k Page Views!</title><content type="html">&lt;p&gt;When I first started this blog, I really didn’t expect it to take me anywhere.&amp;nbsp; I just wanted a neat little place to post my code, a place that would follow me wherever I went and be a sounding board for whatever I thought (about CRM).&lt;/p&gt; &lt;p&gt;This evening, while following up on my social activities (forum contributions, blog reading, and that Twitter thing), I discovered that the ticker on my page-view counter rolled past 60 thousand.&amp;nbsp; A number I would never have expected.&amp;nbsp; This comes on the tail of passing my first Microsoft Certification Exam.&amp;nbsp; (I’m finally an MCP, too!)&lt;/p&gt; &lt;p&gt;Now, I’m not one to relish in popularity.&amp;nbsp; I’m a pretty shy and reserved person.&amp;nbsp; So, the only thing I hope to take from this statistic is that I have hopefully helped many Dynamics CRM implementers and developers who have come here looking for help (or free code *wink*).&lt;/p&gt; &lt;p&gt;If you have found value in this space, I’d love to hear about it.&amp;nbsp; That kind of thing is what encourages me to contribute—and with more frequency.&lt;/p&gt; &lt;p&gt;On a positive note, I may start posting more frequently in this space (and others) regarding some very exciting learning opportunities that are coming my way in the near future.&amp;nbsp; There will be unique challenges that I’ll get to address with CRM, and my company, &lt;a href="http://www.journeyteam.com" target="_blank"&gt;JourneyTEAM&lt;/a&gt;, has given me motivation to contribute the value from my experiences with you, my audience.&lt;/p&gt; &lt;p&gt;So, thank you for your readership.&amp;nbsp; I hope I have given you useful and helpful information, and a better idea of how to squeeze great things from Dynamics CRM.&lt;/p&gt; &lt;p&gt;&lt;a href="http://lh4.ggpht.com/-w7qZRiOaqAQ/ToKOFtIbT1I/AAAAAAAAAQ8/i1F9MvH_bNw/s1600-h/September%2525202011%252520Stats%25255B5%25255D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="September 2011 Stats" border="0" alt="September 2011 Stats" src="http://lh6.ggpht.com/-of54SrhsXWg/ToKOGPpTPyI/AAAAAAAAARA/w61kpLqS9JM/September%2525202011%252520Stats_thumb%25255B3%25255D.png?imgmax=800" width="492" height="217"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/ERFXXz7Hq7Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/5177352858356365138/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/09/60k-page-views.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/5177352858356365138?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/5177352858356365138?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/ERFXXz7Hq7Y/60k-page-views.html" title="60k Page Views!" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-of54SrhsXWg/ToKOGPpTPyI/AAAAAAAAARA/w61kpLqS9JM/s72-c/September%2525202011%252520Stats_thumb%25255B3%25255D.png?imgmax=800" height="72" width="72" /><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/09/60k-page-views.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4EQXk_eCp7ImA9WhdVE0o.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-4418925772401381464</id><published>2011-09-17T06:12:00.001-06:00</published><updated>2011-09-18T14:48:20.740-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-18T14:48:20.740-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="book review" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft crm mvp" /><title>Review: CRM 2011 Administration Bible</title><content type="html">&lt;p&gt;Publisher: &lt;a href="http://www.wiley.com/WileyCDA/"&gt;Wiley&lt;/a&gt; &lt;br&gt;Authors: &lt;a href="http://www.linkedin.com/in/mattwittemann"&gt;Matt Wittemann&lt;/a&gt;, &lt;a href="http://www.linkedin.com/in/customerrelationshipmanagement"&gt;Geoff Ables&lt;/a&gt; &lt;br&gt;CRM Entropy Rating (in Baked Goods): 3.1415926535897&lt;/p&gt; &lt;p&gt;Matt, a fellow CRM MVP, sent me a copy of this book a long time ago, and I’ve pretty much only used it for reference material here and there until recently.&amp;nbsp; I’ve read a handful of &lt;a href="http://www.amazon.com/s/ref=nb_sb_noss?field-keywords=crm+4&amp;amp;url=search-alias%3Dstripbooks&amp;amp;x=0&amp;amp;y=0"&gt;CRM 4 books&lt;/a&gt; in my day, and found a great deal of helpful information from them.&amp;nbsp; The &lt;a href="http://www.amazon.com/Microsoft-Dynamics-2011-Administration-Bible/dp/0470568143/ref=cm_cr_pr_pb_t"&gt;Microsoft Dynamics CRM 2011 Administration Bible&lt;/a&gt; marks my first in-depth read relating to CRM 2011.&lt;/p&gt; &lt;p&gt;The title of this book is both accurate and misleading—and I don’t mean from a theological standpoint.&amp;nbsp; (Though I imagine, given the apologist forewords by Matt and Geoff, the word “God” was uttered on multiple occasions with various modifiers during its authoring.)&amp;nbsp; This book is indeed a Bible in the sense that it combines a complete picture of CRM, from URL to SQL, from Form to Filter, and from Dialog to Migration.&amp;nbsp; It really has it all.&lt;/p&gt; &lt;p&gt;However, don’t let the word “Administration” throw you for a loop.&amp;nbsp; This book isn’t geared specifically for administrators of any kind, and it doesn’t just cover administration.&amp;nbsp; It’s so thoroughly educational on the core processes of CRM, I dare say that it is the first and last book you’ll need for Microsoft Dynamics CRM 2011 (see my “Bible” comment above).&amp;nbsp; Matt and Geoff take special care to make every reader an Administrator.&amp;nbsp; And that’s why the damn thing is so thick!&amp;nbsp; (Caution: Ordering more than 3 of these books at a time involves &lt;em&gt;freight &lt;/em&gt;charges.&lt;sup&gt;*&lt;/sup&gt;)&lt;/p&gt; &lt;p&gt;The machines with which this Bible was written have long surrendered their keyboards to a higher power.&amp;nbsp; The material is dense and enriching not only for newcomers to the CRM experience, but for those arriving to CRM 2011 looking for what changed from the previous version—like myself.&amp;nbsp; As with a religious text, you’ll find yourself engaged in the index or table of contents quite a bit, if you’re working with CRM already.&amp;nbsp; But, you will find value throughout the areas you don’t think you need to read.&lt;/p&gt; &lt;p&gt;This book will teach you all of the standard features that come with Dynamics CRM out-of-the-box, and then open your mind to the possibilities of custom enrichment.&amp;nbsp; It wouldn’t be a book to &lt;em&gt;buy&lt;/em&gt; if you’re only investigating Dynamics CRM (though it wouldn’t hurt to read); but it is an essential part of any CRM implementation, and its material is useful to every deployment and use of CRM that I can think of.&lt;/p&gt; &lt;p&gt;So, from this digital pulpit, I preach from one Bible, and that is the &lt;a href="http://www.amazon.com/Microsoft-Dynamics-2011-Administration-Bible/dp/0470568143/ref=cm_cr_pr_pb_t"&gt;Microsoft Dynamics CRM 2011 Administration Bible&lt;/a&gt;!&amp;nbsp; If you have Dynamics CRM, do yourself a favor and have this book, too.&lt;/p&gt; &lt;p&gt;&lt;font size="1"&gt;&lt;sup&gt;*&lt;/sup&gt; I’m kidding!&amp;nbsp; But really, you do get more words for your dollar… and the most helpful ones to boot!&lt;/font&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/cBW_3akUsh4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/4418925772401381464/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/09/review-crm-2011-administration-bible.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4418925772401381464?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4418925772401381464?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/cBW_3akUsh4/review-crm-2011-administration-bible.html" title="Review: CRM 2011 Administration Bible" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/09/review-crm-2011-administration-bible.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEADRnc5eSp7ImA9WhdWGUo.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-8413882804421413982</id><published>2011-09-13T23:06:00.001-06:00</published><updated>2011-09-13T23:06:17.921-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-13T23:06:17.921-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="code efficiently" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="web services" /><category scheme="http://www.blogger.com/atom/ns#" term="wsdl" /><title>CRM 2011 and WSDL</title><content type="html">&lt;p&gt;CRM 2011 makes a dramatic change with the WSDL implementation compared to CRM 4.0.&amp;nbsp; The biggest difference?&amp;nbsp; The WSDL file you download is not a full definition of the service (for either Discovery or Organization).&amp;nbsp; &lt;/p&gt; &lt;p&gt;Instead it’s a very small and self-conscious (“lightweight”) WSDL that points back to the same service (and host) with &lt;a href="http://www.w3.org/TR/wsdl20-primer/#adv-import-and-authoring"&gt;an import directive&lt;/a&gt; for the full WSDL.&amp;nbsp; What does this accomplish?&amp;nbsp; Well, WSDL-imports are supposed to allow a WSDL definition to be modular with reusable and multi-authored definitions.&amp;nbsp; We really don’t see that being applied in CRM’s case in any sensible fashion (like importing out-of-the-box entity/attribute definitions separately from custom ones, or importing WSDLs with Solution-based scopes).&amp;nbsp; All it seems to do is complicate the retrieval of information we need for our application.&lt;/p&gt; &lt;p&gt;So, if you prefer or require the late-bound Entity class, and you don’t have local access to a CRM system.&amp;nbsp; Having &lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/how-to-get-full-wsdl-schema-for-organization-service-in-microsoft-dynamics-crm-2011.aspx"&gt;a “full” WSDL file&lt;/a&gt; could help when you want to avoid…&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;…deployment of the CRM DLLs.&lt;/strong&gt;&amp;nbsp; This may be important when single-assembly functionality is imperative and assembly dependency deployment is a serious headache, such as CLR operations from SQL for integration projects.&amp;nbsp; Or maybe the target system doesn’t use or support .Net.  &lt;li&gt;&lt;strong&gt;…the code-generation tool.&lt;/strong&gt;&amp;nbsp; Let’s face it, the code-generation tool is nice for simple and quick developments, there’s no argument about the excellence of many of its Utility methods.&amp;nbsp; However, it produces a &lt;em&gt;lot&lt;/em&gt; more code than many will ever use—&lt;a href="http://erikpool.blogspot.com/2011/03/filtering-generated-entities-with.html"&gt;artificially inflating the assembly size unnecessarily&lt;/a&gt;.&amp;nbsp; And the code it produces isn’t without &lt;a href="http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/b85fa144-1d58-4a31-8280-bcfe63b10e39#ee436696-4490-42cd-8c4e-44029ffc7af9"&gt;its&lt;/a&gt; &lt;a href="http://community.adxstudio.com/Default.aspx?DN=9a7499fb-4e9a-408c-8096-6d658f9509a2"&gt;own&lt;/a&gt; &lt;a href="http://www.shrpr.org/2011/01/crmsvcutil-generates-classes-that-are.html"&gt;bugs&lt;/a&gt;.&amp;nbsp; Sometimes keeping things simple is its own reward.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;So, when you need to have the “full” WSDL file, for your services, use links formatted like so:&lt;/p&gt; &lt;h3&gt;Discovery Service&lt;/h3&gt; &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;pre id="codeSnippet" class="csharpcode"&gt;http[s]://&amp;lt;crmServer&amp;gt;/&amp;lt;crmOrg&amp;gt;/XRMServices/2011/Discovery.svc?wsdl=wsdl0&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;
&lt;h3&gt;Organization Service&lt;/h3&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;pre id="codeSnippet" class="csharpcode"&gt;http[s]://&amp;lt;crmServer&amp;gt;/&amp;lt;crmOrg&amp;gt;/XRMServices/2011/Organization.svc?wsdl=wsdl0&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/LhsjHYHYFXk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/8413882804421413982/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/09/crm-2011-and-wsdl.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8413882804421413982?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8413882804421413982?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/LhsjHYHYFXk/crm-2011-and-wsdl.html" title="CRM 2011 and WSDL" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/09/crm-2011-and-wsdl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MFQX0_cCp7ImA9WhBWGE0.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-4858466772702998678</id><published>2011-09-12T15:52:00.001-06:00</published><updated>2013-04-12T16:23:30.348-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-12T16:23:30.348-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="form customization" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="ui customization" /><title>DOM Events and CRM 2011</title><content type="html">[&lt;b&gt;UPDATED&lt;/b&gt;: 2013.04.11 I've learned a lot since this premature post, and have struck out all the incorrect information.] &lt;br /&gt;
&lt;br /&gt;
Recently, another MVP asked in a private forum how one might connect to the “onclick” event of a CRM field.&amp;nbsp; With the new &lt;b&gt;Xrm.Page&lt;/b&gt; namespace object model, it seemed that all references to the actual DOM element of the control were lost (or at least, very well hidden).&amp;nbsp; Well, I did some poking around, and I discovered &lt;strike&gt;two&lt;/strike&gt; one thing&lt;strike&gt;s&lt;/strike&gt;:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strike&gt;&lt;b&gt;Xrm.Page&lt;/b&gt; lives only within the scope of web-resources and their execution (wherever and however they are scripted to occur); this means that the old days of firing up the IE Developer Toolbar to hack CRM on-the-fly are gone&lt;/strike&gt;.&lt;/li&gt;
&lt;li&gt;The DOM elements are buried in undocumented members of the &lt;a href="http://msdn.microsoft.com/en-us/library/gg334266.aspx"&gt;control&lt;/a&gt; object (as opposed to the &lt;a href="http://msdn.microsoft.com/en-us/library/gg334409"&gt;attribute&lt;/a&gt; object).&amp;nbsp; As a consequence, the following hack is unsupported&lt;strike&gt;, but also much easier to implement than the supported method of using a Web Resource to present your own custom controls that drive, in the background, CRM’s native controls&lt;/strike&gt;.&lt;/li&gt;
&lt;/ol&gt;
So, here’s the method I found to achieve access to the DOM element control container, and how to assign a new “onclick” handler to it:&lt;br /&gt;
&lt;div class="csharpcode-wrapper" id="codeSnippetWrapper"&gt;
&lt;pre class="csharpcode" id="codeSnippet"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; controlname = &lt;span class="str"&gt;"ownerid"&lt;/span&gt;; &lt;span class="rem"&gt;// The "Owner" field, as an example&lt;/span&gt;

&lt;span class="kwrd"&gt;function&lt;/span&gt; myFunction ()
{
alert(&lt;span class="str"&gt;"I have been clicked"&lt;/span&gt;);
}

Xrm.Page.getControl(controlName)[“_control”][“_element”].attachEvent(‘onclick’, myFunction);&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
Wasn’t that easy?&lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/7MCSrN42J7I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/4858466772702998678/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/09/dom-events-and-crm-2011.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4858466772702998678?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4858466772702998678?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/7MCSrN42J7I/dom-events-and-crm-2011.html" title="DOM Events and CRM 2011" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>3</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/09/dom-events-and-crm-2011.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04MQX87eyp7ImA9WhdWFEw.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-637493607477796875</id><published>2011-09-07T12:26:00.001-06:00</published><updated>2011-09-07T12:26:20.103-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-07T12:26:20.103-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CRMUG" /><category scheme="http://www.blogger.com/atom/ns#" term="microsoft crm mvp" /><title>Ask the MVP (CRMUG)</title><content type="html">&lt;p&gt;There’s an upcoming roundtable event, hosted by &lt;a href="http://www.crmug.com/"&gt;CRMUG&lt;/a&gt;, where many CRM MVPs have agreed to come together and address questions submitted to the &lt;a href="http://www.crmug.com/events/CRMUGMVP0911?date&amp;amp;wa=wsignin1.0"&gt;“Ask the MVP” event site&lt;/a&gt;.&amp;nbsp; After the bulk of the event, I understand there will be time afterward for free-form, open floor discussion and Q&amp;amp;A.&amp;nbsp; However, if you want to make sure your question is asked, drop an email to &lt;a href="mailto:janet@crmug.com"&gt;Janet Lampert&lt;/a&gt; or &lt;a href="mailto:edwardsdna@hotmail.com"&gt;Donna Edwards&lt;/a&gt; well in advance!&amp;nbsp; As with most CRMUG events, attendance is limited to CRMUG members—&lt;a href="http://www.crmug.com/join-crmug"&gt;become a member today&lt;/a&gt;, and reap &lt;a href="http://www.crmug.com/events"&gt;the benefits&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I’m personally excited to get involved in this event, since this is the second CRMUG event to which I’ve been invited to participate.&amp;nbsp; Hopefully, I am more useful to the discussion than a fly-on-the-wall.&amp;nbsp; Many long-time MVP greats will be coming to the table, and I’m honored to find myself among them.&amp;nbsp; We haven’t seen the question list yet, so I’m anxious to find out what you, the audience, want to know!&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/8XLu3Jvf68o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/637493607477796875/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/09/ask-mvp-crmug.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/637493607477796875?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/637493607477796875?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/8XLu3Jvf68o/ask-mvp-crmug.html" title="Ask the MVP (CRMUG)" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/09/ask-mvp-crmug.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUARHw_eyp7ImA9WhdXE00.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-2483510671986941844</id><published>2011-08-25T13:52:00.001-06:00</published><updated>2011-08-25T13:57:25.243-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-25T13:57:25.243-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><title>Copying Lookup Values</title><content type="html">&lt;p&gt;Very recently a poster in the &lt;a href="http://social.microsoft.com/Forums/en-US/crmdevelopment/threads"&gt;CRM Development&lt;/a&gt; forum &lt;a href="http://social.microsoft.com/Forums/en-US/crmdevelopment/thread/7c89043b-974d-4893-bca5-543a9a9d4dd1"&gt;asked why she could not copy the value from a Contact Lookup field into the “To” field of a Phone Call entity&lt;/a&gt;.&amp;nbsp; On the surface, her code was very simple and would largely be expected to work.&amp;nbsp; What ended up working was basically creating a new value for the PartyList that recreated values from the Contact Lookup.&lt;/p&gt; &lt;p&gt;Why was this necessary?&amp;nbsp; I don’t really know, and haven’t looked any deeper into CRM 2011 yet, but what I know from CRM 4 is that certain expressions of the DataValue for a Lookup field can contain extra, undocumented data elements.&amp;nbsp; I suspect that CRM 2011 has expanded the use and perhaps number of these undocumented data elements, and their presence from one Lookup field prevents the direct assignment of the value to another Lookup field.&lt;/p&gt; &lt;p&gt;Perhaps this is limited to Single-to-PartyList copies, but perhaps not.&amp;nbsp; Either way, I’ve whipped up a handy function that can help easily copy or append values into Lookups when those values are taken from other Lookups.&amp;nbsp; Also, it allows you to provide a delegate function to which it will pass each entity reference and expect a boolean indication as to whether or not the value should be accepted for inclusion in the target attribute.&lt;/p&gt; &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;function&lt;/span&gt; CopyLookupValue(sourceAttribute, targetAttribute, boolAppendSource, funcDelegate)&lt;br&gt;{&lt;br&gt;  &lt;span class="kwrd"&gt;var&lt;/span&gt; sourceValue = sourceAttribute.getValue();&lt;br&gt;  &lt;span class="kwrd"&gt;var&lt;/span&gt; newValue = [];&lt;br&gt;&lt;br&gt;  &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;typeof&lt;/span&gt; boolAppendSource != &lt;span class="str"&gt;"undefined"&lt;/span&gt; &amp;amp;&amp;amp; boolAppendSource)&lt;br&gt;  {&lt;br&gt;    sourceValue = targetAttribute.getValue().concat(sourceValue);&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  &lt;span class="kwrd"&gt;foreach&lt;/span&gt;(&lt;span class="kwrd"&gt;var&lt;/span&gt; valueIndex &lt;span class="kwrd"&gt;in&lt;/span&gt; sourceValue)&lt;br&gt;  {&lt;br&gt;    &lt;span class="kwrd"&gt;var&lt;/span&gt; copyValue = &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br&gt;&lt;br&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;typeof&lt;/span&gt; funcDelegate == &lt;span class="str"&gt;"Function"&lt;/span&gt;)&lt;br&gt;    {&lt;br&gt;      copyValue = funcDelegate(sourceValue[valueIndex]);&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (copyValue)&lt;br&gt;    {&lt;br&gt;      newValue.push({&lt;br&gt;        id: sourceValue[valueIndex].id, &lt;br&gt;        name: sourceValue[valueIndex].name, &lt;br&gt;        entityType: sourceValue[valueIndex].entityType});&lt;br&gt;    }&lt;br&gt;  }&lt;br&gt;&lt;br&gt;  targetAttribute.setValue(newValue);&lt;br&gt;}&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;
&lt;p&gt;Using the thread that initiated this code as an example, here is how the above code would be used to copy the value of a Contact field on a parent form window to a To field on the child form window:&lt;/p&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;&lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt; remoteAttribute = window.parent.opener.Xrm.Page.data.entity.attributes.get(&lt;span class="str"&gt;"bc_contact"&lt;/span&gt;);&lt;br&gt;&lt;br&gt;CopyLookupValue(remoteAttribute, Xrm.Page.getAttribute(&lt;span class="str"&gt;"to"&lt;/span&gt;));&lt;/pre&gt;&lt;br&gt;&lt;/div&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/ykzntwN2F3Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/2483510671986941844/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/08/copying-lookup-into-partylist.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/2483510671986941844?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/2483510671986941844?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/ykzntwN2F3Y/copying-lookup-into-partylist.html" title="Copying Lookup Values" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/08/copying-lookup-into-partylist.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkACSXkyfip7ImA9WhdXEEs.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-4692400263608019233</id><published>2011-08-22T13:19:00.001-06:00</published><updated>2011-08-22T19:59:28.796-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-22T19:59:28.796-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="crm 2011" /><category scheme="http://www.blogger.com/atom/ns#" term="data management" /><title>Changing Product Unit Groups</title><content type="html">&lt;p&gt;I ran into a situation where a large list of Products had been imported into CRM 2011, but the Unit Groups for many of them needed to be changed after the fact.&amp;#160; As many have discovered, even though the form customization options for the Product entity professes that the field is not flagged as “read only”, the field is in fact “read only” when Products are opened.&lt;/p&gt;  &lt;p&gt;The workaround is fairly simple, but comes with some caveats:&amp;#160; export the records to an Excel spreadsheet with the option “Make this available for re-importing by including required column headings” selected.&amp;#160; You must export both the Unit Group field and the Default Unit field.&amp;#160; In spreadsheet form, you can alter the Unit Group and the Default Unit.&amp;#160; Now, here’s the caveats:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;The Default Unit must be uniquely named.&lt;/strong&gt;&amp;#160; Multiple Units with identical names (in &lt;strong&gt;any&lt;/strong&gt; Unit Group) will cause the import to fail, because it does not look for the Unit in a specific Unit Group.&amp;#160; The failure is because CRM cannot properly resolve the Unit, due to name duplication. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Beware of any Price List Items configured to use the old Units configured for this Product.&lt;/strong&gt;&amp;#160; I don’t know what CRM will do to you if you try to use the Product in a Quote/Order/Invoice after you change its Unit Group in this way.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;When you import the changed data, you should notice that the modifications to the Unit Group (and Default Unit) values have been properly changed.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;[Update:&amp;#160; &lt;/strong&gt;Astute reader, Jevgenij, notes that the following Microsoft KB will also allow you to work around the problem using the Bulk Edit feature: &lt;a href="http://support.microsoft.com/kb/949941"&gt;http://support.microsoft.com/kb/949941&lt;/a&gt;&amp;#160; This is particularly useful for CRM administrators.&amp;#160; The process above, however, will work for anyone with access Product catalog maintenance.&lt;strong&gt;]&lt;/strong&gt;&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/2hG_bzKx2K4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/4692400263608019233/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/08/changing-product-unit-groups.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4692400263608019233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/4692400263608019233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/2hG_bzKx2K4/changing-product-unit-groups.html" title="Changing Product Unit Groups" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>4</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/08/changing-product-unit-groups.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQGQXk6cSp7ImA9WhdTF0g.&quot;"><id>tag:blogger.com,1999:blog-5242498021352471451.post-8533410451318296176</id><published>2011-07-08T18:38:00.001-06:00</published><updated>2011-07-15T13:32:00.719-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-15T13:32:00.719-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="silverlight" /><category scheme="http://www.blogger.com/atom/ns#" term="crm 4" /><category scheme="http://www.blogger.com/atom/ns#" term="web services" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="RetrieveMultiple" /><title>Silverlight and CRM 4 (continued, again)</title><content type="html">&lt;p&gt;When I delivered the code example in &lt;a href="http://crmentropy.blogspot.com/2011/07/silverlight-and-crm-4-continued.html"&gt;my last post on the subject&lt;/a&gt;, I knew that it would probably be worthwhile to pick apart the individual code elements in order to provide a better understanding of what’s going on &lt;a href="http://crmentropy.blogspot.com/2011/06/silverlight-and-crm-4.html"&gt;underneath it all&lt;/a&gt;.&amp;nbsp; This marks the final chapter of the saga which started as a 10-minute presentation, and culminates about 40-hours of work.&lt;/p&gt; &lt;p&gt;Again, this subject matter all stems from my participation in &lt;a href="http://www.crmug.com/events/10at10of10?date="&gt;CRMUG’s ongoing 10@10of10 series&lt;/a&gt;.&amp;nbsp; To date, I’ve slept in too long to catch any of the other presentations live—for that I apologize to the other presenters, because I really am interested in their content matter.&amp;nbsp; Problem is, I’ve been up until 4 A.M. most mornings doing freelance work, or dealing with &lt;a href="http://crmentropy.blogspot.com/2011/02/its-been-quiet.html"&gt;other things&lt;/a&gt;.&amp;nbsp; Thankfully, CRMUG will be posting the session recordings to their site—or so I’m told.&lt;/p&gt; &lt;p&gt;The code I will present will be in snippets from the &lt;a href="http://simplecrm4sl.codeplex.com/"&gt;Simple CRM 4 Silverlight Application project&lt;/a&gt; that I’ve uploaded to &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt;.&amp;nbsp; If you didn’t already download it to &lt;a href="http://crmentropy.blogspot.com/2011/07/silverlight-and-crm-4-continued.html"&gt;build the application for yourself using my last post’s instructions&lt;/a&gt;, you’ll probably want to do so now for what follows.&amp;nbsp; (You will also need the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=146060"&gt;Silverlight 4 Tools for VS 2010&lt;/a&gt; and the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=146060"&gt;Silverlight 4 for Developers Runtime&lt;/a&gt; to work with the project files.)&lt;/p&gt; &lt;h3&gt;What follows: A Silverlight primer&lt;/h3&gt; &lt;p&gt;Ok, so… first thing’s first:&amp;nbsp; If you’re inexperienced with Silverlight, I recommend the &lt;a href="http://www.silverlightjumpstart.com/"&gt;Silverlight Jumpstart&lt;/a&gt; book by &lt;a href="http://crm.davidyack.com/"&gt;David Yack&lt;/a&gt; (downloadable as a PDF).&amp;nbsp; It serves as a pretty good primer for working with Silverlight in general.&amp;nbsp; I used it, and found it very informative and useful.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Mr. Yack also wrote another book, &lt;a href="http://msdn.microsoft.com/en-us/library/dd458801.aspx"&gt;CRM as a Rapid Development Platform&lt;/a&gt; that contains a chapter on Silverlight development for CRM.&amp;nbsp; I also found that chapter useful in my project, but diverged from his examples by using the WSDL for web-service interaction.&amp;nbsp; His point about WSDL bloat upon the final XAP file are valid, and should be considered when developing smaller, single-purpose products.&amp;nbsp; However, for richer and fuller Silverlight apps, I find the WSDL to be integral to the speed of development.&lt;/p&gt; &lt;p&gt;I’m not going to get into the ins-and-outs of Silverlight development.&amp;nbsp; There’s too much to cover for this space, and I will simply proceed under the assumption that you, the reader, will find this knowledge for yourself and use it to obtain an understanding from what follows.&lt;/p&gt; &lt;h3&gt;What follows: Connecting to CRM&lt;/h3&gt; &lt;p&gt;There are two things necessary to connect Silverlight to CRM:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;knowing the service endpoint and authentication method&lt;sup&gt;&lt;a href="#connecting1"&gt;1&lt;/a&gt;&lt;/sup&gt;  &lt;li&gt;having an asynchronous interface to the endpoint methods&lt;sup&gt;&lt;a href="#connecting3"&gt;3&lt;/a&gt;&lt;/sup&gt; &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;For ease of use within the context of the ISV folder, I split these requirements across two projects, respectively:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;an ASPX host page for the Silverlight control  &lt;li&gt;the WSDL in the Silverlight application &lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Because Silverlight must ultimately satisfy both requirements internally, there is a third, intermediary requirement caused by my division of responsibility:&amp;nbsp; passing service endpoint and authentication information from the host page into Silverlight&lt;sup&gt;&lt;a href="#connecting2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt; &lt;h4&gt;&lt;/h4&gt; &lt;h5&gt;&lt;a name="connecting1"&gt;Knowing the service endpoint and authentication method&lt;/a&gt;&lt;/h5&gt; &lt;p&gt;Because I decided to use an ASPX page and code-behind file to meet this requirement, the process is decidedly simple, and is explained best in these snippets of code:&lt;/p&gt; &lt;h6&gt;SimpleCrmApp.aspx.cs (line 35):&lt;/h6&gt; &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt; &lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;serviceUrl = &lt;span class="kwrd"&gt;this&lt;/span&gt;.Request.Url.Scheme + &lt;span class="str"&gt;"://"&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.Request.Url.Host + &lt;span class="str"&gt;"/MSCRMServices/2007/CrmService.asmx"&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The snippet above uses the Page.Request member to assemble relevant components of the scheme used to view the page (“http” or “https”), and the hostname.&lt;/p&gt;
&lt;h6&gt;SimpleCrmApp.aspx.cs (lines 19 and 38):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;orgName = Request.QueryString[&lt;span class="str"&gt;"orgname"&lt;/span&gt;];&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="rem"&gt;//... jump over code&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;CrmAuthenticationToken token = CrmAuthenticationToken.ExtractCrmAuthenticationToken(Context, orgName);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The snippet above shows how the code-behind grabs the value of “orgname” from the same Page.Request to complete our &lt;em&gt;ExtractCrmAuthenticationToken()&lt;/em&gt; method call.&amp;nbsp; This parameter must be passed to the host page somehow.&amp;nbsp; In our example, we accomplish this in this part of the SiteMap.xml configuration:&lt;/p&gt;
&lt;h6&gt;SiteMap.xml:&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;SubArea&lt;/span&gt; &lt;span class="attr"&gt;Id&lt;/span&gt;&lt;span class="kwrd"&gt;="SimpleCrmApp"&lt;/span&gt; &lt;span class="attr"&gt;PassParams&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;Url&lt;/span&gt;&lt;span class="kwrd"&gt;="/../ISV/SCA/SimpleCrmApp.aspx"&lt;/span&gt; &lt;span class="attr"&gt;AvailableOffline&lt;/span&gt;&lt;span class="kwrd"&gt;="false"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Here, we rely on &lt;strong&gt;PassParams&lt;/strong&gt; to do our dirty work for us.&lt;/p&gt;
&lt;p&gt;Now, you might be misled into thinking that the &lt;em&gt;token&lt;/em&gt; would be sufficient for Silverlight to authenticate its own SOAP messages.&amp;nbsp; Many in the forums have.&amp;nbsp; The reason you would be wrong is that the &lt;em&gt;ExtractCrmAuthenticationToken()&lt;/em&gt; method provides you with the &lt;strong&gt;CrmAuthenticationToken&lt;/strong&gt; instance used by CRM’s platform to communicate with the web service endpoints.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://crmentropy.blogspot.com/2010/07/crm-impersonation-explained.html"&gt;As I previously explained&lt;/a&gt;, this poses a problem because this &lt;em&gt;token&lt;/em&gt; is designed to always operate under two conditions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use to communicate with SOAP under a &lt;em&gt;CrmImpersonator()&lt;/em&gt; call, which removes impersonation from the thread, thereby bringing “SYSTEM” user network credentials for use with… 
&lt;li&gt;Integrated Authentication &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;It’s important to note that the reason &lt;em&gt;token&lt;/em&gt; won’t work for Silverlight in strictly Integrated Authentication environments is because of the presence of the &lt;strong&gt;CallerId&lt;/strong&gt; value. &lt;a href="http://crmentropy.blogspot.com/2010/07/crm-impersonation-explained.html"&gt;Any time this value is not Guid.Empty, CRM assumes impersonation is taking place, and checks the credentials for membership in the PrivUserGroup&lt;/a&gt;.&amp;nbsp; Because CRM does not communicate with itself over IFD, the &lt;strong&gt;CrmAuthenticationToken&lt;/strong&gt; provided with always have an &lt;strong&gt;AuthenticationType&lt;/strong&gt; of “0” and will &lt;u&gt;never&lt;/u&gt; contain a &lt;strong&gt;CrmTicket&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When authenticating via IFD, you &lt;strong&gt;must&lt;/strong&gt; supply a value for &lt;strong&gt;CallerId&lt;/strong&gt;.&amp;nbsp; That’s what explains this bit:&lt;/p&gt;
&lt;h6&gt;SimpleCrmApp.aspx.cs (line 40):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;callerId = token.CallerId.ToString();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Finally, I need a sensible way to determine if CRM is being used in an IFD scenario or not.&amp;nbsp; I could go the complicated way, parsing the URL to find out if the hostname has the &lt;em&gt;orgname&lt;/em&gt; in it—but that’s a lot of code.&amp;nbsp; A more elegant way, is to look for the browser-cookie “MSCRMSession”:&lt;/p&gt;
&lt;h6&gt;SimpleCrmApp.aspx.cs (line 28):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// A broadly applicable mechanism for detecting IFD is the presence of the MSCRMSession cookie&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (Request.Cookies[&lt;span class="str"&gt;"MSCRMSession"&lt;/span&gt;] &lt;span class="kwrd"&gt;is&lt;/span&gt; HttpCookie)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    authType = &lt;span class="str"&gt;"2"&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    authType = &lt;span class="str"&gt;"0"&lt;/span&gt;;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Fun, huh?&lt;/p&gt;
&lt;p&gt;Here’s why “MSCRMSession” is also important: it contains the value of the &lt;strong&gt;CrmTicket&lt;/strong&gt;.&amp;nbsp; See, whenever the browser is authenticated via IFD, it uses a browser-cookie (which is inaccessible through JavaScript or Silverlight) to hold this ticket value.&amp;nbsp; The nice thing is, that it’s passed in every HTTP request header that originates from the browser (including Silverlight) to its domain of origin.&amp;nbsp; Therefore, we do not &lt;em&gt;need&lt;/em&gt; to worry about finding it or passing it through the headers of our own SOAP requests.&lt;/p&gt;
&lt;p&gt;Notice how every value I’m taking is ending up in string format?&amp;nbsp; Well that leads into the next requirement.&lt;/p&gt;
&lt;h5&gt;&lt;a name="connecting2"&gt;Passing service endpoint and authentication information from the host page into Silverlight&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;There are a handful of ways to obtain data from a Silverlight application’s hosting page:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspect the DOM. 
&lt;li&gt;Call a JavaScript function. 
&lt;li&gt;Use &lt;strong&gt;InitParams&lt;/strong&gt;. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I’m sure there are others I’m unfamiliar with, but let me tell you why I choose the &lt;strong&gt;InitParams&lt;/strong&gt;: it’s easy, and it’s a one-way stream into Silverlight that doesn’t require any backward movement by the Silverlight app into its execution context.&amp;nbsp; It simply doesn’t care.&amp;nbsp; In fact, if I had some other way that I would like to instantiate my Silverlight app in a wholly different context, I could rely on data passed into &lt;strong&gt;InitParams&lt;/strong&gt; to define its operation.&lt;/p&gt;
&lt;p&gt;To achieve this, there are two code-snippets on the server side, and one on the Silverlight side to illustrate how this works:&lt;/p&gt;
&lt;h6&gt;SimpleCrmApp.aspx (line 69):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="initParams"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="&amp;lt;%= BuildInitValue() %&amp;gt;"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The snippet above, from the &amp;lt;object&amp;gt; container for the Silverlight control, instructs Silverlight to receive the &lt;em&gt;value&lt;/em&gt; and pass it into the &lt;strong&gt;Startup &lt;/strong&gt;event arguments.&amp;nbsp; To construct the value, I have this function:&lt;/p&gt;
&lt;h6&gt;SimpleCrmApp.aspx.cs (lines 43 – 47):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; BuildInitValue()&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// build a series of parameters to be piped into the Silverlight app from the hosting control page&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"callerId="&lt;/span&gt; + callerId + &lt;span class="str"&gt;",orgName="&lt;/span&gt; + orgName + &lt;span class="str"&gt;",serviceUrl="&lt;/span&gt; + serviceUrl + &lt;span class="str"&gt;",authType="&lt;/span&gt; + authType;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Since the values are being embedded into the host page by this function, I need to work with strings—which flows from the code in the first requirement.&amp;nbsp; Then, it’s a matter of examining the values from the &lt;strong&gt;Startup&lt;/strong&gt; event arguments in Silverlight:&lt;/p&gt;
&lt;h6&gt;App.xaml.cs (lines 30 – 34):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (e.InitParams == &lt;span class="kwrd"&gt;null&lt;/span&gt; ||&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    e.InitParams[&lt;span class="str"&gt;"callerId"&lt;/span&gt;] == String.Empty ||&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    e.InitParams[&lt;span class="str"&gt;"orgName"&lt;/span&gt;] == String.Empty ||&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    e.InitParams[&lt;span class="str"&gt;"serviceUrl"&lt;/span&gt;] == String.Empty)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;"This Silverlight application requires values for callerId, orgName, urlScheme, and serviceUrl parameters."&lt;/span&gt;);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The snippet above occurs as the first statement in the handler &lt;em&gt;Application_Startup()&lt;/em&gt;, which has been attached to the &lt;strong&gt;Startup&lt;/strong&gt; event of the &lt;strong&gt;Application&lt;/strong&gt; class in my custom constructor:&lt;/p&gt;
&lt;h6&gt;App.xaml.cs (line 20):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;this&lt;/span&gt;.Startup += &lt;span class="kwrd"&gt;this&lt;/span&gt;.Application_Startup;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As you can see, the type &lt;strong&gt;StartupEventArgs&lt;/strong&gt; (and its instance, &lt;em&gt;e&lt;/em&gt;) expose the member &lt;strong&gt;InitParams&lt;/strong&gt;, from which I obtain the values I submitted from the hosting page via its implementation of &lt;strong&gt;IDictionary&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So, now what?&amp;nbsp; Well, since we have all of the necessary information to connect to CRM, it’s time to start working with &lt;a href="http://crmentropy.blogspot.com/2011/06/silverlight-and-crm-4.html"&gt;the code from my first post&lt;/a&gt;.&lt;/p&gt;
&lt;h5&gt;&lt;a name="connecting3"&gt;Having an asynchronous interface to the endpoint methods&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;Since I have all the information I need to connect to CRM within the &lt;em&gt;Application_Startup()&lt;/em&gt; call, I refrain from storing the information and instead use it immediately to construct an instance of my &lt;strong&gt;CrmServiceInstance&lt;/strong&gt; class:&lt;/p&gt;
&lt;h6&gt;App.xaml.cs (lines 36 – 51):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Construct a new CrmAuthenticationToken from some of the InitParams elements&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;CrmAuthenticationToken authToken = &lt;span class="kwrd"&gt;new&lt;/span&gt; CrmAuthenticationToken();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;authToken.AuthenticationType = Convert.ToInt32(e.InitParams[&lt;span class="str"&gt;"authType"&lt;/span&gt;]);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="rem"&gt;// This is an important piece for determining proper IFD communication&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (authToken.AuthenticationType != 0)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    authToken.CallerId = &lt;span class="kwrd"&gt;new&lt;/span&gt; Guid(e.InitParams[&lt;span class="str"&gt;"callerId"&lt;/span&gt;]);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    authToken.CallerId = Guid.Empty;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;authToken.OrganizationName = e.InitParams[&lt;span class="str"&gt;"orgName"&lt;/span&gt;];&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="rem"&gt;// Create a new CrmServiceInstance and assign a new CrmServiceConnectionParams object to its ConnectionParams member&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;CrmServiceInstance crmService = &lt;span class="kwrd"&gt;new&lt;/span&gt; CrmServiceInstance();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;crmService.ConnectionParams = &lt;span class="kwrd"&gt;new&lt;/span&gt; CrmServiceConnectionParams(e.InitParams[&lt;span class="str"&gt;"serviceUrl"&lt;/span&gt;], authToken);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;In the snippet above, you can see that I’m constructing a new &lt;strong&gt;CrmAuthenticationToken&lt;/strong&gt; object, with all the various input received through &lt;strong&gt;InitParams&lt;/strong&gt;.&amp;nbsp; I then pass this and the endpoint URL (also taken from &lt;strong&gt;InitParams&lt;/strong&gt;) to the &lt;strong&gt;ConnectionParams&lt;/strong&gt; member of &lt;em&gt;crmService&lt;/em&gt;.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Because I perform these immediately upon the application startup, I have no need to examine the &lt;strong&gt;IsCrmServiceReady&lt;/strong&gt; member or attach any handlers to the &lt;strong&gt;OnCrmServiceReady&lt;/strong&gt; event—it is simply ready for me to proceed.&amp;nbsp; However, I put an example of how this might be performed in this code snippet from the&lt;em&gt; MainPage_Loaded()&lt;/em&gt; event handler:&lt;/p&gt;
&lt;h6&gt;MainPage.xaml.cs (lines 42 – 46):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Validate the readiness of the crmServiceInstance before proceeding further; use an event handler to work out the kinks&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (!crmServiceInstance.IsCrmServiceReady)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    crmServiceInstance.OnCrmServiceReady += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;EventArgs&amp;gt;(crmService_OnCrmServiceReady);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    crmService_OnCrmServiceReady(&lt;span class="kwrd"&gt;this&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; EventArgs());&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Where this event is handy, is if I had created my &lt;strong&gt;CrmServiceInstance&lt;/strong&gt; in XAML—rather than directly in the code, as with this example.&lt;/p&gt;
&lt;p&gt;From here, I pass &lt;em&gt;crmService&lt;/em&gt; into the customized constructor for my &lt;strong&gt;MainPage&lt;/strong&gt; class.&amp;nbsp; Once this is done, a connection to CRM has been adequately defined and is now available for my Silverlight page, &lt;strong&gt;MainPage&lt;/strong&gt;, to use for what follows.&lt;/p&gt;
&lt;h3&gt;What follows: Using CrmServiceSoapClient&lt;/h3&gt;
&lt;p&gt;Because Silverlight requires web-service interaction to operate in an asynchronous way (for non-interfering performance reasons), all of the traditional methods from &lt;strong&gt;[I]CrmService&lt;/strong&gt; are implemented in &lt;strong&gt;CrmServiceSoapClient&lt;/strong&gt; with an “Async” suffix.&amp;nbsp; &lt;em&gt;Execute()&lt;/em&gt; becomes &lt;em&gt;ExecuteAsync()&lt;/em&gt;, and &lt;em&gt;RetrieveMultiple()&lt;/em&gt; becomes &lt;em&gt;RetrieveMultipleAsync()&lt;/em&gt;, for example.&amp;nbsp; Working with these asynchronous counterparts can be perplexing, considering that they all have no return.&lt;/p&gt;
&lt;p&gt;The returns are provided through events.&amp;nbsp; Each traditional method not only has an “Async” representation in Silverlight, but also a “Completed” event; &lt;strong&gt;ExecuteCompleted&lt;/strong&gt; and &lt;strong&gt;RetrieveMultipleCompleted&lt;/strong&gt;, for example.&amp;nbsp; This means that every method call to the web-services is handled by every active event handler registered to these events.&amp;nbsp; This can complicate the design of your Silverlight application, to a degree—given that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You should always have the event handler in place before the method is called; and 
&lt;li&gt;Every event handler will catch every execution of the method for the same &lt;strong&gt;CrmServiceSoapClient&lt;/strong&gt; instance &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;For our example, however, all I need is a simple, one-time query for all active Account names.&amp;nbsp; I achieve that with the following code in the &lt;em&gt;crmService_OnCrmServiceReady()&lt;/em&gt; method (again, this method is an event handler for the &lt;strong&gt;CrmServiceInstance&lt;/strong&gt;.&lt;strong&gt;OnCrmServiceReady&lt;/strong&gt; event, and is not needed by the code, but provided for example purposes):&lt;/p&gt;
&lt;h6&gt;MainPage.xaml.cs (lines 51 – 66):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Query for active accounts&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;QueryByAttribute query = &lt;span class="kwrd"&gt;new&lt;/span&gt; QueryByAttribute();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;query.EntityName = EntityName.account.ToString();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;query.Attributes = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] { &lt;span class="str"&gt;"statecode"&lt;/span&gt; };&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;query.Values = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] { 0 };&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Query three specific string columns&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;ColumnSet columns = &lt;span class="kwrd"&gt;new&lt;/span&gt; ColumnSet();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;columns.Attributes = &lt;span class="kwrd"&gt;new&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] { &lt;span class="str"&gt;"name"&lt;/span&gt; };&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;query.ColumnSet = columns;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&lt;span class="rem"&gt;// Assign a handler to deal with the results, before triggering the execution of the query&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;crmServiceInstance.CrmService.RetrieveMultipleCompleted += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler&amp;lt;RetrieveMultipleCompletedEventArgs&amp;gt;(CrmService_RetrieveMultipleCompleted);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;crmServiceInstance.CrmService.RetrieveMultipleAsync(query);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Note that one statement before I call &lt;em&gt;RetrieveMultipleAsync()&lt;/em&gt;, I attach the handler &lt;em&gt;CrmServce_RetrieveMultipleCompleted()&lt;/em&gt; to the &lt;strong&gt;RetrieveMultipleCompleted&lt;/strong&gt; event.&amp;nbsp; I do this to prevent any possible—though unlikely—race condition by which the thread processing the “RetrieveMultiple” message might finish and trigger the event, before the event handler is assigned.&lt;/p&gt;
&lt;p&gt;So, interpreting the return is an important function of &lt;em&gt;CrmService_RetrieveMultipleCompleted()&lt;/em&gt;.&amp;nbsp; Here’s the body of that method:&lt;/p&gt;
&lt;h6&gt;MainPage.xaml.cs (lines 69 – 82):&lt;/h6&gt;
&lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
&lt;div id="codeSnippet" class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;void&lt;/span&gt; CrmService_RetrieveMultipleCompleted(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, RetrieveMultipleCompletedEventArgs e)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;{&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;// Instantiate a new List&amp;lt;account&amp;gt; for our results&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    List&amp;lt;account&amp;gt; retrievedAccounts = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;account&amp;gt;();&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    &lt;span class="rem"&gt;// Assign the results of our query to the new List&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (account a &lt;span class="kwrd"&gt;in&lt;/span&gt; e.Result.BusinessEntities)&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    {&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;        retrievedAccounts.Add(a);&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    }&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;    &lt;span class="rem"&gt;// Push the results into our RetrievedRecords data context&lt;/span&gt;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alt"&gt;    RetrievedRecords.AccountRecords = retrievedAccounts;&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;pre class="alteven"&gt;}&lt;/pre&gt;&lt;!--CRLF--&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;As you can see, &lt;strong&gt;RetrieveMultipleCompletedEventArgs&lt;/strong&gt; (as an instance, e) has a &lt;strong&gt;Result&lt;/strong&gt; member that contains our retrieved records, much the same way as the traditional &lt;strong&gt;RetrieveMultipleResponse&lt;/strong&gt; would.&lt;/p&gt;
&lt;p&gt;The rest of my code operates the way a basic Silverlight application should when pushing data to the view.&amp;nbsp; To make a long story short, I use a “&lt;a href="http://en.wikipedia.org/wiki/Model_View_ViewModel"&gt;ViewModel&lt;/a&gt;” for the data, represented by a collection of &lt;strong&gt;DisplayAccount&lt;/strong&gt;.&amp;nbsp; These are handled by the class &lt;strong&gt;CrmRecords&lt;/strong&gt;, which serves as the type for the &lt;strong&gt;RetrievedRecords&lt;/strong&gt; member of &lt;strong&gt;MainPage&lt;/strong&gt;.&amp;nbsp; These serve as abstractions of the &lt;strong&gt;account&lt;/strong&gt; type to limit the amount of columns automatically generated by the DataGrid.&lt;/p&gt;
&lt;h3&gt;What follows:&amp;nbsp; Bed Time&lt;/h3&gt;
&lt;p&gt;Ok, I’ve been up late working on this post.&amp;nbsp; Time for bed.&amp;nbsp; Hopefully, it all makes sense.&amp;nbsp; Comment below if you have additional inquiries.&lt;/p&gt;  &lt;img src="http://feeds.feedburner.com/~r/CrmEntropy/~4/hmkKg5tXCbw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://crmentropy.blogspot.com/feeds/8533410451318296176/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://crmentropy.blogspot.com/2011/07/silverlight-and-crm-4-continued-again.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8533410451318296176?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5242498021352471451/posts/default/8533410451318296176?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CrmEntropy/~3/hmkKg5tXCbw/silverlight-and-crm-4-continued-again.html" title="Silverlight and CRM 4 (continued, again)" /><author><name>Dave Berry</name><uri>https://plus.google.com/103710735572480551233</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-QkmsI7fSp_g/AAAAAAAAAAI/AAAAAAAAAgM/_lnl1eMeZh4/s512-c/photo.jpg" /></author><thr:total>2</thr:total><gd:extendedProperty name="commentSource" value="1" /><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD" /><feedburner:origLink>http://crmentropy.blogspot.com/2011/07/silverlight-and-crm-4-continued-again.html</feedburner:origLink></entry></feed>
