by Gustaf Westerlund | Sep 2, 2008
Hi y’all!
My parental leave is soon at it’s end and this thursday I will be back to work in full force! Hopefully I will also have lots of interesting topics to write about aswell!
.NET Awards will be held this thursday here in Sweden in the Stockholm suburb of Kista. The solution I have been working with since I started at Logica, ICE42 for ICE.NET, a Swedish Telecom Operator, has been nominated and we will hopefully win!
If you are fluent in Swedish you can watch a move with my colleague Mats Jonasson and the CIO of ICE.NET Thomas Norberg as they talk about the solution. Unfortunatley, I was ill the day of the recording, hence, I am not in it.

.NET Awards 08 Nominerad: Logica Sverige AB
Gustaf Westerlund
Microsoft Dynamics CRM Architect
Logica Sweden
www.logica.com
by Gustaf Westerlund | Apr 22, 2008
Hi again,
Busy as ever, I am still working on this large CRM project with lots of integrations. Very complex and very interesting.
At the moment we running CRM 3.0 but we are currently looking at upgrading to CRM 4.0 since we need to implement a new datamodell containing more than 40 very tighly connected entities with multiple relationships, self referentail relationships and much more! We are very lucky to be working with CRM 4.0.
The first part of the upgrade we are doing will be to just get everyting working in CRM 4.0 with as little or no code review as possible. We will lift all the code later (i.e. converting callouts to plug-ins, using the new web service and so on) when we have got everything running.
In other words, I first of all needed to get callouts from CRM 3.0 to work properly in CRM 4.0. After the “sleep-inducing-upgrade”, I found that they simply didn’t work. As I had made a few callouts that generated custom accountnumbers and other similar tasks, it became clear that it crashed because of the callouts.
I activated CRM tracing (http://support.microsoft.com/kb/907490/en-us) and soon found that the reason for the callouts not working was that CRM could not find the dll containing callout.base. So, I added the dll (Microsoft.Crm.Platform.Callout.Base.dll, found on the CRM 3.0 CD 1) to the GAC (C:windowsassembly) and then ran iisreset.
After this, the callouts worked just like they should!
On the same topic, if you have a custom virtual directory bellow the CRM website, just add the file: C:Program FilesMicrosoft CRMCRMWebbinMicrosoft.Crm.WebServices.dll to the GAC aswell, since it won’t work otherwise. There are other ways of getting around this problem aswell, but I prefer this solution.
On the first of may I will be on parental leave for 4 months, so that I can really get to know my daughter without my wife getting in the way! 😉
Hopefully I will have time to write a bit on this blog aswell.
Gustaf Westerlund
Microsoft Dynamics CRM Architect
Logica Sweden
www.logica.com
p.s.
If you havn’t tried Bio Shock on XBOX 360, you really should!
by Gustaf Westerlund | Mar 4, 2008
I recently wanted to add a button in CRM 4.0 and I found that, even though there are many similarirties with CRM 3 there are some differences. I thought I’d share this with you and also some examples of it with a minimal (empty but working) isv.config and a one-button-in-order-version so that it will be easier for you to add your own buttons.
First of all, in CRM 4.0 there is no isv.config in the _resources folder any more. Not very strange since CRM 4.0 is multi-tennant and each tennant can have a unique isv.config. So, where is it? The most obvious place to look for it is in the “export customization” view, and surprise, there it is!
So, to change it in short, select isv.config from the export customizations and press select “export selected customizations” from the action menu. Save the zip-file somewhere, unzip the xml and open it in your favortite xml editor or notepad. When done, just import the xml directly (yes, it supports importing the xml file directly without zipping it first). If you have done your job correctly, there should be no problem, if not, you might get an error. Revert to an older version of the file (always save a backup before doing any changes) and then try a smaller change.
To activate isv.config customizations you have to “enable” these customizations from the web.config in the CRM web folder. Please see the SDK for more info.
To make things easier for you, here is the code in an empty/minimal isv.config (that has worked for me any how). There might be things that can be removed still, to make it smaller. Please leave a comment if you know of any. Please note the lcid:s (language code id:s) that appear all through, as you can see, this is the english version (1033).
<ImportExportXml version=”4.0.0.0″ languagecode=”1033″ generatedBy=”OnPremise”>
<Entities>
</Entities>
<Roles>
</Roles>
<Workflows>
</Workflows>
<IsvConfig>
<configuration version=”3.0.0000.0″>
<Root>
<NavBarAreas>
</NavBarAreas>
<!– The main Global Menu Bar located at the top of all root level areas –>
<MenuBar>
<!– Custom Menus that appear between the Goto Menu and the Help Menu –>
<CustomMenus>
<Menu>
</Menu>
</CustomMenus>
</MenuBar>
<!–
Application Level Tool Bar
–>
</Root>
<!– Microsoft Customer Relationship Management Entities (Objects) –>
<Entities>
<Entity name=”account” />
<Entity name=”contact” />
<Entity name=”lead” />
<Entity name=”opportunity” />
<Entity name=”list” />
<Entity name=”campaign” />
<Entity name=”campaignactivity” />
<Entity name=”campaignresponse” />
<Entity name=”incident” />
<!– Case –>
<Entity name=”quote” />
<Entity name=”salesorder” />
<!– Order –>
<Entity name=”invoice” />
<!– Custom Entities –>
<!– <Entity name=”new_myentity”/> –>
<!– End Custom Entities –>
</Entities>
<!– Microsoft Customer Relationship Management Service Management Customization –>
<ServiceManagement>
<AppointmentBook>
<SmoothScrollLimit>2000</SmoothScrollLimit>
<TimeBlocks>
<!– All CSS Class mapping for Service activities –>
<TimeBlock EntityType=”4214″ StatusCode=”1″ CssClass=”ganttBlockServiceActivityStatus1″ />
<TimeBlock EntityType=”4214″ StatusCode=”2″ CssClass=”ganttBlockServiceActivityStatus2″ />
<TimeBlock EntityType=”4214″ StatusCode=”3″ CssClass=”ganttBlockServiceActivityStatus3″ />
<TimeBlock EntityType=”4214″ StatusCode=”4″ CssClass=”ganttBlockServiceActivityStatus4″ />
<TimeBlock EntityType=”4214″ StatusCode=”6″ CssClass=”ganttBlockServiceActivityStatus6″ />
<TimeBlock EntityType=”4214″ StatusCode=”7″ CssClass=”ganttBlockServiceActivityStatus7″ />
<TimeBlock EntityType=”4214″ StatusCode=”8″ CssClass=”ganttBlockServiceActivityStatus8″ />
<TimeBlock EntityType=”4214″ StatusCode=”9″ CssClass=”ganttBlockServiceActivityStatus9″ />
<TimeBlock EntityType=”4214″ StatusCode=”10″ CssClass=”ganttBlockServiceActivityStatus10″ />
<!– All CSS Class mapping for Appointments –>
<TimeBlock EntityType=”4201″ StatusCode=”1″ CssClass=”ganttBlockAppointmentStatus1″ />
<TimeBlock EntityType=”4201″ StatusCode=”2″ CssClass=”ganttBlockAppointmentStatus2″ />
<TimeBlock EntityType=”4201″ StatusCode=”3″ CssClass=”ganttBlockAppointmentStatus3″ />
<TimeBlock EntityType=”4201″ StatusCode=”4″ CssClass=”ganttBlockAppointmentStatus4″ />
<TimeBlock EntityType=”4201″ StatusCode=”5″ CssClass=”ganttBlockAppointmentStatus5″ />
<TimeBlock EntityType=”4201″ StatusCode=”6″ CssClass=”ganttBlockAppointmentStatus6″ />
</TimeBlocks>
</AppointmentBook>
</ServiceManagement>
</configuration>
</IsvConfig>
<EntityMaps />
<EntityRelationships />
<Languages>
<Language>1033</Language>
<Language>1036</Language>
<Language>1031</Language>
<Language>3082</Language>
<Language>1053</Language>
</Languages>
</ImportExportXml>
And the one containing only one button:
<ImportExportXml version=”4.0.0.0″ languagecode=”1033″ generatedBy=”OnPremise”>
<Entities>
</Entities>
<Roles>
</Roles>
<Workflows>
</Workflows>
<IsvConfig>
<configuration version=”3.0.0000.0″>
<Root>
<NavBarAreas>
</NavBarAreas>
<!– The main Global Menu Bar located at the top of all root level areas –>
<MenuBar>
<!– Custom Menus that appear between the Goto Menu and the Help Menu –>
<CustomMenus>
<Menu>
</Menu>
</CustomMenus>
</MenuBar>
<!–
Application Level Tool Bar
–>
</Root>
<!– Microsoft Customer Relationship Management Entities (Objects) –>
<Entities>
<Entity name=”account” />
<Entity name=”contact” />
<Entity name=”lead” />
<Entity name=”opportunity” />
<Entity name=”list” />
<Entity name=”campaign” />
<Entity name=”campaignactivity” />
<Entity name=”campaignresponse” />
<Entity name=”incident” />
<!– Case –>
<Entity name=”quote” />
<Entity name=”salesorder”>
<MenuBar>
<!– Custom Menus that you may add –>
</MenuBar>
<!– The Account Tool Bar –>
<ToolBar ValidForCreate=”0″ ValidForUpdate=”1″>
<Button Icon=”/_imgs/ico_18_debug.gif” Url=”http://www.microsoft.com” PassParams=”1″ WinParams=”” WinMode=”0″>
<Titles>
<Title LCID=”1033″ Text=”asdf” />
</Titles>
<ToolTips>
<ToolTip LCID=”1033″ Text=”Info on Test” />
</ToolTips>
</Button>
</ToolBar>
<!– The Account Left Nav Bar –>
</Entity>
<!– Order –>
<Entity name=”invoice” />
<!– Custom Entities –>
<!– <Entity name=”new_myentity”/> –>
<!– End Custom Entities –>
</Entities>
<!– Microsoft Customer Relationship Management Service Management Customization –>
<ServiceManagement>
<AppointmentBook>
<SmoothScrollLimit>2000</SmoothScrollLimit>
<TimeBlocks>
<!– All CSS Class mapping for Service activities –>
<TimeBlock EntityType=”4214″ StatusCode=”1″ CssClass=”ganttBlockServiceActivityStatus1″ />
<TimeBlock EntityType=”4214″ StatusCode=”2″ CssClass=”ganttBlockServiceActivityStatus2″ />
<TimeBlock EntityType=”4214″ StatusCode=”3″ CssClass=”ganttBlockServiceActivityStatus3″ />
<TimeBlock EntityType=”4214″ StatusCode=”4″ CssClass=”ganttBlockServiceActivityStatus4″ />
<TimeBlock EntityType=”4214″ StatusCode=”6″ CssClass=”ganttBlockServiceActivityStatus6″ />
<TimeBlock EntityType=”4214″ StatusCode=”7″ CssClass=”ganttBlockServiceActivityStatus7″ />
<TimeBlock EntityType=”4214″ StatusCode=”8″ CssClass=”ganttBlockServiceActivityStatus8″ />
<TimeBlock EntityType=”4214″ StatusCode=”9″ CssClass=”ganttBlockServiceActivityStatus9″ />
<TimeBlock EntityType=”4214″ StatusCode=”10″ CssClass=”ganttBlockServiceActivityStatus10″ />
<!– All CSS Class mapping for Appointments –>
<TimeBlock EntityType=”4201″ StatusCode=”1″ CssClass=”ganttBlockAppointmentStatus1″ />
<TimeBlock EntityType=”4201″ StatusCode=”2″ CssClass=”ganttBlockAppointmentStatus2″ />
<TimeBlock EntityType=”4201″ StatusCode=”3″ CssClass=”ganttBlockAppointmentStatus3″ />
<TimeBlock EntityType=”4201″ StatusCode=”4″ CssClass=”ganttBlockAppointmentStatus4″ />
<TimeBlock EntityType=”4201″ StatusCode=”5″ CssClass=”ganttBlockAppointmentStatus5″ />
<TimeBlock EntityType=”4201″ StatusCode=”6″ CssClass=”ganttBlockAppointmentStatus6″ />
</TimeBlocks>
</AppointmentBook>
</ServiceManagement>
</configuration>
</IsvConfig>
<EntityMaps />
<EntityRelationships />
<Languages>
<Language>1033</Language>
<Language>1036</Language>
<Language>1031</Language>
<Language>3082</Language>
<Language>1053</Language>
</Languages>
</ImportExportXml>
Gustaf Westerlund,
Microsoft Dynamics CRM Architect,
Logica Sweden
by Gustaf Westerlund | Feb 13, 2008
Today I was deploying from a development environment to a test environment and part of this is moving the customizations made within the CRM GUI. I simply exported the customizations.xml and tried to import it to the test system. Only to get a very angry “SQL Error”. Hmm… not very nice to see those, that usually means that somethings gone really bad, and you usually wish you hade just taken a complete backup of CRM.
Well, things only got worse when I tried to access CRM with the common url, I got a really nasty error saying that some custom attribute wasn’t at all like some other custom attribute. No dah, my worst fears just got real and I could only face the fact that the CRM meta database had somehow become corrupt. Really bad, testing was supposed to begin today, so really bad timing (and timeplan).
So, what to do? Since I couldn’t access CRM I couldn’t get to the import cusomtizations page, so I had a look in the SDK for the direct URL to the import customizations page (it is under sitemap customizations). I tried to reimport the customizations file from my development server, only to find that CRM now found the xml “malformed” in this file. After some testing, I found that it acctually found all customizations files to be malformed, not only the first one. So, something really sinister is at hand. Time to log into the SQL-Server.
The first message that faced me was that one of the drives had to litte disk space… I had a look and found that the main data disk had only 2 MB free. So, this was probably it. First, there probably hadn’t been space enough for commiting all the changes that were in the new customization file and then there hadn’t been space enough to upload the new customizations file. The error message of mal-formed xml had just been an erroneous error message.
So, I freed some space on the disk and just to be sure, I re-installed CRM entirely (it was just a test environment after all) and imported the customization file, and all went well!
Well, there was acctually one thing, when I imported the customization file I got an error saying that at some row XXX in the file there was something wrong. At the specific row, was a tag for setting “displayInApplication” or something like that for the entity “Bulk Operation”. I tried to remove the tag and import it, which worked. I later remembered that I hadn’t installed Update Rollup 2, which I later confirmed was the cause of this error. I had exported from a CRM 3 UR2 system and imported into a standard CRM 3, hence the error. So, I would suggest not removing the tag but instead updateing your CRM :).
Gustaf Westerlund
Microsoft Dynamics CRM Consultant
WM-Data/Logica CMG
www.logicacmg.com
by Gustaf Westerlund | Feb 13, 2008
We have invested in a virtual server host, a really cool machine with Dual Quadcore XEON processors and 16 GB memory (yes, I am some what of a techno-geek). To be able to use it properly, I wanted to install Virtual Server 2005 R2.
Not so easy. I connected with remote desktop and tried to install virtual server, but I just couldn’t get it to work properly, so I went out on the net and looked for a solution.
The result was that I found that you cannot install or run the virtual server web interface using remote desktop if you do not connect as “console”. Weird, but that’s what I found.
So, how to connect with remote desktop as “console” (that is ID 0). If you like your command prompt, you’ll know that Remote Desktop is called “mstsc” just, use that with the switch “/console” and you will connect as console.
Personally I like to make things simple, why I have made a small bat-file with the following content:
mstsc %1 /console
Then I just drag-n-drop my rdp-file ontop of the batfile. This will result in a console connection to the server set in the rdp-file.
I hope this helps!
Gustaf Westerlund
Microsoft Dynamics CRM Consultant
WM-Data/Logica CMG
www.logicacmg.com
Recent Comments