Tuesday, February 26, 2013

Issue regarding service activities resolved in UR 12


A while ago, we had requirement of sending an email to the users to whom service activity is scheduled. We had created a workflow which would send an email to the resources whenever they have be scheduled in for a service activity. The workflow was supposed to be triggered on create of service activity and on change of the resources field on service activity.

We were facing issues with this workflow that it was getting triggered on update of any and every field on the activity whereas the triggers defined were “on change of the resources field” and “create of SA”.

To check this issue we enabled the audit log for service activity, then updated some other field from the service activity and checked the audit log. In the audit log we came to know that the “Scheduling” event was getting triggered whenever the service activity is updated for any field.

As you can also see in the below given screen shot, the changed fields shows resource field with the same value in Old as well as New values, but actually we had updated the location field.





The service activity was getting re-scheduled (see above screen) even if the resources were not changed. As the Reschedule event was getting triggered and setting the same resource again in the resources field, the workflow was getting triggered again and again.

We have tried this on different MS CRM updates which had roll ups installed on it. There we came to know that this is the Roll up 8 and 11 issue.

To resolve the workflow issue we have written a script on the “on change” event of the “Resources” field. This script would set the pipe separated resource names in a custom field and the workflow will be triggered on the change of that particular custom field. It means when the resources are changed the script will be triggered and set the names in the custom field. And when the name is changed in the custom field our workflow of sending email would be triggered. So that whenever any other field of the service activity is updated the workflow will not be triggered.

After the release of UR 12, we have checked this on CRM with Update Roll up 12 installed on it. There we noticed that this issue has been fixed. As you can in below screen shot, instead of scheduling the service activity every time, only update event has been triggered on change of any field of the service activity.






Hope this article helps!

Tuesday, February 5, 2013

Use ExecuteMultipleRequest for performance improvement in bulk data load and other operations


 A new request called ExecuteMultipleRequest has been added to the Update rollup 12 for the Bulk Data Load. Using this request, multiple request can be executed with the single server call. The main advantage of this request is that it will definitely improve the performance since in one round trip to the server, it actually posts more than 1 message to be executed. With reduced round trips for each individual request the performance improvement is exponential.

ExecuteMultipleRequest accepts the collection of different request and executes each request in a order they appear in the collection. This request will optionally returns the response of each request or error occurred while executing the request. Each message request in the input collection is processed in a separate database transaction.

Members of ExecuteMultipleRequest:

1.    Requests: It is a collection of message requests to execute.

2.    Settings: It contains settings that define whether execution should continue if an error occurs executing a request and if responses for each message request processed are to be returned.
Below is the example, where different requests like Create/Update are added to ExecuteMultipleRequest collection and submit it for processing in a single round trip.
                    // Create an ExecuteMultipleRequest object.
                    ExecuteMultipleRequest requestWithResults = new ExecuteMultipleRequest()
                    {
                        // Assign settings that define execution behavior: continue on error, return responses.
                        Settings = new ExecuteMultipleSettings()
                        {
                            ContinueOnError = true,
                            ReturnResponses = true
                        },
                        // Create an empty organization request collection.
                        Requests = new OrganizationRequestCollection()
                    };
                   //create account entity
                   Entity accountEntity=new Entity("account");
                   //set name for the account
                   accountEntity.Attributes["name"] = "New Account "+new DateTime();
                   //create CreateRequest object
                   CreateRequest createRequest = new CreateRequest { Target = accountEntity };
                   //add to ExecuteMultipleRequest Collection
                   requestWithResults.Requests.Add(createRequest);
                   //retrieve contact entity
                   Entity contactEntity = _service.Retrieve("contact", new Guid("FC298C3B-2E4F-     E211-9DED-1CC1DE6DAA3E"),                                      new Microsoft.Xrm.Sdk.Query.ColumnSet());
                   //set Business Phone for the contact
                   contactEntity.Attributes["telephone1"]="1234567";
                   //create UpdateRequest
                   UpdateRequest updateRequest = new UpdateRequest { Target = contactEntity };
                   //add to ExecuteMultipleRequest Collection
                   requestWithResults.Requests.Add(updateRequest);
                   // Execute all the requests in the request collection using a single web method call.
                   ExecuteMultipleResponse responseWithResults = (ExecuteMultipleResponse)_service.Execute(requestWithResults);
                        if (responseWithResults.IsFaulted)
                        {
                            // Display the results returned in the responses.
                            foreach (var responseItem in responseWithResults.Responses)
                            {
                                // A valid response.
                                if (responseItem.Response != null) { }
                               
                                // An error has occurred.
                                if (responseItem.Fault != null) { }
                              
                            }
                        }

Members of ExecuteMultpleResponse:

1.    IsFaulted: It can be used  to identify if any of the messages submitted failed. Once you have identified an error you can loop through the response item to read the error description per message failure.

2.    Responses: Indicates the collection of responses.

Note: This request will only work on organizations that have UR12 applied or on Online organizations that have been upgraded to Polaris.



For further read on this, you can also refer to Microsoft CRM SDK documentation on ExceuteMultiple here.