Dynamics CRM includes some data types not available for custom fields. Because these field types act slightly different from the standard ones, it's necessary to pay attention during development.
This post is focused on the following data types:
- Owner
- Customer
- Party List (ActivityParty)
Owner
Owner is a data type used for the built-in
OnwerId field. This field is present only when an entity has the Ownership set to
User or Team, it's not present if the entity's ownership is
Organization. It can hold one user or one team record.
Customer
Customer data type is used when a field can hold one account or one contact record. Contact and Lead entities use this data type (
ParentCustomerId and
CustomerId respectively).
Party List
Party List (also known as
Activity Party) is the most complex data type, it can hold more than one record at the same time and the possible entities are defined by the ParticipationTypeMask attribute.
For example the Email
To field can hold all these entities:
Client-side (JavaScript)
Handling these data types in JavaScript is quite easy, they look like and act as standard lookup fields, we need to only pay attention to the entity LogicalName (property
entityType) of the record(s).
Owner
// set the owner of the current record to a team
// note: this code works only when the form is on create method, to update the owner it's always necessary to use the AssignRequest message
var team = new Array();
team[0] = new Object();
team[0].id = "c9c77fd3-036a-47e0-857d-a4d56f21d8ee";
team[0].name = "Sales Team";
team[0].entityType = "team";
Xrm.Page.getAttribute("ownerid").setValue(team);
// check if the owner is a team or a user
var owner = Xrm.Page.getAttribute("ownerid").getValue();
if (owner != null) {
alert("The owner type of this record is " + owner[0].entityType);
}
Customer
// set the parent customer of a contact
var parent = new Array();
parent[0] = new Object();
parent[0].id = "cd7f603d-e199-4b66-9ca7-3386093e9a50";
parent[0].name = "Test Account";
parent[0].entityType = "account";
Xrm.Page.getAttribute("parentcustomerid").setValue(parent);
// check if the customer of a lead is an account or a contact
var customer = Xrm.Page.getAttribute("customerid").getValue();
if (customer != null) {
alert("The customer type of this lead is " + customer[0].entityType);
}
Party List
// set the to field of an email to a contact and a user
var recipients = new Array();
recipients[0] = new Object();
recipients[0].id = "72bf360d-3dd8-4538-a5ce-91a4be6af517";
recipients[0].name = "John Smith";
recipients[0].entityType = "contact";
recipients[1] = new Object();
recipients[1].id = "d4e1f6f5-1a2d-4571-bec7-9bd1ea1696d0";
recipients[1].name = "Tom Green";
recipients[1].entityType = "user";
Xrm.Page.getAttribute("to").setValue(recipients);
// get the total count of records inside the To field
var to = Xrm.Page.getAttribute("to").getValue();
if (to != null) {
alert("The total count of records inside To field is " + to.length);
alert("The last record type is " + to[to.length-1].entityType);
}
Server-side (C#)
Server-side we have some differences, although
Owner and
Customer data types are EntityReference,
Party List type is an ActivityParty.
Owner
// set the owner of the current record to a team
// note: this code works only when the form is on create method, to update the owner it's always necessary to use the AssignRequest message
// late bound
EntityReference team = new EntityReference("team", new Guid("c9c77fd3-036a-47e0-857d-a4d56f21d8ee"));
entity["ownerid"] = team;
// early bound
EntityReference team = new EntityReference(Team.EntityLogicalName, new Guid("c9c77fd3-036a-47e0-857d-a4d56f21d8ee"));
MyEntity.OwnerId = team;
// check if the owner is a team or a user
// late bound
if (entity.Contains("ownerid") && entity["ownerid"] != null) {
EntityReference owner = (EntityReference)entity["owner"];
Console.WriteLine("The owner type of this record is " + owner.LogicalName);
}
// early bound
if (MyEntity.OwnerId != null) {
Console.WriteLine("The owner type of this record is " + MyEntity.OwnerId.LogicalName);
}
Customer
// set the parent customer of a contact
// late bound
EntityReference parent = new EntityReference("account", new Guid("cd7f603d-e199-4b66-9ca7-3386093e9a50"));
entity["parentcustomerid"] = parent;
// early bound
EntityReference parent = new EntityReference(Account.EntityLogicalName, new Guid("cd7f603d-e199-4b66-9ca7-3386093e9a50"));
MyEntity.ParentCustomerId = parent;
// check if the customer of a lead is an account or a contact
// late bound
if (entity.Contains("customerid") && entity["customerid"] != null) {
EntityReference customer = (EntityReference)entity["customerid"];
Console.WriteLine("The customer type of this lead is " + customer.LogicalName);
}
// early bound
if (MyEntity.ParentCustomerId != null) {
Console.WriteLine("The customer type of this lead is " + MyEntity.ParentCustomerId.LogicalName);
}
Party List
// set the to field of an email to a contact and a user
// late bound
Entity to1 = new Entity("activityparty");
to1["partyid"] = new EntityReference("contact", new Guid("72bf360d-3dd8-4538-a5ce-91a4be6af517"));
Entity to2 = new Entity("activityparty");
to2["partyid"] = new EntityReference("user", new Guid("d4e1f6f5-1a2d-4571-bec7-9bd1ea1696d0"));
entity["to"] = new Entity[] { to1, to2 };
// early bound
ActivityParty To1 = new ActivityParty();
To1.PartyId = new EntityReference(Contact.EntityLogicalName, new Guid("72bf360d-3dd8-4538-a5ce-91a4be6af517"));
ActivityParty To2 = new ActivityParty();
To2.PartyId = new EntityReference(SystemUser.EntityLogicalName, new Guid("72bf360d-3dd8-4538-a5ce-91a4be6af517"));
MyEntity.To = new ActivityParty[] { To1 , To2 }
// get the total count of records inside the To field
// late bound
if (entity.Contains("to") && entity["to"] != null) {
EntityCollection to = (EntityCollection)entity["to"];
Console.WriteLine("The total count of records inside To field is " + to.Entities.Count.ToString());
if (to.Entities.Count > 0) {
EntityReference lastparty = (EntityReference)to.Entities.Last()["partyid"];
Console.WriteLine("The last record type is " + lastparty.LogicalName);
}
}
//early bound
if (MyEntity.To != null) {
Console.WriteLine("The total count of records inside To field is " + MyEntity.To.Count().ToString());
if (MyEntity.To.Count() > 0) {
Console.WriteLine("The last record type is " + MyEntity.To.Last().PartyId.LogicalName);
}
}