Schlagwort-Archive: Dynamics CRM

0x80044195 The specified language code is not valid for this organization

Recently I had a problem with a dev system at a customer site. The system was redeployed from the production site without any problems. Everything worked well, until I tried to customize the system. As soon as I tried to create new attributes or new relationships, the system produced an error

The language code 1033 is not a valid language for this organization

I searched the net, but the only things I found was that this error is listed as an error code of Dynamics CRM (see http://msdn.microsoft.com/en-us/library/bb930493(loband).aspx) and a thread in the Dynamics Forums (http://social.microsoft.com/Forums/en/crm/thread/70bbbf36-1ecb-443e-852a-bebaa70c7206), but sadly without a solution.

After contacting the Dynamics CRM support team, the cause of this error was found in a matter of minutes. The system was redeployed from an installation with German base language to a system with English base language. This is an unsupported scenario.

Neither there was a warning at the redeployment wizard, nor is this mentioned in the Implementation Guide (at least, I haven’t found it there). The support engineer provided me following excerpt there this scenario is described as unsupported

The original deployment and the new deployment of Microsoft Dynamics CRM must be the same base language.

NOTE: Redeployment between different base languages, for example from English to French, is not supported.

To bad that this snippet is only included in the course material for the Installation and Deployment exam and not in the Implementation Guide. The only solution was to do a full reinstall of Dynamics CRM with the same base language as the originating system and to do the reployment again.

Update
In the meantime I got new feedback from the support engineer (thank you José) who is responsible for my case. Microsoft will document this scenario either with a knowledgebase article or by adding the quoted note to the Implementation Guide.

CRM log file locations

Every part of a Microsoft Dynamics CRM implementation produces some log output. In addition to the standard logging, you could enable tracing for nearly every CRM component for debugging purposes.

This post shows where you can find these log and trace files. For enabling the generation of trace files see http://support.microsoft.com/kb/907490. Please keep in mind that although the article says that you can configure the folder in which the trace files are generated via TraceDirectory, the location is hard coded in the applications. You can set a value, but it will be ignored.

Outlook Client

  • Standard log files %APPDATA%\Microsoft\MSCRM\Logs
  • Autoupdate log files %APPDATA%\Microsoft\MSCRM\AutoUpdate
  • Trace files %APPDATA%\Microsoft\MSCRM\Traces

Note: Since Update Rollup 7, these paths are switched to the %LOCALAPPDATA% folder in order to have a smaller roaming profile.

E-Mail Router

Data Migration Manager

  • Trace files %APPDATA%\Microsoft\MSCRM\Traces

CRM Server

  • Trace files {Install dir of application}\Trace
  • Setup log files, Deployment Manager, … %APPDATA%\Microsoft\MSCRM\Logs

Event log
In addition to the log files, there is also useful information in the application event log. With the installation of CRM you get following new event sources

  • MSCRMCallout
  • MSCRMDeletionService
  • MSCRMDeployment
  • MSCRMEmail
  • MSCRMKeyArchiveManager
  • MSCRMKeyGenerator
  • MSCRMKeyService
  • MSCRMLocatorService
  • MSCRMPerfCounters
  • MSCRMPlatform
  • MSCRMReporting
  • MSCRMTracing
  • MSCRMWebService

Update
Added note for Outlook Client log paths for version Rollup 7 or higher

Howto: Debugging CRM errors

Today I had a service call with a customer who got an error on creating appointments. The error message was General Failure in Scheduling Engine

A quick search in the internet revealed that this error message is not an unknown one (at least for Dynamics CRM 3)

Because the description of the articles were not suitable for the customers environment and the CRM system is a newer one ( Dynamics CRM 4), we had to dig further.

We enabled the tracing on the crm application server and set the TraceCategories to *:Error which writes only the message with TraceLevel Error to the trace file.

The generated trace file contained following error
...
Crm Exception: Message: SecLib::CrmCheckPrivilege failed. Returned hr = -2147220960 on UserId: bcf9bb2e-6070-de11-a4a6-000c29abeb6c and PrivilegeId: b5f2ee06-d359-4495-bbda-312aae1c6b1e, ErrorCode: -2147220960
...
MessageProcessor fail to process message 'Book' for 'appointment'.
...

A quick search for the name of the denied privilege showed that the security role of the user doesn’t give him the right to share appointments. Apparently, this right is needed for creating an appointment. After adjusting the security role the error was gone and the customer was happy.

RetrieveMultiple Gotchas

This article is only relevant if you use the assemblies which are provided in the crm sdk

The crm webservice provides multiple ways for querying data. One of them uses the QueryExpression for selecting the data.

A QueryExpression can be used for retrieving data of any crm entity. However, if you use it to query the entities activitypointer or queueitem your crm webservice proxy will throw an InvalidOperationException with the message There is an error in XML document

So what are you doing wrong? Nothing.

This problem is (poorly) described in the sdkreadme.htm in the crm sdk.

Possible failure using the CrmService.RetrieveMultiple method found in SdkTypeProxy.dll (32227)

Calling this method may result in an InvalidOperationException.

Workaround: Use the CrmService.Execute method with the RetrieveMultiple message instead.

The described workaround leads to the same error. The only way to request data from these entities is to use DynamicEntities.
This requires a small change at your existing query: you only have to tell the CRM to return the results as DynamicEntities

RetrieveMultipleRequest request = new RetrieveMultipleRequest 
{ 
  Query = query, 
  ReturnDynamicEntities = true 
};