Thursday, February 12, 2009

Client Side Scripting - Customer fields again

SUNNWARE 10.02.2009


received quite a few emails recently pointing out that the customer field sample 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.

In the meantime I received a modified version of the original sample, which I post in this article as well. 

The OnLoad code

You need an account lookup and a contact lookup field on your form to run this code. Some properties of the account lookup are modified in such a way that CRM treats it as a real customer field. It's also important to set the default value when initializing the "customer" (account) field with a contact, to prevent unwanted warning messages ("Do you really want to navigate away from this ....") when closing the form.

 

// Change "sw_accountid" and "sw_contactid" to the field names you are using.


var accountLookup = crmForm.all.sw_accountid;


var contactLookup = crmForm.all.sw_contactid;


 


// Set the available lookup types to account and contact.


accountLookup.lookuptypes = "1,2";


accountLookup.lookuptypenames = "account:1,contact:2";


 


// Set the icons to use for the account and contact.


accountLookup.lookuptypeIcons = "/_imgs/ico_16_1.gif:/_imgs/ico_16_2.gif";


 


// If there is an existing value stored in the contact lookup, then pass it to the "customer" lookup.


if (contactLookup.DataValue != null) {


 


   // Set the default value of our customer field to the contact. If you don't do this, CRM assumes


   // that the customer was changed and will display a warning messaging when closing the form


   // without saving.   


   accountLookup.DefaultValue = contactLookup.DataValue;


   accountLookup.DataValue = contactLookup.DataValue;


 


   if (typeof (accountLookup.DataValue[0].data) != "undefined") {


      // For some reason, the data property of the DataValue is set to an empty string, while the


      // data property of the DefaultValue is undefined. The data property is part of the comparison


      // CRM does when looking for modified fields. In order for CRM to truly believe that our


      // customer field wasn't changed - though we did - this data property has to be set accordingly.


      accountLookup.DefaultValue[0].data = accountLookup.DataValue[0].data;


   }


}


 




 



The OnSave code



The OnSave code simply stores the selected customer in the account and contact lookups. When using an OnChange event in the sw_accountid field, make sure to differentiate if the event was fired due to the user selecting a record or the OnSave modifying it. A simple way to do it, is setting a global variable in the OnSave event and comparing that value in OnChange.





// Change "sw_accountid" and "sw_contactid" to the field names you are using.


var accountLookup = crmForm.all.sw_accountid;


var contactLookup = crmForm.all.sw_contactid;


 


// If there is no value selected in "customer" lookup, then clear the contact lookup.


if (accountLookup.DataValue == null) {


   contactLookup.DataValue = null;


}


 


// Otherwise check the lookup type and copy the selected value to the contact lookup if appropriate.


else {


   var customer = accountLookup.DataValue[0];


 


   // A type code of 1 represents an account.


   if (customer.type == "1") {


      // If it is an account, then clear the contact lookup.


      contactLookup.DataValue = null;


   }


 


   else {


      // A contact was selected, so copy the value to the contact lookup and clear the account lookup.


      contactLookup.DataValue = accountLookup.DataValue;


      accountLookup.DataValue = null;


   }


}




 



Modified version of the original sample



As reported by some others, Alejandro Cesetti (ale [dot] cesetti [at] gmail.com) had problems with the original code, and sent me an email explaining the problem and the fix:



Reproducing the bug



When you save the entity having the “custom” Customer attribute with an Account being selected everything is ok. Then, if you open the same instance of the entity, and edit it changing the value of the Customer from an Account to a Contact, after you save your changes, the value shown in the Customer field is still the Account value and, what is more, the account relationship in DB isn’t updated to null keeping the relationship to the account.



How did I fix it



What I did was to hide the Account field as the Contact field and add another field in the place where I want the Customer field to be shown. Then the ExchangeLookups function will exchange the new lookup field with the Customer and vice versa instead of the Account field.



OnLoad Code





/******************************************************************************


* Global variables required to setup the customer field. You have to replace


* the values of AccountFieldName and ContactFieldName when using attribute


* names different than the one used in this sample.


*****************************************************************************/


AccountFieldName = "hud_accountid";


ContactFieldName = "hud_contactid";


CustomerFieldName = "hud_customerid";


CreatedByName = "createdby";


AccountLookup = crmForm.all.item(AccountFieldName);


ContactLookup = crmForm.all.item(ContactFieldName);


CreatedByLookup = crmForm.all.item(CreatedByName);


CustomerLookup = null;


CreatedByInnerHTML = null;


AllFieldsAvailable = (AccountLookup != null) && (ContactLookup != null);


 


/******************************************************************************


* GetLookupFieldHtml builds the inner HTML of a lookup control. Used to


* dynamically create the customer lookup.


*****************************************************************************/


function GetLookupFieldHtml(name, tabIndex, lookupTypes, lookupTypeNames, lookupTypeIcons, reqLevel) {


 


   var html = "<table class=\"ms-crm-Lookup\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"table-layout:fixed;\">" +


        "<tr>" +


        "<td>" +


        "<div ime-mode=\"auto\" class=\"ms-crm-Lookup\" tabindex=\"" + (parseInt(tabIndex) + 1) + "\"></div>" +


        "<label class=\"ms-crm-Hidden-NoBehavior\" for=\"" + name + "_ledit\"></label>" +


        "<input class=\"ms-crm-Hidden-NoBehavior\" ime-mode=\"auto\" type=\"text\" tabindex=\"" + tabIndex + "\" id=\"" + name + "_ledit\" maxlength=\"1000\"/>" +


        "</td>" +


        "<td width=\"25\" class=\"Lookup_RenderButton_td\">" +


        "<img src=\"/_imgs/btn_off_lookup.gif\" id=\"" + name + "\" class=\"ms-crm-Lookup\" req=\"" + reqLevel + "\" style=\"ime-mode:auto\" lookuptypes=\"" + lookupTypes + "\" lookuptypenames=\"" + lookupTypeNames + "\" lookuptypeIcons=\"" + lookupTypeIcons + "\" lookupclass=\"BasicCustomer\" lookupbrowse=\"0\" lookupstyle=\"single\" defaulttype=\"0\" autoresolve=\"1\" showproperty=\"1\" resolveemailaddress=\"0\">" +


        "<a href=\"#\" onclick=\"previousSibling.click();\" tabindex=\"-1\"></a>" +


        "</td>" +


        "</tr>" +


        "</table>";


 


   return html;


}


 


/******************************************************************************


* A sample event handler. As the customer lookup does not exist on the form,


* you cannot add an OnChange event handler in the CRM client. This method is


* used as an alternative.


*****************************************************************************/


function Customer_OnChange() {


   alert("Customer changed");


}


 


/******************************************************************************


* Helper function. Retrieves a field by its name.


*****************************************************************************/


GetField = function(name) {


   return crmForm.all.item(name);


}


 


/******************************************************************************


* Helper function. Retrieves the id of the TD element hosting a lookup control.


*****************************************************************************/


GetLookupCellId = function(name) {


   return name + "_d";


}


 


/******************************************************************************


* Helper function. Retrieves the TD element hosting a lookup control.


*****************************************************************************/


GetLookupCell = function(name) {


   return GetField(GetLookupCellId(name));


}


 


/******************************************************************************


* ExchangeLookups replaces an existing lookup control with another one. Used


* to replace the account lookup with the customer lookup and vice versa.


*****************************************************************************/


ExchangeLookups = function(lookupToShowId, lookupToHideId, newLookupHtml) {


   var prevCell = GetLookupCell(lookupToHideId);


   var prevCellIndex = prevCell.cellIndex;


   var row = prevCell.parentNode;


 


   row.deleteCell(prevCellIndex);


 


   var newCell = row.insertCell(prevCellIndex);


   newCell.id = GetLookupCellId(lookupToShowId);


   newCell.innerHTML = newLookupHtml;


}


 


/******************************************************************************


* CreateCustomerField creates the customer lookup and replaces the account


* lookup on the form.


*****************************************************************************/


function CreateCustomerField() {


   var customerValue;


 


   if (AccountLookup.DataValue != null) {


      customerValue = AccountLookup.DataValue;


   }


   else {


      customerValue = ContactLookup.DataValue;


   }


 


   var accountLookupEditField = GetField(AccountFieldName + "_ledit");


   var tabIndex;


 


   //If the account field supports the auto-resolve feature, then the tab-index is stored on the text field


   //of the lookup control


   if (accountLookupEditField == null) {


      tabIndex = AccountLookup.getAttribute("tabIndex");


   }


 


   //otherwise we use the same tabIndex as in the 3.0 implementation.


   else {


      tabIndex = accountLookupEditField.getAttribute("tabIndex");


   }


 


   //Standard values for a customer field


   var lookupTypes = "1,2";


   var lookupTypeNames = "account:1,contact:2";


   var lookupTypeIcons = "/_imgs/ico_16_1.gif:/_imgs/ico_16_2.gif";


   var reqLevel = AccountLookup.getAttribute("req");


   var customerIdHtml = GetLookupFieldHtml(CustomerFieldName, tabIndex, lookupTypes, lookupTypeNames, lookupTypeIcons, reqLevel);


 


   //    ExchangeLookups(CustomerFieldName, AccountFieldName, customerIdHtml);


   ExchangeLookups(CustomerFieldName, CreatedByName, customerIdHtml);


 


   CustomerLookup = GetField(CustomerFieldName);


   CustomerLookup.DataValue = customerValue;


   //  Here we are able to attach events to the customer field 


   //    CustomerLookup.onchange = Customer_OnChange;


}


 


/******************************************************************************


* Main code: If the required fields are avaialable on the form, the account


* lookup is replaced with a customer lookup. The CreatedByInnerHTML is saved to


* restore the original state later (see OnSave).


*****************************************************************************/


if (AllFieldsAvailable) {


   CreatedByInnerHTML = GetLookupCell(CreatedByName).innerHTML;


 


   CreateCustomerField();


}




 



OnSave Code





/******************************************************************************


* If the required fields are available on the form, the CreatedBy


* lookup was replaced with a customer lookup in the OnLoad event. To properly


* save the values, we have to restore the original state, meaning that the


* customer lookup has to be removed and the CreatedBy lookup has to be added


* back.


*****************************************************************************/


if (AllFieldsAvailable) {


   var customer = CustomerLookup.DataValue;


 


   ExchangeLookups(CreatedByName, CustomerFieldName, CreatedByInnerHTML);


 


   if (customer == null) {


      AccountLookup.DataValue = null;


      ContactLookup.DataValue = null;


   }


 


   else if (customer[0].type == "1") {


      AccountLookup.DataValue = customer;


      ContactLookup.DataValue = null;


   }


 


   else {


      AccountLookup.DataValue = null;


      ContactLookup.DataValue = customer;


   }


} 


 


 


CRM Update Rollup 2 Musings

Posted by Jim Steger on February 11, 2009


As most of you know by now, Microsoft CRM Support has released Update Rollup 2 for Dynamics CRM 4.0. Here are some quick findings that we have discovered that I hope can be useful for some of you.

Exporting and importing customizations
Update Rollup 2 made some schema changes to the customizations and the rollup documentation provides a general warning about only export/importing customizations from system with the same rollup installed. This approach is painful for our development environment and for ISVs, as it is not easy to guarantee that all customers will be on the same rollup. What I learned from the product and support teams (and confirmed with some quick testing) is the schema changes to the customization file in UR2 is confined to just Templates and Outlook Synchronization areas.

Therefore, if you need to import/export between different rollup deployments, you should be ok provided you excluded those two customizations from your file.

I am hoping that CRM Support will be more specific with the customization schema changes on future rollup releases, or better yet, allow them to be backwards compatible between rollups.
Manually configured steps
There are a number of hotfixes that require manual configuration. I didn't see these documented too well (although I could have missed it). Anyway, here is a list that we have discovered. Note that this could just be a partial list.

  • 955452 (http://support.microsoft.com/kb/955452/ ) Line feeds are not used when you send an e-mail message that uses an e-mail template to render data that has line feeds in Microsoft Dynamics CRM 4.0
  • 955745 (http://support.microsoft.com/kb/955745/ ) Error message when you try to configure the Microsoft Dynamics CRM 4.0 client for Outlook: "This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms"
  • 956527 (http://support.microsoft.com/kb/956527/ ) The Microsoft Dynamics CRM client for Outlook consumes three times as much memory in version 4.0 as in version 3.0
  • 959248 (http://support.microsoft.com/kb/959248/ ) Microsoft Dynamics CRM 4.0 slows to unacceptable levels when you process e-mail messages by using the Microsoft Dynamics CRM E-mail Router
  • 957871 (http://support.microsoft.com/kb/957871/ ) The Workflow Expansion Task records cause the AsyncOperationBase table in the MSCRM database to grow too large in Microsoft Dynamics CRM 4.0

Miscellaneous Notes/FAQ

  • When you install any rollup, it will affect the entire deployment. For those of you that leverage multi-tenancy (as we do in our client development environment), you need to be aware of this and plan the release accordingly. Pay special care to the customizations changes and quickly review each hotfix within the rollup to ensure there won't be compatibility issues with your custom code. Naturally if your custom code follows the supported SDK, you should be ok from rollup to rollup.
  • Update Rollup 2 may screw up your existing CRM web.config. I recommend you make a backup of the CRM web.config file prior to running the rollup. Here are two errors we have seen:
    • Publishing workflow rules fails. This error is now documented in the release notes. You need to update the CRM web.config files and add the following line to the <authorizedTypes> section:
      <authorizedType Assembly="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Namespace="System.Globalization" TypeName="CultureInfo" Authorized="True"/>
    • We had our IFD settings wiped out from the CRM web.config. To correct, we used the IFD tool to reset the values.
  • Microsoft recommends that you keep the update rollups between the Outlook client and the CRM server in sync. I am not sure this is always a hard requirement, as we have some internal Outlook clients on the latest rollup, prior to updating our server. This is something you can test, if rolling out to your Outlook clients users is not always easy to do.
  • Each rollup *should* be cumulative. This means that you can install UR2 on a system that hasn't been patched with UR1.

Workflow: Determining the

Posted by: mitch of Mitch Milam's Microsoft Discussions


I ran into something unexpected this week at a customer site: Internal system jobs, like Matchcode Updates, stuck in with a waiting status.  For workflows, this usually means there are errors preventing the workflow from proceeding.  But, I've never seen it on internal jobs before.

After asking around, Mahesh at Microsoft pointed out a method for attaining additional information regarding the status of a System Job.  Follow these steps:

[ as a CRM Administrator ]

1) Select Settings, System Jobs to display a list of currently running or ran jobs.

2) Click the Advanced Find button and the following dialog will be displayed:

image

3) Click Edit Columns then add the column Message, as shown below:

image

This will display the actual status message and allow you to determine if a workflow or system job is waiting because it is supposed to, or if it is waiting because it encountered an error.

The following is a sample of system jobs - Matchcode Updates - that have failed because of an environmental change:

image

Note: The status is canceled because I manually canceled these jobs after I located and corrected the issue. Their normal status would have been Waiting.

This surely helped my troubleshooting.  I hope it helps yours.

ISV Utilities for Comparing Customizations and Transferring Configuration Data

Yippie. These tools will help compare two systems and see where the changes are.

 

Inna Agranov
Microsoft Corporation

February 2009

Summary

Learn how to build and use two new powerful tools developed for Microsoft Dynamics CRM. The Customization Comparison Utility lets you compare the customization files between two Microsoft Dynamics CRM systems and the Configuration Data Utility lets you transfer custom configuration data from one Microsoft Dynamics CRM system to another.

Download the Visual Studio 2008 and Visual C# code samples for this article:

The Readme.doc documents that are included with the sample code contain information about how to set up and build the sample applications. The user guides contain detailed information about how to use the sample applications and view the results.

Applies To

Microsoft Dynamics CRM 4.0

Microsoft Visual Studio 2008

Introduction

Microsoft Dynamics CRM is a highly customizable system. Not only you can modify different sections of the product, you can also create new components to address business needs. The Microsoft Dynamics CRM platform offers a robust set of tools, APIs, and documentation that helps you build custom business applications. As the applications built on the Microsoft Dynamics CRM platform become more and more complex, a need for specialized support tools grows. In this article you will learn about two very useful tools that help you analyze the impact of customizations on the system and maintain consistent configuration data across multiple Microsoft Dynamics CRM systems.

Evaluating the Impact of Customizations with the Customization Comparison Utility

To evaluate the impact of customizations, it is helpful to compare customization files between the source and the target systems before you import customizations. The Customization Comparison Utility helps you accomplish this task.

Analyzing Customizations

Often you have to export custom components from one Microsoft Dynamics CRM environment and import them into another, for example, from development into test or production. However, before you import customizations, it is very helpful to assess the impact of customizations on the target system. The system where you import customizations may have been changed since the last installation. You have to consider the extent of the changes and how they may affect the new installation. While some of the changes, such as renaming of the attributes or adding new attributes, are minor, other modifications, such as deletion of entities or changes in the forms may have a significant effect on the system.

Analyzing and understanding the system customizations may result in more successful deployment of a new version of the application. This analysis minimizes the risk of overwriting important customization data in the target system. For example, if only several attribute names have changed, you may be able to do a plain import using the import/export functionality built into Microsoft Dynamics CRM. However, if some key components were deleted, such as entity forms, you may have to merge the customizations with the changes in the target system. Comparing customization files between the two systems helps you determine which approach will result in more successful deployment. This is also very useful when you are diagnosing the problems between two systems. By comparing the customization files, you can often identify possible causes of the existing problems.

Using the Customization Comparison Utility

The Customization Comparison utility lets you easily compare two Microsoft Dynamics CRM customization.xml files. Unlike other XML comparison tools, this utility can read and understand Microsoft Dynamics CRM schema. The results of comparison show the differences in entities, attributes, forms, views, workflows, security roles, entity maps, and relationships. You can use this tool before you import customizations into a system to evaluate the effect they will have on the system.

Use the tool to compare XML customizations files between the source and the target systems. If you use a zipped customization file, make sure that it contains only one customization XML file. The following illustration shows the results of comparison between two customization files. The compared items include entities, roles, workflows, entity maps, and relationships. You can drill down into each item to see more details. From the entities, you can view the changes in attributes, forms, and system views. You can easily see the changes in source and target. It shows the items that are present in the source file and not present in the target file and the items that are present in the target file, but not in the source file.

Dd442453.a7338331-120b-4f29-ab17-1c94b85e014b(en-us,MSDN.10).gif

In addition to reviewing the results of the comparison in the grid, the tool includes a report that you can easily export to Microsoft Office Excel for additional analysis.

The tool offers a command line version that you can run from a command prompt.

For more information about how to use the tool, see the Customization Comparison user's guide included in the download package for this utility.

Transferring Configuration Data with the Configuration Data Utility

When you work with multiple environments, such as development, test, and production, or multiple Microsoft Dynamics CRM organizations, keeping consistent configuration data across all systems can be very important. The Configuration Data Utility helps you achieve this. It lets you export custom configuration data from a source Microsoft Dynamics CRM system and import it to a target Microsoft Dynamics CRM system.

Storing Configuration Data in Custom Entities

In Microsoft Dynamics CRM you often use custom entities to store business information. However, you could also use custom entities to store system configuration data. For example, if an application integrates Microsoft Dynamics CRM with a third-party system, you could create a configuration entity with attributes such as pollingtime, url, and retries to store the configuration data needed for the integration. This is very convenient because the data stored in the configuration entity can be used by the system administrators to configure a new application or update an existing application. To keep the configuration data up to date, you may have to frequently upload the new data, or have an automated task to do it.

Using the Configuration Data Utility gives you a simple and efficient way to transfer custom configuration data from one system to another. One of the main benefits of this utility is that you can import configuration data from multiple custom entities at the same time. While it only imports and exports data for custom entities, the tool can handle useful scenarios, such as importing records that reference other records that are also being imported.

Dd442453.Important(en-us,MSDN.10).gifImportant

For the tool to work correctly, the schema for the source entities and the target entities must be identical.

Dd442453.note(en-us,MSDN.10).gifNote

In more complex cases, use the Microsoft Dynamics CRM data export and import tools or Data Migration Manager to transfer data for custom and system entities.
For more information about these tools, see Microsoft Dynamics CRM online Help.

Using the Configuration Data Utility

Use the Configuration Data Utility to export the source system configuration data and import it into a target system. The tool provides a convenient interface that lets you select the custom entities that contain the configuration data in the source system, save the data into a data file, and then import the records from the data file into a target system.

To run the tool, you must be a system administrator with appropriate privileges to create, read, and update entity instances.

The following illustration shows the entities in the source system that are selected for export.

Dd442453.0b8f0a81-1a17-4d77-9419-1cdc12427223(en-us,MSDN.10).gif

For import, specify the target server where you import the configuration data and the data file that you created during export, as shown in following illustrations.

Dd442453.9436a94c-f84f-4151-8d85-edc09ecaa422(en-us,MSDN.10).gif

Dd442453.5841695f-63ff-4ebb-a3b4-143657a9f759(en-us,MSDN.10).gif

For more information about how to use the tool, see the Configuration Data Utility user's guide included in the download package for this utility.

Update Rollup 2 for Microsoft Dynamics CRM 4.0 - More Info

Matt Brown wrote this


On 2/8/2008, the CRM Sustained Engineering team released a new version of the Update Rollup 2 packages. The new version of Update Rollup 2 addresses some of the issues that have been noted in the comments for this blog entry.

Including:

  • Strings in the localized product showing up as garbage or in English.

  • Customized web.config causing issues after Update Rollup 2 is installed.

Customers do not need to uninstall the original Update Rollup 2 packages. The new packages will install over the top. If a customer has not been affected by the issues in the original Update Rollup 2 package they do not need to update to the new version. Customers can install Client, Server, Router Update Rollup 2 in any order.

The steps for the AutoUpdate have caused some confusion. There is a different PatchId and LinkId for every language of the product. You will find a table at the bottom of this post that has the PatchId and LinkId for each Language. Note: The new packages changed the PatchId so it will need to be updated, as the previous PatchId is no longer valid.

***

The Microsoft Dynamics CRM Sustained Engineering team released Microsoft Dynamics CRM 4.0 Update Rollup 2 on Thursday, January 15, 2009.

Below is the link to the release and related information about the Rollup. Please see the Knowledge Base (KB) article for more details about the Update Rollup 2 content and instructions..

Install Details about Update Rollup 2

  • Update Rollup 1 is not a prerequisite for installing Update Rollup 2
  • The Update Rollup 2 client can be deployed before the server is upgraded to Update Rollup 2
  • Update Rollup 2 can be uninstalled
  • Unlike Update Rollup 1, Update Rollup 2 is packaged so that each language is packaged individually. As a result, the download size of the packages for Update Rollup 2 is significantly smaller. For example, the CRM Server package size is reduced from about 171 MB in Update Rollup 1 to about 9 MB in Update Rollup 2. The Outlook Client package size is reduced from about 78 MB in Update Rollup 1 to about 4 MB in Update Rollup 2

How to avoid a required reboot when installing a patch for the CRM Outlook Client

  • Before starting the update process, go to Options from the CRM menu. On the “General” tab, uncheck the bottom checkbox that says “Always run the…Host process” and then click “Ok” button.
  • When manually checking for updates, go ahead and close Outlook by choosing Exit from Outlook’s File menu. This will close Outlook along with the CRM add-in and the Hoster process.
  • Now check for updates by selecting All Programs from the Start menu. Then select Microsoft Dynamics CRM 4.0 and choose Update.
  • Restart Outlook after the patch is installed.

Note: If the user doesn’t want to make the permanent change of always having the Hoster process exit when Outlook exits, they can close the Hoster process manually after Outlook has been closed by right clicking on the Dynamics icon in the Notification Area of the Task Bar.

Making Update Rollup 2 available to your clients via AutoUpdate:

You can find more information about AutoUpdate in Eric Newell’s blog entry at http://blogs.msdn.com/crm/archive/2008/05/08/crm-client-autoupdate.aspx and the Microsoft Dynamics CRM 4.0 Operating and Maintaining Guide, part of the Microsoft Dynamics CRM 4.0 Implementation Guide.

If you have a direct internet connection from your client machines, you can avoid some of the configuration steps and use the LinkId directly. Below are the necessary steps to configure the AutoUpdate for Update Rollup 2.

Note: These are steps 5, 6 and 7 of Eric’s blog.

*** 2/9/2008 Update ***

The steps below are for the English version of the product. The PatchId and LinkId values will be different for every localized version of CRM 4.0. There is a table at the bottom of this post that lists the correct PatchId and LinkId for each language.

***

1. Create the configuration XML file and save it.

<ClientPatches>

   <Create>

      <!--- *** UR2 PATCH -->

        <ClientPatchInfo>

<!--- *** The PatchId is different for every Language. Please see the table at the end for correct Link ID to use -->

          <PatchId>{321EFF1F-4402-4554-B037-B1492FFA67E9}</PatchId>

          <Title>Update Rollup 2 for Microsoft Dynamics CRM 4.0 (KB 959419)</Title>

          <Description>Update Rollup 2 for Microsoft Dynamics CRM 4.0 (KB 959419)</Description>

          <!--- *** This will make it Mandatory -->

          <IsMandatory>true</IsMandatory>

          <IsEnabled>true</IsEnabled>

          <ClientType>OutlookLaptop, OutlookDesktop</ClientType>

<!--- *** The LinkId is different for every Language. Please see the table at the end for correct Link ID to use -->

          <LinkId>140023</LinkId>

      </ClientPatchInfo>

   </Create>

</ClientPatches>

2. From the command prompt, go to the directory where the ClientPatchConfigurator.exe is located ([ServerInstallDir]\Tools and type microsoft.crm.tools.clientpatchconfigurator.exe [configfile].xml

3. Once the patch has been uploaded, launch the Outlook client

The dialog should now appear saying that “Update Rollup 2 for Microsoft Dynamics CRM 4.0 (KB 959419)” is available. If the <IsMandatory> is set to false, the client will only see the update if the user selects “Check for Updates” via the CRM Menu in the Outlook client.

*** 2/9/2008 Update ***

Arabic

LinkID: 140023&clcid=0x401

PatchID: {5976FEF7-2939-4597-B849-378B5010E7EA}

Chinese (Simplified)

LinkID: 140023&clcid=0x804

PatchID: {1F9AD22B-7E77-4704-94F2-ED4C9A9204FE}

Chinese (Hong Kong)

LinkID: 140023&clcid=0xc04

PatchID: {8E4BD4EB-6024-4F50-9F8B-ECB2D2962268}

Chinese (Traditional)

LinkID: 140023&clcid=0x404

PatchID: {544B5D8F-1561-4079-9D1B-871958FD5784}

Czech

LinkID: 140023&clcid=0x405

PatchID: {7703B3AB-5040-43A0-9E51-C679C1D901DB}

Danish

LinkID: 140023&clcid=0x406

PatchID: {9CE94585-65D2-4032-8E9C-2BEC113DBBC5}

Dutch

LinkID: 140023&clcid=0x413

PatchID: {B0DABBC4-7E03-4BF4-85CB-7F6556D7A57D}

English

LinkID: 140023&clcid=0x409 (or just 140023)

PatchID: {321EFF1F-4402-4554-B037-B1492FFA67E9}

Finish

LinkID: 140023&clcid=0x40b

PatchID: {318C90C1-FE54-4383-BF1F-B9C20BBD2E58}

French

LinkID: 140023&clcid=0x40c

PatchID: {AA73B91A-CDAD-43CB-AD46-725AC839DAA4}

German

LinkID: 140023&clcid=0x407

PatchID: {C9344B1E-E32A-4C78-ADAB-332C3F934A95}

Greek

LinkID: 140023&clcid=0x408

PatchID: {460B3EBE-525F-44C2-8F59-D71DAA1E0136}

Hebrew

LinkID: 140023&clcid=0x40d

PatchID: {9C5A6F83-2C6E-4B32-91D8-6ADB7E279184}

Hungarian

LinkID: 140023&clcid=0x40e

PatchID: {CB0F2A7F-11F1-4AEE-AF5F-78A485DEB43A}

Italian

LinkID: 140023&clcid=0x410

PatchID: {1BF9AC1B-C4B8-4555-AABE-595C653C1A0D}

Japanese

LinkID: 140023&clcid=0x411

PatchID: {FF755164-2686-4B81-860A-13B66A62A10A}

Korean

LinkID: 140023&clcid=0x412

PatchID: {6FD317AE-D2E1-4307-9E4F-F324B6615632}

Norwegian

LinkID: 140023&clcid=0x414

PatchID: {821536C9-5E42-4B95-879B-DEAD921C8510}

Polish

LinkID: 140023&clcid=0x415

PatchID: {D5D73DEA-FBC7-4B73-BDAF-3C54CD735DB0}

Portuguese (Brazil)

LinkID: 140023&clcid=0x416

PatchID: {98557D6F-49E8-4280-9435-9FE0CD6979F5}

Portuguese (Portugal)

LinkID: 140023&clcid=0x816

PatchID: {63F4323D-5341-4EC2-A7E6-6EB6A12E5EC5}

Russian

LinkID: 140023&clcid=0x419

PatchID: {D6A8BD6F-E3AF-42DB-95C1-4538520C227D}

Spanish

LinkID: 140023&clcid=0xc0a

PatchID: {52B9A75C-22E0-4556-B978-9CF5CAB5353F}

Swedish

LinkID: 140023&clcid=0x41d

PatchID: {75EF6272-B9A7-4C78-87B4-1730B019C431}

Turkish

LinkID: 140023&clcid=0x41f

PatchID: {6F3E936F-F745-44CE-8412-EA5CDE05748D}

Keep your comments, experiences, and observations coming. We're listening.

Matt Brown

Accelerators and Microsoft Dynamics CRM Online

Laura Robinson wrote this


The Microsoft Dynamics CRM 4.0 Accelerators have been rolling out over the last couple of months and one of the questions we’ve been working on in the CRM Online TS team is, how can we make these accelerators work for Microsoft Dynamics CRM Online?  CRM Online, at the moment, operates under three distinct constraints as compared to the On-Premise or Partner Hosted versions:

  1. Because Microsoft hosts the servers there is no custom code on the server
  2. WLID Authentication
  3. No custom reports uploaded to the server

More information about the differences between Online and On-Premise can be found on MSDN.

In light of these constraints, some of the 4.0 Accelerators will not work with Online at all, some will work partially if you import just the customizations but with minimal value (e.g. eService Accelerator), and others will work partially with minimal effort and still provide value to customers.  Two of the accelerators that provide value to an Online org are: Extended Sales Forecasting and Event Management. 

These accelerators contain custom entities, security roles, and workflows that can be imported to CRM Online and provide some value to an Online organization that is looking for a forecasting or event management template or solution.  Please note that there are some components with these accelerators that will not work in Online; in particular the Extended Sales Forecasting accelerator contains custom .rdl files to upload which are not possible in Online. 

Event Management provides web portal customizations to allow for extranet event management registration, which is not possible to incorporate into Online.  In the following blogs, I discuss how these accelerators can be used in CRM Online as well as some workarounds for the components that cannot be incorporated:  Extended Sales Forecasting, Event Management.

Cheers,

Laura Robinson

Accelerators and Microsoft Dynamics CRM Online

Laura Robinson wrote this


The Microsoft Dynamics CRM 4.0 Accelerators have been rolling out over the last couple of months and one of the questions we’ve been working on in the CRM Online TS team is, how can we make these accelerators work for Microsoft Dynamics CRM Online?  CRM Online, at the moment, operates under three distinct constraints as compared to the On-Premise or Partner Hosted versions:

  1. Because Microsoft hosts the servers there is no custom code on the server
  2. WLID Authentication
  3. No custom reports uploaded to the server

More information about the differences between Online and On-Premise can be found on MSDN.

In light of these constraints, some of the 4.0 Accelerators will not work with Online at all, some will work partially if you import just the customizations but with minimal value (e.g. eService Accelerator), and others will work partially with minimal effort and still provide value to customers.  Two of the accelerators that provide value to an Online org are: Extended Sales Forecasting and Event Management. 

These accelerators contain custom entities, security roles, and workflows that can be imported to CRM Online and provide some value to an Online organization that is looking for a forecasting or event management template or solution.  Please note that there are some components with these accelerators that will not work in Online; in particular the Extended Sales Forecasting accelerator contains custom .rdl files to upload which are not possible in Online. 

Event Management provides web portal customizations to allow for extranet event management registration, which is not possible to incorporate into Online.  In the following blogs, I discuss how these accelerators can be used in CRM Online as well as some workarounds for the components that cannot be incorporated:  Extended Sales Forecasting, Event Management.

Cheers,

Laura Robinson