<?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>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>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>
</feed>