Using the CRM 2011 REST Services and Deep Insert to Create Activities

One of the nice features of CRM 2011 is the REST based OrganizationData service. Lately, I have found myself using the REST service more often as it provides a simpler and cleaner method of accessing data from client side JScript. The REST service also provides the ability to do deep inserts of entity and related records. This capability can be leveraged to provide an elegant solution to creating activity records using client side JScript.

In my particular use case, I needed to create a new email activity from the currently logged in user with the regarding record set to a new custom entity record. It would have been possible to issue a couple of calls to the REST service that created the regarding record and then the email, but it is just as easy to create the email and related records in one call avoiding the need to clean up any records should one of the calls fail.

The first thing that needs to be done is to create the activity party record for the from field on the email. The activity party is a separate entity that stores all of the parties related to an activity, i.e. sender, recipient, etc. The activity party data needs to be specified as an array of activity party entities. The following snippet creates an activity party record for the from field on the email.

 1: // Create the activity party records
 2: var emailPartyEntities [{
 3:     PartyId: { LogicalName: "systemuser", Id: Xrm.Page.context.getUserId() },
 4:     ParticipationTypeMask: { Value: 1 }
 5: }];

As I mentioned earlier, I also needed to create a custom entity record that will be set as the regarding on the created email. In my case, this custom entity is used to track an email thread. Since this is a N:1 relationship for the email entity, the record created does not need to be stored in an array and is merely an object with properties specifying the fields of my custom entity.

 1: // Build the activity thread entity
 2: var activityThreadEntity = {
 3:     cei_Department: { Value: 29669000 },
 4:     cei_Subject: "Activity Thread for Account",
 5: };

Finally, I need to build the email entity that will be passed to the REST service during the create request. In order for the deep insert to work, the activity party array and the activity thread object created earlier will need to be set to properties on the created object that specify the relationships to the related entities as shown below.

 1: // Build the email record
 2: var emailEntity = {
 3:     Subject: "Test Email",
 4:     cei_activitythread_Emails: activityThreadEntity,
 5:     email_activity_parties: emailPartyEntities,
 6: };

In the previous snippet, notice that the activityThreadEntity object and the emailPartyEntities array are set to their corresponding relationships, i.e. cei_activitythread_Emails is the name of the N:1 relationship for my custom entity to the regarding field on the email entity, and email_activity_parties is the name of the 1:N relationship from the email entity to the activity party entity.

Now that all of the required objects have been created we can issue the call to the REST service to create the email and related records. The following snippet utilizes a jQuery plugin from our custom JScript library. It is merely doing a POST request to the REST service with the data for the POST being the JSON serialized emailEntity object that was created.

 1: // Create the email by POSTing the data to the REST service
 2: var createResult = $.xrm.orgData.buildRequest().
 3:     async(false).
 4:     dataset("Email").
 5:     data(emailEntity).
 6:     create();
 7: if (createResult.errorExists) {
 8:     alert("There was an error creating the email.");
 9: } else {
 10:     alert("Success!");
 11: }

That’s it! It really is that simple. The email, activity party, and regarding records were all created in a single call.

In this example, I utilized the deep insert capabilities of the REST services to create an email, but the deep insert feature can be used on any entity in order to create multiple records in a single call. The biggest hurdle that you will probably run into is determining whether to create the related records as JScript objects or arrays of objects. Just remember that 1:N relationships require and array of objects and that N:1 relationships require a single object.

Post by: Nick Doriot, Customer Effective

Show Buttons
Hide Buttons