Tuesday, March 04, 2008

isv.config in CRM 4.0

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

6 comments:

  1. Hello there,

    I was wondering if I could ask you if you knew of any good resources related to getting a CRM Action/Workflow to successfully connect to SharePoint that has Kerberos enabled.

    We have this working fine with NTLM, but with Kerberos enabled it stops working. :-)

    Thanks for any suggestions,

    Greg

    ReplyDelete
  2. Hi Greg,
    The simplest solution would probably be to just extend your existing sharepoint site with a NTLM extension on another TCP-port and use that for integration.

    Apart from that I am not aware of any site that discusses this. You should probably look for SharePoint specific sites, since it is a .NET - SharePoint related problem and does not really concern CRM.

    Gustaf

    ReplyDelete
  3. Are you aware of anyone who has a tool to update menus without having to go into this XML detail.

    I'd like to see an entity type called MENU which would contain all the menu and action (from menu selection) items. This way the customization process (without SDK) could be much more user friendly.

    I am developing a Hotel Management System and need "process" menu items : like

    Check-In

    ReplyDelete
  4. Hi,
    No, I havn't seen any tool for that, perhaps you could use some graphical xml tool but be aware that many of them really mess up the code.

    It really isn't that hard working with the isv.config and xml, you just have to get used to it. You could attend a 1 or 2 day course in xml and you'd have enough knowledge on how to do it.

    If you find a tool, please let me know!

    Gustaf

    ReplyDelete
  5. Crm 4.0 Sitemap & ISV.Config Editor

    http://www.patrickverbeeten.com/pages/ContentItemPage.aspx?id=12&item=64&p=true

    ReplyDelete
  6. Thanks for the posting of the clean ISV file Gustaf!

    ReplyDelete