<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
   <title>stunnware's CRM corner</title>
   <subtitle>Samples and tools for CRM developers</subtitle>
   <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom.aspx" />
   <link rel="alternate" href="http://www.stunnware.com/crm2/default.aspx" />
   <updated>2009-11-30T10:00:00+01:00</updated>
   <author>
      <name>Michael Höhne</name>
   </author>
   <id>urn:uuid:D7C4413D-BD66-4d2e-9E11-587870EFAFE8</id>
   <entry>
      <title>Filtered Views for Microsoft Dynamics CRM 4.0 - v4.2</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=FV4-3" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/FV4-3" />
      <id>tag:stunnware.com,2009-11-30:FV4-3</id>
      <published>2009-11-30T10:00:00+01:00</published>
      <updated>2009-11-30T10:00:00+01:00</updated>
      <content type="html">
   &lt;p&gt;I rarely post about product updates on this blog, but this time I make an 
   exception. The reason is that the new features in the Filtered Views are 
   great and I want to share it with you. &lt;/p&gt;
   &lt;p&gt;So far the Filtered Views allowed creating dynamic views based on 
   parameters being supplied at runtime. With "at runtime" I mean that you pass 
   parameters in your CRM script code. That was good enough to view associated 
   data going well beyond the capabilities of a standard CRM view. However, good 
   is never good enough, so here's the list of enhancements in the new release:&lt;/p&gt;
   &lt;ol&gt;
	   &lt;li&gt;UI Filters to define custom search fields in filtered views&lt;/li&gt;
	   &lt;li&gt;Multi-Language support&lt;/li&gt;
	   &lt;li&gt;An entity context to activate field mappings when creating a new 
	   entity from a filtered view&lt;/li&gt;
	   &lt;li&gt;Script support to perform typical tasks like hiding toolbar buttons 
	   or colorizing views&lt;/li&gt;
   &lt;/ol&gt;
   &lt;p&gt;Probably the best explanation of what you can do with these new features 
   is the following screenshot: &lt;/p&gt;
   &lt;p&gt;&lt;img height="293" src="images/FV-3/ColorsAndParameters.png" width="644"&gt;&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>Stunnware Tools for Microsoft Dynamics CRM 4.0 - Support for CRM Online</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=Framework14" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/Framework14" />
      <id>tag:stunnware.com,2009-10-02:Framework14</id>
      <published>2009-10-02T22:00:00+01:00</published>
      <updated>2009-10-02T22:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;I was asked yesterday whether support for CRM Online was planned for the
&lt;a href="http://www.stunnware.com/default.aspx?area=products&amp;group=swtools4&amp;subarea=swtools4-overview"&gt;
Stunnware Tools&lt;/a&gt; and the
&lt;a href="http://www.stunnware.com/default.aspx?area=products&amp;group=jsf4&amp;subarea=jsf4-overview"&gt;
JavaScript Factory&lt;/a&gt;. My answer was that it hasn't been implemented just 
because I never had access to CRM Online. That was a minor issue though, because 
I instantly got credentials to a test organization and even admin rights for 
testing. That was great and it turned out that having a framework combining a 
set of tools was a good decision, because once I had the code implemented to use 
the passport and CRM Online services, all tools started working instantly.&lt;/p&gt;
&lt;p&gt;I had added support for the offline services recently and now the Stunnware 
Tools support anything: On-Premise, Partner Hosted (IFD), CRM Online and the 
Outlook Offline client. If I have implemented the automatic version check 
correctly and you haven't turned it off, then you may already be aware of the 
new release before having read this post. &lt;/p&gt;
&lt;p&gt;The new version is available for download at
&lt;a href="http://www.stunnware.com/default.aspx?area=products&amp;group=swtools4&amp;subarea=swtools4-download"&gt;
http://www.stunnware.com/default.aspx?area=products&amp;group=swtools4&amp;subarea=swtools4-download&lt;/a&gt;.&lt;/p&gt;    </content>
   </entry>
   <entry>
      <title>Client Side Scripting - Converting date/time values to or from XML</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=JS36" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/JS36" />
      <id>tag:stunnware.com,2009-09-29:JS36</id>
      <published>2009-09-29T23:00:00+01:00</published>
      <updated>2009-09-29T23:00:00+01:00</updated>
      <content type="html">
Being a mystery in the beginning it's now common knowledge how to use the CRM web services in CRM form scripts. However, there were two questions recently dealing with date fields. Date values in XML are notated in a way that you probably know from your .NET code, 2008-03-12T13:55:46+01:00 for instance. The .NET DateTime object can easily handle it, but the JavaScript Date object cannot. The Filtered Lookup of course supports date fields in queries and I implemented appropriate conversion methods. Feel free to use them.
    </content>
   </entry>
   <entry>
      <title>Client Side Scripting - Customer Products</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=JS35" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/JS35" />
      <id>tag:stunnware.com,2009-09-28:JS35</id>
      <published>2009-09-28T17:00:00+01:00</published>
      <updated>2009-11-09T17:00:00+01:00</updated>
      <content type="html">
There was an interesting thread in the CRM developer 
   newsgroups recently. Assume that you have built your product catalog and use 
   CRM to create opportunities, quotes, orders and invoices, or at least some of 
   these entities. All of them refer to the products in your product catalog. 
   Now consider your customers. If they order products from your company 
   regularly, then they most likely store your products in their own system. 
   However, they will use their own product numbers to refer to your products 
   and when ordering they will tell you these product numbers and not yours. &lt;/p&gt;
   &lt;p class="normal"&gt;The question was how to enable a user to search for a 
   product using both the internal product number and the external product 
   number, where with "external" I mean the product number used by the customer. &lt;/p&gt;
   &lt;p class="normal"&gt;An easy solution is adding a custom attribute to the 
   product entity, but of course you can then only store one product number. 
   This approach doesn't work when dealing with multiple customers, unless you 
   like having a product number field for each customer. As each product can 
   have many customer product numbers, the solution is a customer product entity 
   and a 1:n relationship between products and customer products:&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>The JavaScript Factory</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=JavaScriptFactory" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/JavaScriptFactory" />
      <id>tag:stunnware.com,2009-09-15:JavaScriptFactory</id>
      <published>2009-09-15T15:00:00+01:00</published>
      <updated>2009-09-15T15:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;As mentioned in the last article published a few minutes ago I 
			had some work to do in the recent months. New major releases of the 
			Filtered Lookup, which now supports multi-select lookup fields, the 
			Filtered Views, Favorite Views and finally the JavaScript Factory.&lt;/p&gt;
&lt;p class="productheader"&gt;JavaScript Factory&lt;/p&gt;
&lt;p&gt;&lt;img height="354" src="../../Products/JSF4/images/Product.png" style="float: right" width="608"&gt;Most readers of this blog certainly are developers and most are developing 
CRM solutions. One part of CRM development are form scripts and my personal 
feeling is that many if not the majority of developers are still using the CRM 
 editor to write script code.&lt;/p&gt;
			&lt;p&gt;This editor is a simple text box without any added functionality and while acceptable for smaller code changes it’s a real pain when working with larger code files.
&lt;/p&gt;
			&lt;p&gt;A simple workaround is to copy the code from the CRM code window 
			into a JavaScript file in Visual Studio 2008. Visual Studio 2008 has 
			IntelliSense support for JavaScript and at least provides help for 
			the objects of the document object model (DOM). However, as Visual 
			Studio 2008 doesn’t know about CRM, it cannot provide IntelliSense 
			for CRM-specific objects.&lt;/p&gt;
			&lt;p&gt;Furthermore you cannot split large files into modules easily. It 
			is possible to dynamically load JavaScript libraries into CRM forms, 
			but managing such libraries is a manual step. &lt;/p&gt;
			&lt;p&gt;For developers using Microsoft technologies it's usually a 
			no-brainer to use Visual Studio and developing CRM form scripts 
			shouldn't be different. If you search the Internet for articles on 
			how to edit form scripts in Visual Studio then you will find some 
			and if they are sufficient for you then you're done. Anyone else is 
			welcome to have a closer look at the JavaScript Factory, which 
			provides the following features:&lt;/p&gt;
			&lt;ul&gt;
				&lt;li&gt;Creates a Visual Studio Solution for any CRM 
				organization, extracts the JavaScript code and enables direct 
				editing in Visual Studio 2008.&lt;/li&gt;
				&lt;li&gt;Merges the OnLoad, OnChange and OnSave event handlers 
				into a single file for easier editing.&lt;/li&gt;
				&lt;li&gt;Allows multiple source files for each entity.&lt;/li&gt;
				&lt;li&gt;Provides IntelliSense support for the entire CRM form object 
				model, including custom entities and attributes.&lt;/li&gt;
				&lt;li&gt;Saves and publishes changes directly from Visual Studio 
				2008.&lt;/li&gt;
				&lt;li&gt;Updates existing solutions with updated customizations.&lt;/li&gt;
				&lt;li&gt;Starts full create and update forms directly from Visual 
				Studio 2008.&lt;/li&gt;
				&lt;li&gt;Manages organization-specific and -unspecific JavaScript 
				libraries. &lt;/li&gt;
				&lt;li&gt;Builds the form script by compiling the form code and all 
				referenced libraries. As a result you have a single script file 
				in CRM, but can have dozens or even hundreds of modules 
				containing these files.&lt;/li&gt;
				&lt;li&gt;Because of the file-based solution approach you can use 
				version control systems to manage your code.&lt;/li&gt;
				&lt;li&gt;Supports On-Premise and IFD setups.&lt;/li&gt;
			&lt;/ul&gt;
			&lt;p&gt;That's just the Visual Studio part. The CRM JavaScript Factory for Microsoft Dynamics CRM 4.0 
			is a server-side module that can be used to support developer teams:&lt;/p&gt;
			&lt;ul&gt;
				&lt;li&gt;Builds CRM form scripts on the fly without having to publish 
				changes. &lt;/li&gt;
				&lt;li&gt;Enables developers to edit the script code and to take full 
				advantage of the library management and IntelliSense support, 
				even without the CRM JavaScript Factory for Visual Studio 2008.&lt;/li&gt;
			&lt;/ul&gt;
			&lt;p&gt;The server component is code-complete but documentation isn't 
			finished yet. Won't take long to complete though. If you are 
			interested in this solution then go to the
			&lt;a href="/default.aspx?area=products&amp;group=jsf4"&gt;product page&lt;/a&gt; 
			and download the documentation to get a first impression. The 
			product page also contains information about how to obtain an 
			evaluation license, in case you want to try it out.&lt;/p&gt;
</content>
   </entry>
   <entry>
      <title>The CRM 4.0 Metadata Cache - Part 2</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=MetadataCache2" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/MetadataCache2" />
      <id>tag:stunnware.com,2009-09-15:MetadataCache2</id>
      <published>2009-09-15T14:00:00+01:00</published>
      <updated>2009-09-15T14:00:00+01:00</updated>
      <content type="html">
As I had some work to do recently it took much longer to complete this 
article, though the implementation was finished a long time ago. I have attached 
the code to this article and you can download it by clicking the download button 
in the top left corner. &lt;/p&gt;
&lt;p&gt;The implementation uses two main classes, the CrmOrganizationMetadataCache 
and the CrmMetadataCache. CrmOrganizationMetadataCache is used to cache the 
metadata of one organization. CrmMetadataCache manages multiple organization 
caches, which is a requirement for any solution supporting multi-tenancy. &lt;/p&gt;
&lt;p&gt;The implementation supports a variety of options. I included a wish list in 
the previous article:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;It must provide an organizational cache.&lt;/li&gt;
	&lt;li&gt;It must be capable to deal with multiple organizations to support 
	multi-tenancy.&lt;/li&gt;
	&lt;li&gt;It should give a choice between read-all-at-once and a lazy-loading 
	approach.&lt;/li&gt;
	&lt;li&gt;It should never request more data than needed. For instance, if you 
	request an entity with attributes and relationships and the attributes were 
	already retrieved, then only relationships will be loaded and the result is 
	merged into the existing cache.&lt;/li&gt;
	&lt;li&gt;It must be thread-safe. This is very important for server-side 
	applications, where multiple users will call your code in parallel. The 
	cache will be defined as a static member in your implementation, but static 
	members are not thread-safe by default. Intelligent synchronizing of 
	requests is important for a good performance.&lt;/li&gt;
	&lt;li&gt;It must have methods to persist itself. Saving a cache to disk and 
	loading it when the application starts again is much faster than requesting 
	the data from CRM again.&lt;/li&gt;
	&lt;li&gt;It must have the ability to check for updated metadata and to clear the 
	cache if the metadata was changed. As this is not required by all 
	applications, appropriate settings have to be available.&lt;/li&gt;
	&lt;li&gt;Helper classes must exists for easy language management, though this can 
	be implemented at various places. A short explanation: when reading the 
	metadata you are running under a certain user account. This user account (systemuser) 
	is used by CRM to retrieve the user's language settings. All UserLocLabel 
	properties in the returned metadata contain the localized labels for this 
	user. When you cache the metadata and simply user UserLocLabel to access 
	display names, then all users using a different language will be somewhat 
	disappointed. Instead of using UserLocLabel you have extract the appropriate 
	label from the LocLabel collection. For that to work you need to retrieve 
	the user settings first and use the language settings as an argument into 
	the LocLabels array. It isn't too complex, but worth to be put into a helper 
	class. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With the exception of the last item in the list all features are available. &lt;/p&gt;
&lt;p&gt;I cannot guarantee that the code is free of errors and I also don't say that 
it's perfect. But I added a lot of comments to make it easy to understand. Feel 
free to use and enhance it.    </content>
   </entry>
   <entry>
      <title>Stunnware Tools for Microsoft Dynamics CRM 4.0 - Version 4.5.27</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=Framework13" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/Framework13" />
      <id>tag:stunnware.com,2009-08-26:Framework13</id>
      <published>2009-08-26T21:00:00+01:00</published>
      <updated>2009-08-26T21:00:00+01:00</updated>
      <content type="html">
    I did a lot of work on the Stunnware Tools application recently and released 
a new version today. Did the same last week as some kind of interim build but 
the new version is (of course) much better than the old one. Here's a list of 
changes I did in the last two weeks:
    </content>
   </entry>
   <entry>
      <title>The CRM 4.0 Metadata Cache</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=MetadataCache" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/MetadataCache" />
      <id>tag:stunnware.com,2009-06-17:MetadataCache</id>
      <published>2009-06-17T23:00:00+01:00</published>
      <updated>2009-06-17T23:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;I don't know about you but I'm using the CRM metadata in almost all of my 
applications. It may be as simple as the need for an object type code and can be 
as complex as implementing some intellisense features. Besides some really basic 
programs I always find myself using the metadata service.&lt;/p&gt;
&lt;p&gt;Of course I have created a bunch of wrapper classes for CRM and some of them 
implement a metadata cache. This, or probably the next article will include the 
entire project implementing the metadata cache. Before that I want to write 
about why a metadata cache is useful and what features it needs to be reusable.&lt;/p&gt;
&lt;p&gt;The most basic implementation of a metadata cache is this:&lt;/p&gt;
&lt;p class="codeNew" style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt; &lt;font color="#2b91af"&gt;CrmMetadata&lt;/font&gt;[] RetrieveAllMetadata(&lt;font color="#2b91af"&gt;MetadataService&lt;/font&gt; service, &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt; itemsToRetrieve) {&lt;br&gt;
   &lt;font color="#2b91af"&gt;RetrieveAllEntitiesRequest&lt;/font&gt; request = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;RetrieveAllEntitiesRequest&lt;/font&gt;()&lt;br&gt;
   {&lt;br&gt;      MetadataItems = itemsToRetrieve,&lt;br&gt;      RetrieveAsIfPublished = &lt;font color="#0000ff"&gt;false&lt;br&gt;
&lt;/font&gt;   };&lt;br&gt;&lt;br&gt;   &lt;font color="#2b91af"&gt;RetrieveAllEntitiesResponse&lt;/font&gt; response = (&lt;font color="#2b91af"&gt;RetrieveAllEntitiesResponse&lt;/font&gt;) service.Execute(request);&lt;br&gt;
   &lt;font color="#0000ff"&gt;return&lt;/font&gt; response.CrmMetadata;&lt;br&gt;}&lt;/p&gt;
&lt;p&gt;It just retrieves the entire metadata at once, which can then be used to 
build internal dictionaries for fast access. This is easy and if your 
application doesn't have to check for changes in the metadata you can use it 
without problems. Retrieving the entire metadata takes a long time though and 
can dramatically slow-down the startup sequence of your application. To know how 
long it takes, I created a simple test method calling the above code with 
different parameters:&lt;/p&gt;
&lt;p class="codeNew" style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;
&lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;[] itemList = &lt;br&gt;{ &lt;br&gt;   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.All,&lt;br&gt;
   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.EntitiesOnly, &lt;br&gt;   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludeAttributes, &lt;br&gt;
   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludePrivileges, &lt;br&gt;   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludeRelationships, &lt;br&gt;
   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludeAttributes | &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludePrivileges,&lt;br&gt;
   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludeAttributes | &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludeRelationships,&lt;br&gt;
   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludePrivileges | &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.IncludeRelationships,&lt;br&gt;
   &lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt;.All &lt;br&gt;};&lt;br&gt;&lt;br&gt;
&lt;font color="#2b91af"&gt;XmlSerializer&lt;/font&gt; s = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;XmlSerializer&lt;/font&gt;(&lt;font color="#0000ff"&gt;typeof&lt;/font&gt;(&lt;font color="#2b91af"&gt;EntityMetadata&lt;/font&gt;[]));&lt;br&gt;
&lt;br&gt;&lt;font color="#0000ff"&gt;foreach&lt;/font&gt; (&lt;font color="#2b91af"&gt;MetadataItems&lt;/font&gt; itemsToRetrieve &lt;font color="#0000ff"&gt;in&lt;/font&gt; itemList) {&lt;br&gt;
&lt;br&gt;   &lt;font color="#2b91af"&gt;Console&lt;/font&gt;.Write(itemsToRetrieve + &lt;font color="#a31515"&gt;": "&lt;/font&gt;);&lt;br&gt;
   &lt;font color="#2b91af"&gt;DateTime&lt;/font&gt; startTime = &lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now;&lt;br&gt;
   &lt;font color="#2b91af"&gt;CrmMetadata&lt;/font&gt;[] allEntities = RetrieveAllMetadata(service, itemsToRetrieve);&lt;br&gt;
   &lt;font color="#2b91af"&gt;TimeSpan&lt;/font&gt; time = &lt;font color="#2b91af"&gt;DateTime&lt;/font&gt;.Now.Subtract(startTime);&lt;br&gt;
   &lt;font color="#0000ff"&gt;int&lt;/font&gt; bytes;&lt;br&gt;&lt;br&gt;   &lt;font color="#2b91af"&gt;EntityMetadata&lt;/font&gt;[] entities = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;EntityMetadata&lt;/font&gt;[allEntities.Length];&lt;br&gt;
   &lt;font color="#0000ff"&gt;for&lt;/font&gt; (&lt;font color="#0000ff"&gt;int&lt;/font&gt; i = 0; i &lt; allEntities.Length; i++) {&lt;br&gt;
      entities[i] = (&lt;font color="#2b91af"&gt;EntityMetadata&lt;/font&gt;) allEntities[i];&lt;br&gt;
   }&lt;br&gt;&lt;br&gt;   &lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt; sb = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;StringBuilder&lt;/font&gt;();&lt;br&gt;
&lt;br&gt;   &lt;font color="#0000ff"&gt;using&lt;/font&gt; (&lt;font color="#2b91af"&gt;StringWriter&lt;/font&gt; w = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;StringWriter&lt;/font&gt;(sb)) {&lt;br&gt;
      s.Serialize(w, entities);&lt;br&gt;      bytes = sb.Length;&lt;br&gt;   }&lt;br&gt;&lt;br&gt;   &lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#a31515"&gt;"{0}ms - {1}KB"&lt;/font&gt;, (&lt;font color="#0000ff"&gt;int&lt;/font&gt;) (time.Ticks / 10000), bytes &gt;&gt; 10);&lt;br&gt;
}&lt;br&gt;&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>Filtered Views for Microsoft Dynamics CRM 4.0 - v4.1.8</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=FV4-2" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/FV4-2" />
      <id>tag:stunnware.com,2009-06-09:FV4-2</id>
      <published>2009-06-09T21:00:00+01:00</published>
      <updated>2009-06-09T21:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;Since creating the first sample on
   &lt;a href="/crm2/topic.aspx?id=AdvancedFind1"&gt;how to use advanced find queries 
   in CRM forms&lt;/a&gt; almost two years ago I worked on this topic from time to 
   time and finally created a ready-to-use product recently. Today I posted an 
   updated version and the product slowly moves into a direction that I like. 
   And of course I hope that you like it too. &lt;/p&gt;
   &lt;p&gt;I think that the most basic reason for trying it out in the beginning was 
   the limitation of having only one associated view. When looking at the 
   contact list in an account I do not want to include the customer attribute, 
   because that will always show the account I'm currently in. But when looking 
   at a marketing list displaying contacts, then it totally makes sense to show 
   the parent customer field. With multiple associated views this wouldn't be a 
   problem, but so far this feature doesn't exist. &lt;/p&gt;
   &lt;p&gt;After having worked with the Filtered Views add-on for several months now 
   myself, it felt it was time to enhance it. It already gave me multiple 
   associated views, but I needed some extra functionality. I do use CRM to 
   track the invoices and payments of Stunnware. CRM isn't an accounting system 
   at all, but it is one of the best ways for me test certain limits and create 
   more ideas. There is not too much to say about invoices and payments: each 
   invoice should have at least one payment. If it does not, then the invoice 
   isn't paid. Pretty simple. &lt;/p&gt;
   &lt;p&gt;An invoice can have multiple payments, though usually zero or one. It is a 
   typical 1:many relationship and therefore an associated view exists:&lt;/p&gt;
   &lt;p&gt;&lt;img height="458" src="/crm2/data/images/FV-2/View1.png" width="761"&gt;&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>Stunnware Tools 4.4.23 released</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=Framework12" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/Framework12" />
      <id>tag:stunnware.com,2009-05-12:Framework12</id>
      <published>2009-05-12T21:00:00+01:00</published>
      <updated>2009-05-12T21:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;I don't know if you are familiar with this feeling: the application runs fine 
in general and it does what it's supposed to do. But when using your own 
application on a daily base, you find a lot of things annoying and suddenly it 
doesn't look as good as some time ago. Long running tasks are blocking the UI, 
preventing you to do edit the sitemap just because the metadata cache is built. 
And at some time you wonder if the blue skinning was the best choice and look 
for alternatives. And then you go back to your implementation and feel that it 
has to be reworked in some areas...&lt;/p&gt;
&lt;p&gt;I worked a lot on the Stunnware Tools Framework in the last two months and 
even took the time to make new screenshots for the help file so that it now 
matches the look and feel of the application. I added an ISV.Config editor and a 
Sitemap editor (don't expect graphical stuff, but it allows you to easily load, 
edit, validate and save these customizations). I also changed major parts of the 
application to a multi-threaded model, so that time-consuming processes are now 
running in the background - mostly. There are still some places where the UI is 
blocked, but as that annoys me as well, I'm going to fix it. &lt;/p&gt;
&lt;p&gt;And of course here's the greatest feature of all: choose your own skin! Ok, 
that isn't a big feature and I always have to laugh when someone advertises such 
a great enhancement, but it was really easy to implement. That is a bad 
statement from a sales perspective, but I'm still a developer. It took me about 
30 minutes to implement, so I think that "easy" is a proper term. Here are some 
impressions:&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>Filtered Views for Microsoft Dynamics CRM 4.0 - Beta</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=FV4-1" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/FV4-1" />
      <id>tag:stunnware.com,2009-03-23:FV4-1</id>
      <published>2009-03-23T13:00:00+01:00</published>
      <updated>2009-03-23T13:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;I have been working on the Filtered Views add-on for quite a while and today it is available for public testing. The add-on is &lt;a href="/crm2/topic.aspx?id=AdvancedFind1"&gt;based on an article&lt;/a&gt; I wrote almost two years ago and you can use this article to create this solution on your own. Because of that, the price of the add-on is rather cheap.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;What are Filtered Views?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Filtered Views are a concept to show data in a view that is filtered on some other data. For instance, let's look at the default history view of a contact:&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>New aggregate in Fetch XML - CountColumn / Update for the Stunnware Tools for Microsoft Dynamics CRM 4.0</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=Framework11" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/Framework11" />
      <id>tag:stunnware.com,2009-03-11:Framework11</id>
      <published>2009-03-11T16:00:00+01:00</published>
      <updated>2009-03-11T16:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;I read
&lt;a href="http://blogs.msdn.com/crm/archive/2009/03/10/support-for-count-distinct-in-fetch-xml-queries.aspx"&gt;
an article&lt;/a&gt; today describing a new aggregate in Fetch XML. It's named &lt;em&gt;
countcolumn&lt;/em&gt; and similar to the count aggregate. However, instead of simply 
doing a COUNT(*), countcolumn returns the number of records having a value and 
you can also specify the &lt;em&gt;distinct&lt;/em&gt; attribute.&lt;/p&gt;
&lt;p&gt;Here are the main differences:&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;&lt;b&gt;The count aggregate&lt;/b&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;
&lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;attribute&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;address1_city&lt;/font&gt;'&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;aggregate&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;count&lt;/font&gt;'&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;alias&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;citycount&lt;/font&gt;'&lt;font color="#0000ff"&gt; /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;This is what we have used in the past and was the only aggregate available in 
Fetch XML. It executes the following SQL query: &lt;/p&gt;
&lt;p style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;
SELECT COUNT(*) AS 'citycount' FROM Account&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;&lt;b&gt;The countcolumn aggregate&lt;/b&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;
&lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;attribute&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;address1_city&lt;/font&gt;'&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;aggregate&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;countcolumn&lt;/font&gt;'&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;alias&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;citycount&lt;/font&gt;'&lt;font color="#0000ff"&gt; /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;This is the new aggregate with the same parameters as before. The resulting 
query is different though:&lt;/p&gt;
&lt;p style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;
SELECT COUNT(address1_city) AS 'citycount' FROM Account&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;&lt;b&gt;The countcolumn aggregate with the distinct option&lt;/b&gt;&lt;/p&gt;
&lt;p style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;
&lt;font color="#0000ff"&gt;&lt;&lt;/font&gt;&lt;font color="#a31515"&gt;attribute&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;address1_city&lt;/font&gt;'&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;aggregate&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;countcolumn&lt;/font&gt;'&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;alias&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;citycount&lt;/font&gt;'&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;distinct&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;'&lt;font color="#0000ff"&gt;true&lt;/font&gt;'&lt;font color="#0000ff"&gt; /&gt;&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;When used with the distinct attribute, the SQL query is changed accordingly:&lt;/p&gt;
&lt;p style="FONT-SIZE: 8pt; FONT-FAMILY: Consolas, Courier New"&gt;
SELECT COUNT(DISTINCT address1_city) AS 'citycount' FROM Account&lt;/p&gt;
&lt;br/&gt;
&lt;p&gt;&lt;b&gt;Stunnware Tools for Microsoft Dynamics CRM 4.0 updated&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I have long awaited a second aggregate and hope there are more to come. I 
have already updated the
&lt;a href="/default.aspx?area=products&amp;group=swtools4&amp;subarea=swtools4-download"&gt;
Stunnware Tools for Microsoft Dynamics CRM 4.0&lt;/a&gt; to support the new countcolum 
aggregate.&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>I am joining the Libertas party</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=MyView6" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/MyView6" />
      <id>tag:stunnware.com,2009-03-10:MyView6</id>
      <published>2009-03-10T17:00:00+01:00</published>
      <updated>2009-03-10T17:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;When thinking that many things are wrong and you start to question a lot of 
things, what do you do? Hope that people in the government wake up and start 
thinking that they may be wrong? That equals to doing nothing. I wrote some 
articles in the past about what I think is wrong and I know that many of you 
share some of these concerns, though many don't. That seems natural and 
everyone's choice.&lt;/p&gt;
&lt;p&gt;I decided that I want to change things and will join the
&lt;a href="http://libertas.eu/"&gt;Libertas&lt;/a&gt; party. You may have read that I'm 
skeptical about the way the EU government works today. I'm not against Europe, 
but it's not right when unelected people decide about 500 million people. You 
probably won't see me as a candidate for the EU election in June, but I'm going 
to support the party where ever I can. It's the first European party and their 
goals are 100% mine, so it was an easy decision to join. The party needs 4000 
support signatures to get a permit for the election and it will be first goal to 
get as many signatures as possible from friends, colleagues and their friends 
and colleagues and so on. If you are German and are interested why I have chosen 
this party, I appreciate you read their
&lt;a href="http://libertas-deutschland.de/programm"&gt;program&lt;/a&gt;. If you agree on 
their (and my) points, please fill out the
&lt;a href="http://libertas-deutschland.de/content/mitmachen"&gt;support form&lt;/a&gt; and 
send it to them. &lt;/p&gt;
&lt;p&gt;I know, we usually don't care about politics. We debate over decisions and 
shake our heads. We get angry but in the end tend to say that we cannot make a 
difference. This is not true. Everyone can make a difference and if that means 
joining a party and maybe trying to run for certain positions, then I will. It's 
time for real change and that change has to come from us. I would like to see 
more people doing the same, but it hopefully is a matter of time only and not a 
general lethargy. Anyway, I made my decision and it will be interesting to see 
how this move affects my life. It doesn't mean anything related to Stunnware, so 
I'm neither quitting the company nor leaving the CRM playground at all. But 
there is more than just business and it seems more important than ever to get 
active.&lt;/p&gt;
&lt;p&gt;Thanks for reading and remember to follow the first link if you are from 
Europe and the two other links when from Germany. Feel free to
&lt;a href="/crm2/topic.aspx?id=AboutContact"&gt;contact me&lt;/a&gt; if you have questions 
or want to talk about it in general.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Michael&lt;/p&gt; 
    </content>
   </entry>
   <entry>
      <title>Problems when importing customizations on a CRM 4.0 system with Update Rollup 2</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=FLD4-7" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/FLD4-7" />
      <id>tag:stunnware.com,2009-02-20:FLD4-7</id>
      <published>2009-02-20T23:00:00+01:00</published>
      <updated>2009-03-20T23:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;I got the second email today stating that relationship names change when 
importing customizations into a CRM 4.0 system with Update Rollup 2 applied and 
after trying myself and narrowing down the problem, I have to say that &lt;strong&gt;
the Filtered Lookup is not supported on a CRM 4.0 installation with Update 
Rollup 2&lt;/strong&gt; installed. Please read the entire article to see if it can 
affect you.&lt;/p&gt;
&lt;p&gt;When importing the Filtered Lookup customization file, either by using the 
Filtered Lookup Configuration Manager or by importing the customization file 
through the CRM web client, into an organization where the Filtered Lookup 
customizations have not been present before and the CRM Server you are using has 
the Update Rollup 2 installed, then relationship names are renamed during the 
import process.&lt;/p&gt;
    </content>
   </entry>
   <entry>
      <title>Why the Irish people should say NO to the Lisbon Treaty</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=MyView5" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/MyView5" />
      <id>tag:stunnware.com,2009-02-17:MyView5</id>
      <published>2009-02-17T22:00:00+01:00</published>
      <updated>2009-03-10T22:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;I really would like to write more about CRM related stuff, but a lot of 
things have been said already and CRM 5 isn't here today. That's not the main 
reason though. &lt;/p&gt;
&lt;p&gt;While the several states of the United States of America say NO to a 
government that became corrupt, arrogant and violent, the EU is still trying to 
build the same kind of monster, that the several states are now trying to get 
rid of. I hope they are doing well and wish them all the best on their way. Let 
freedom and liberty reign again.&lt;/p&gt;
&lt;p&gt;The European government prepared the European Constitution in early 2000 and 
it was meant to be in effect in 2006. However, it had to be ratified in all 
member states, 25 at that time. 18 states voted yes and 2 voted no. Because of 
that, the 5 remaining states weren't asked anymore. Now let's tell it different: 
From the 20 states having voted, how much of them did a referendum? You might 
guess it: 2. And who said no? Yes, exactly these two states. To be more 
specific, it was the Netherlands and France. The people in these countries had a 
chance to express their opinion and said NO! People in all other 18 countries 
where not even asked, but that seems normal these days.&lt;/p&gt;
&lt;p&gt;Because of the failed approach with the European Constitution, the EU 
government or whoever makes these ideas decided to give it another try and 
therefore created the Lisbon Treaty, which is more or less the same as the 
European Constitution that already failed. Nevertheless, they tried it a second 
time in 2008 and meanwhile the EU had grown to 27 states. Because of the bad 
experiences with the failed approach before, the EU decided that asking people 
is a bad thing in general. &lt;/p&gt;
&lt;p class="style1"&gt;&lt;strong&gt;The people in 26 out of 27 states were not asked!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is not a joke. As most of you know, I live in Germany and there are 
about 82 million people living here. We were not asked. It was just decided by 
our politicians and I'm sure that most of them didn't even know what they voted 
for. The Lisbon Treaty more or less gives all power to the European Commission 
and its president. Neither the commission nor the president is elected by us, 
the people. We vote for the European parliament, but that parliament doesn't 
have any legislative power. They also do not choose the members of the 
commission. What they can do is more or less having ideas and making suggestions 
to the commission. SUGGESTIONS! &lt;/p&gt;    
    </content>
   </entry>
   <entry>
      <title>Lost Generation - What if?</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=MyView4" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/MyView4" />
      <id>tag:stunnware.com,2009-02-14:MyView4</id>
      <published>2009-02-14T14:00:00+01:00</published>
      <updated>2009-02-14T14:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;
&lt;a href="http://www.house.gov/apps/list/speech/tx14_paul/WhatIf.shtml"&gt;Statement of Congressman Ron Paul - United States House of Representatives - What If? - February 12, 2009&lt;/a&gt;
&lt;/p&gt;    
&lt;p&gt;What if we wake up one day and realize that the terrorist threat is a predictable consequence of our meddling in the affairs of others?&lt;/p&gt;
&lt;p&gt;What if propping up repressive regimes in the Middle East endangers both the United States and Israel?&lt;/p&gt;
&lt;p&gt;What if occupying countries like Iraq and Afghanistan - and bombing Pakistan - is directly related to the hatred directed toward us and has nothing to do with being free and prosperous?&lt;/p&gt;
&lt;p&gt;What if someday it dawns on us that losing over 5,000 American military personnel in the Middle East since 9/11 is not a fair trade-off for the loss of nearly 3,000 American citizens, no matter how many Iraqi, Pakistani, and Afghan people are killed or displaced?&lt;/p&gt;
&lt;p&gt;What if we finally decide that torture, even if called "enhanced interrogation techniques," is self-destructive and produces no useful information - and that contracting it out to a third world nation is just as evil?&lt;/p&gt;
&lt;p&gt;What if it is finally realized that war and military spending is always destructive to the economy?&lt;/p&gt;
&lt;p&gt;What if all wartime spending is paid for through the deceitful and evil process of inflating and borrowing?&lt;/p&gt;
&lt;p&gt;What if we finally see that wartime conditions always undermine personal liberty?&lt;/p&gt;
&lt;p&gt;What if conservatives, who preach small government, wake up and realize that our interventionist foreign policy provides the greatest incentive to expand the government?&lt;/p&gt;
&lt;p&gt;What if conservatives understood once again that their only logical position is to reject military intervention and managing an empire throughout the world?&lt;/p&gt;
&lt;p&gt;What if the American people woke up and understood that the official reasons for going to war are almost always based on lies and promoted by war propaganda in order to serve special interests?&lt;/p&gt;
&lt;p&gt;What if we as a nation came to realize that the quest for empire eventually destroys all great nations?&lt;/p&gt;
&lt;p&gt;What if Obama has no intention of leaving Iraq?&lt;/p&gt;
&lt;p&gt;What if a military draft is being planned for the wars that will spread if our foreign policy is not changed?&lt;/p&gt;
&lt;p&gt;What if the American people learn the truth: that our foreign policy has nothing to do with national security and that it never changes from one administration to the next?&lt;/p&gt;
&lt;p&gt;What if war and preparation for war is a racket serving the special interests?&lt;/p&gt;
&lt;p&gt;What if President Obama is completely wrong about Afghanistan and it turns out worse than Iraq and Vietnam put together?&lt;/p&gt;
&lt;p&gt;What if Christianity actually teaches peace and not preventive wars of aggression?&lt;/p&gt;
&lt;p&gt;What if diplomacy is found to be superior to bombs and bribes in protecting America?&lt;/p&gt;
&lt;p&gt;What happens if my concerns are completely unfounded - nothing!&lt;/p&gt;
&lt;p&gt;What happens if my concerns are justified and ignored - nothing good!&lt;/p&gt;</content>
   </entry>
   <entry>
      <title>Client Side Scripting - Customer fields again</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=JS34" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/JS34" />
      <id>tag:stunnware.com,2009-02-10:JS34</id>
      <published>2009-02-10T15:00:00+01:00</published>
      <updated>2009-02-10T15:00:00+01:00</updated>
      <content type="html">
   &lt;p class="normal"&gt;I received quite a few emails recently pointing out that 
   the &lt;a href="/crm2/topic.aspx?id=js21"&gt;customer field sample&lt;/a&gt; doesn't work 
   or doesn't always work, so I finally decided to try another approach and came 
   up with a new implementation, which is more elegant and smaller than the old 
   one and hopefully more reliable as well. As usual, this is an unsupported 
   customization.&lt;/p&gt;
   &lt;p class="normal"&gt;In the meantime I received a modified version of the 
   original sample, which I post in this article as well.
    </content>
   </entry>
   <entry>
      <title>Meanwhile in New Hampshire ... 33 U.S. States already are, are now claiming, or are planning for declaration of sovereignty</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=MyView3" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/MyView3" />
      <id>tag:stunnware.com,2009-02-03:MyView3</id>
      <published>2009-02-03T21:00:00+01:00</published>
      <updated>2009-03-22T21:00:00+01:00</updated>
      <content type="html">
&lt;p&gt;If anyone is still believing that everything is fine or will be fine later 
this year or in 2010 without major changes, then I invite you to read the 
resolutions of the State of New Hampshire made in 2009:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;table id="Table2" align="center" border="0" cellPadding="6" cellSpacing="0" width="760"&gt;
	&lt;tr&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;&lt;strong&gt;HCR1&lt;/strong&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;LSR 
		Number: 278&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0001.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="80%"&gt;urging congress to 
		withdraw the United States from the Security and Prosperity Partnership 
		of North America. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td vAlign="top" width="20%"&gt;&lt;b&gt;HCR2&lt;/b&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="20%"&gt;LSR Number: 217&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0002.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="80%"&gt;endorsing the National Health Insurance 
		Act. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;&lt;strong&gt;HCR3&lt;/strong&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;LSR 
		Number: 406&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0003.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="80%"&gt;recommending a statement 
		of principles on international trade. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td vAlign="top" width="20%"&gt;&lt;strong&gt;HCR4&lt;/strong&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="20%"&gt;LSR Number: 827&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0004.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="80%"&gt;supporting the Basel Convention on the 
		international shipment of hazardous waste. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;&lt;strong&gt;HCR5&lt;/strong&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;LSR 
		Number: 634&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0005.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="80%"&gt;urging Congress to enact 
		a system of voluntary public funding for all federal elections. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td vAlign="top" width="20%"&gt;&lt;strong&gt;HCR6&lt;/strong&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="20%"&gt;LSR Number: 274&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0006.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="80%"&gt;&lt;strong&gt;affirming States' rights based on 
		Jeffersonian principles.&lt;/strong&gt;&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;&lt;strong&gt;HCR7&lt;/strong&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;LSR 
		Number: 615&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0007.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="80%"&gt;in support of teen dating 
		violence education. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td vAlign="top" width="20%"&gt;&lt;strong&gt;HCR8&lt;/strong&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="20%"&gt;LSR Number: 405&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0008.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="80%"&gt;urging the President and Secretary of 
		Defense to withdraw all New Hampshire national guard troops from Iraq in 
		the absence of a valid and subsisting Congressional mandate for such 
		service, and withholding the consent of the governor and New Hampshire 
		state legislature from any further deployment of the New Hampshire 
		national guard to Iraq in the absence of such mandate. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;&lt;strong&gt;HCR9&lt;/strong&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="20%"&gt;LSR 
		Number: 621&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0009.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td bgColor="#f2f2f2" vAlign="top" width="80%"&gt;urging the United States 
		Senate to ratify the Comprehensive Test Ban Treaty. &lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;td vAlign="top" width="20%"&gt;&lt;strong&gt;HCR10&lt;/strong&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="20%"&gt;LSR Number: 481&lt;br&gt;
		&lt;a href="http://www.gencourt.state.nh.us/legislation/2009/HCR0010.html"&gt;
		View Bill Text &lt;/a&gt;&lt;/td&gt;
		&lt;td vAlign="top" width="80%"&gt;urging the federal government to withdraw 
		the United States from the North American Free Trade Agreement. &lt;/td&gt;
	&lt;/tr&gt;
&lt;/table&gt;    
    </content>
   </entry>
   <entry>
      <title>The CRM 4.0 Keep Alive Service</title>
      <link rel="alternate" type="text/html" href="http://www.stunnware.com/crm2/topic.aspx?id=KeepAliveService" />
      <link rel="self" type="application/atom+xml" href="http://www.stunnware.com/crm2/atom/KeepAliveService" />
      <id>tag:stunnware.com,2008-12-12:KeepAliveService</id>
      <published>2008-12-12T15:00:00+01:00</published>
      <updated>2009-03-07T15:00:00+01:00</updated>
      <content type="html">
A while ago I posted a sample on how to develop a Windows Service targeting Microsoft Dynamics CRM. I used my own sample to create a service that is doing something meaningful. You probably know about Joris Kalz' Caching Tool for Microsoft Dynamics CRM 3.0 and I asked him if he's planning to upgrade it to a version targeting CRM 4.0. As there were no plans, I decided to create it myself and share it with you. It's really simple and comes with the entire code, so you can change it to your needs.
&lt;br/&gt;&lt;br/&gt;
If you don't know what I'm talking about, then here's the short explanation: an ASP.NET application isn't loaded before accessed for the first time. And an ASP.NET application is unloaded if the IIS application pool is recycled. As CRM is an ASP.NET application, you should have noticed that there is a delay when opening the CRM web client for the first time, because usually the application pool was recycled and CRM isn't initialized. The time needed for the first initialization is very different from system to system and ranges between a few seconds up to 30 seconds and sometimes even more. This problem isn't in any way specific to CRM. 
&lt;br/&gt;&lt;br/&gt;
&lt;b&gt;What has to be initialized?&lt;/b&gt;
&lt;br/&gt;
When making the first request to CRM (or any other ASP.NET page), then IIS loads the requested page and parses it. If ASP.NET code is associated with the page, then it is compiled and executed. If one or more assemblies are bound to the page, then they have to be loaded. Some assemblies have references to other assemblies and they are loaded as well. Web service bindings may be initialized and finally the code is executed, which often is an initial caching of metadata and/or reading of configuration values. This takes some seconds and it's extremely annoying for a user to wait until it's done. The goal of Joris' and my implementation simply is a background service polling CRM - or other web applications - continuously. If the IIS application pool is recycled or the ASP.NET application has to be initialized again, then the service will do it and the user doesn't have to wait when starting the application.
&lt;br/&gt;&lt;br/&gt;
CRM uses the SQL Server as its database backend and SQL Server uses caching as well. The more traffic you have on a SQL database, the more gets cached and the faster the system becomes. At least in theory. So accessing all kind of CRM entities builds up the SQL cache as well. All of it is done by the Keep Alive Service.
    </content>
   </entry>
</feed>