March 23, 2016
Error when opening an inactive entity
March 5, 2016
Do not name the action parameter "Error"
The following errors were encountered while processing the workflow tree:
'DynamicActivity': The private implementation of activity '1: DynamicActivity' has the following validation error: Compiler error(s) encountered processing expression
Just rename the parameter and the error will be gone.
March 3, 2016
CRM 2016 Update lookup field bug
February 15, 2010
Sitemap error because of missing LCID
I accidentally discovered the following “feature”: All LCID Titles in SubArea must have matching LCID in Group Titles.
Add a group in sitemap, like this:
<Group Id="Demo">
<Titles>
<Title LCID="1033" Title="Demo"/>
</Titles>
<SubArea Id="DemoPage" Icon="iconUrl" Url="someUrl">
<Titles>
<Title LCID="1033" Title="Demo Page"/>
<Title LCID="1060" Title="Demo Stran"/>
</Titles>
</SubArea>
</Group>
The sitemap will upload normally and pass all validation, but after switching to language 1060, the error will be shown. The cause is missing LCID 1060 in Group Titles.
The correct XML for this example is:
<Group Id="Demo">
<Titles>
<Title LCID="1033" Title="Demo"/>
<Title LCID="1060" Title="Demo"/>
</Titles>
<SubArea Id="DemoPage" Icon="iconUrl" Url="someUrl">
<Titles>
<Title LCID="1033" Title="Demo Page"/>
<Title LCID="1060" Title="Demo Stran"/>
</Titles>
</SubArea>
</Group>
February 5, 2010
Problem fixed: Installing Rollup 8 for Data Migration Manager
I installed a fresh instance of Microsoft Dynamics CRM Data Migration Manager. Then I wanted to apply Rollup 8 to it.
Error: DMClient KB971782 is not found
Resolution: First install Rollup 7 update for DM Client (http://www.microsoft.com/downloads/details.aspx?FamilyID=A4893988-7804-4E23-AB58-740441CC696E&displaylang=en) and then you are able to install Rollup 8.
October 23, 2009
Error: The specified type was not recognized: name='usersettings'
Simple task: Try to retrieve user settings of a CRM user.
Simple solution:
RetrieveUserSettingsSystemUserRequest request = new RetrieveUserSettingsSystemUserRequest();
request.EntityId = systemUserId;
request.ColumnSet = new AllColumns();
RetrieveUserSettingsSystemUserResponse response= (RetrieveUserSettingsSystemUserResponse)crmService.Execute(request);
NOT!
The specified type was not recognized: name='usersettings', namespace='http://schemas.microsoft.com/crm/2007/WebServices', at <BusinessEntity xmlns='http://schemas.microsoft.com/crm/2006/WebServices'>.
Real solution:
Add the following line: request.ReturnDynamicEntities = true;
September 9, 2009
Microsoft CRM 4.0 – Applications certification and SQL 2008
On Microsoft learning page (http://www.microsoft.com/learning/en/us/certification/dynamics-crm-professional.aspx#tab2) it is said that exam 70-431 - Microsoft SQL Server 2005 – Implementation and Maintenance is elective for Microsoft Certified Business Management Solutions Professional – Applications for Microsoft Dynamics CRM 4.0 certification.
There is nothing said about SQL 2008 exams on this page.
So I sent an email to Microsoft and here is their response:
Dear Dejan,
Thank you for your email.
We are glad to inform you that the Exam 70-432: TS: Microsoft SQL Server 2008, Implementation and Maintenance can be counted as an elective for Microsoft Certified Business Management Solutions Professional – Applications for Microsoft Dynamics CRM 4.0 certification.
As that new exam has been released recently, it has not been added to the certification path yet.
Please note that the update of the Certification Tree has been planned for the end of September 2009.
Then, the exam 70-431 will be visible in the certification path for
Applications for Microsoft Dynamics CRM4.0 certification on the
Microsoft Learning website, as that certification will be uploaded to the Transcripts of all customers who have completed the certification requirements by passing exam 70-432.
We hope that provided information is of assistance.
If you have any further questions please get in touch with us and we will be happy to assist you in any way we can.
September 7, 2009
Link to custom entity – use of etn instead of etc argument
If you want to create a direct link to an out-of-a-box entity it is a very simple task: Right-click on one instance (let’s say account) and select “Copy Shortcut”.
Then just just change the GUID in the URL to open desired account. For the Account this URL looks like this: http://SERVER:PORT/OrganizationName/sfa/accts/edit.aspx?id={GUID}
Custom entities
All custom entities have the same URL structure: http://SERVER:PORT/OrganizationName/userdefined/edit.aspx?id={GUID}&etc=EntityTypeCode
Notice the entity type code? This code is created when creating the entity. But for some reason Entity Type Code can be (in most cases) different on every CRM instance. This means that if you are creating a plugin that needs to create a link to the entity, you will have to query metadata to get the code or enter that code in configuration part.
But there is a better way:
Instead of “etc” argument you can use “etn” (Entity Name) in the query string. Then use the logical name of the entity. Logical name is the same on all instances.
http://SERVER:PORT/OrganizationName/userdefined/edit.aspx?id={GUID}&etn=EntityName
http://testsrv:5555/Contoso/userdefined/edit.aspx?id={08B91EBF-525A-DE11-94A6-002354F5ABA2}&etn=new_testentity
August 28, 2009
Get a list of searchable attributes from database
(The final solution is at the bottom)
Today my colleague wanted to check which attributes were marked as searchable in a specific entity.
One way to do this is to open each attribute in MSCRM and check if it is marked as searchable. A long way if you have an entity with 220 attributes.
So I went to the database and checked the MetadataSchema.Attribute table. There is a column named DisplayMask. SDK says that display masks are following (ValidForAdvancedFind = Searchable):
Name | Value | Description |
None | 1 | Specifies no restrictions. |
ObjectTypeCode | 4 | Specifies that the attribute is an entity type code. The name of the entity is displayed. |
PrimaryName | 2 | Specifies to display the attribute as the primary name. |
RequiredForForm | 0x40 | Specifies that the attribute must be shown on a form. |
RequiredForGrid | 0x80 | Specifies that the attribute can be shown in a grid view. |
ValidForAdvancedFind | 8 | Specifies that the attribute can be shown on the Advanced Find form. This attribute is shown as Searchable in the UI. |
ValidForForm | 0x10 | Specifies that the attribute can be shown on a form. |
ValidForGrid | 0x20 | Specifies that the attribute can be shown in a grid view. |
But the value in the database is 469762048 (this attribute is searchable)! Bitwise comparison fails: 469762048 & 8 = 0 WTF!!!
After some googling and 30 minutes of using reflector if found that the former values are meant to be used only when working with metadata web service, like in this example: http://msdn.microsoft.com/en-us/library/cc151072.aspx
Thank you Reflector!
Microsoft.Crm.Platform.Sdk.dll (found it in GAC) contains DisplayMasks enumeration in Microsoft.Crm.Metadata namespace.
This is what the reflector says:
public enum DisplayMasks
{
ActivityPointerRegardingName = 0x80,
ActivityRegardingName = 1,
BitMask = 0x1000,
DynamicFormatCode = 0x4000,
None = 0,
ObjectTypeCode = 0x400,
PrimaryName = 0x100,
QueueItemPriority = 0x10,
QueueItemSender = 0x20,
QueueItemState = 4,
QueueItemStatus = 8,
QueueItemTitle = 2,
QueueItemToRecipients = 0x40,
RequiredForForm = 0x20000000,
RequiredForGrid = 0x40000000,
ResourcePointerName = 0x200,
ReturnedTypeCode = 0x800,
StateCode = 0x2000,
ValidForAdvancedFind = 0x4000000,
ValidForForm = 0x8000000,
ValidForGrid = 0x10000000
}
This means that the ValidForAdvancedFind has value of 0x4000000! I tested it with the previous example and it works! Hooray!
Solution
So the final answer to the problem of this post is:
select * from MetadataSchema.Attribute
where DisplayMask & 0x4000000 > 0 and EntityId = @entityId
Of course you can use all other values as well.
What I haven’t tested yet is whether you can change this mask value directly in the database - definitely not supported by Microsoft :)
July 16, 2009
Show custom notifications on Microsoft Dynamics CRM - upgrade
Marco Amoedo created cool javascript function that displays custom warning messages in Microsoft Dynamics CRM 4.0. http://marcoamoedo.com/blog/show-custom-warning-messages-on-microsoft-dynamics-crm/
I liked the idea so much, that I took the script and upgraded pimped it.
What it does?
The function simply adds a notification on top of the form, like in the picture below.
You can add multiple notifications with different icons.
Update or delete previously added notifications or add new ones. This image shows (after Name onChange event) changed error text, updated third notification to info style and a new warning. Compare it with previous picture.
How to use it?
Step 1: Insert this code into form OnLoad event.
/*============== addNotification function =============
Adds a message on the top of the entity form using
the same visual style as Microsoft CRM.
If function is called more than once,
the messages are added at the bottom of the list
If the message with same ID already exists,
then the message is updated and not added to a list.
It also supports deleting of previously added notifications.
Put this function in the OnLoad event,
so you can use it in all form and field events.
Parameters:
message - message to be shown to the user
messageType - Type of the message: 1 - critical, 2 - info, 3 - warning
notificationId - ID of the notification (needed for updating purposes)
Created by:
Marco Amoedo (http://marcoamoedo.com) - the idea and initial function
Dejan Dular (http://a-crm.blogspot.com) - upgraded functionality (different icons, updating and deleting notifications)
=======================================================*/
addNotification = function(message, messageType, notificationId)
{
var notificationsArea = document.getElementById('Notifications');
if (notificationsArea == null)
{
//Don't display message when deleting a notification.
if (messageType != 4)
{
//Sorry. Notifications are not possible on this form.
//Display a message box instead of notification.
alert(message);
}
return;
}
var notificationDIV = document.getElementById('NotificationDiv_' + notificationId);
//Delete the notification
if (messageType == 4)
{
if (notificationDIV != null)
{
//Remove the notification
notificationsArea.removeChild(notificationDIV);
}
return;
}
//Get the notification image. The default is info image.
var notificationImage;
switch (messageType)
{
case 1:
notificationImage = '/_imgs/error/notif_icn_crit16.png';
break;
case 2:
notificationImage = '/_imgs/error/notif_icn_info16.png';
break;
case 3:
notificationImage = '/_imgs/error/notif_icn_warn16.png';
break;
default:
notificationImage = '/_imgs/error/notif_icn_info16.png';
}
//Create notification
var notificationTable = '<TABLE cellSpacing="0" cellPadding="0"><TBODY><TR><TD vAlign="top"><IMG class="ms-crm-Lookup-Item" alt="" src="' + notificationImage + '" /></TD><TD><SPAN>' + message +'</SPAN></TD></TR></TBODY></TABLE>';
//Check if the notification with same ID already exists
if (notificationDIV == null)
{
//Create a new notification
var notificationHTML = '<DIV class="Notification" ID="NotificationDiv_' + notificationId + '">' + notificationTable + '</DIV>';
notificationsArea.innerHTML += notificationHTML;
notificationsArea.style.display = 'block';
}
else
{
//Update the notification.
notificationDIV.innerHTML = notificationTable;
}
}
/*============= END addNotification function ===========*/
Step 2: Run the following function when there is a need for a notification.
addNotification(string message, int messageType, string notificationId)
Parameters:
- message – Notification message displayed
- messageType – Type of the notification (the icon) (1 – critical, 2 – info, 3 – warning, 4 – delete the notification)
- notificationId – Any string that identifies specific notification. If a function is called later with existing notificationId, the notification will be updated. Otherwise a new notification is added at the bottom of the list. If you want to delete a specific notification, just set messageType = 4 and use correct notificationId.
Thanks again to Marco Amoedo.
Originally published by Dejan Dular