Introduction
The shared variable property allows for including data that can be passed from the API or a plug-in to a step that occurs later in the execution pipeline.
You can set a string value that will be available to plug-ins within the ExecutionContext in the SharedVariables
collection.
Note :- Shared variable passed from Organization Service and WEB API will be available in both Pre-operation and Post-Operation execution pipeline of that particular entity. This will be helpful where we need to perform some business logic based on value passed from Organization service and WEB API. We don’t need to store that details in any custom field.
Add a Shared Variable from the Organization Service
Entity objMyAccount = new Entity("account");
objMyAccount["name"] = "Test Shared Variable from C#";
var createRequest = new CreateRequest() { Target = objMyAccount };
//Set Shared Variable using tag property
createRequest["tag"] = "This is a value passed.";
crmSvc.Execute(createRequest);
Add a Shared Variable from the Web API
To pass this value using the Web API, simply use the tag
query option.
For example: ?tag=This is a value passed.
var entity = {};
entity.name = "Test SharedVariable from WEB API";
var req = new XMLHttpRequest();
req.open("POST", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/accounts?tag=This is a value passed from web api", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
if (this.readyState === 4) {
req.onreadystatechange = null;
if (this.status === 204) {
var uri = this.getResponseHeader("OData-EntityId");
var regExp = /\(([^)]+)\)/;
var matches = regExp.exec(uri);
var newEntityId = matches[1];
} else {
Xrm.Utility.alertDialog(this.statusText);
}
}
};
req.send(JSON.stringify(entity));
Pre-Operation Plugin code on Account Entity
As you can see we are setting shared variable to fax field on Account.
if (context.SharedVariables.Contains("tag"))
{
entity.Attributes.Add("fax", context.SharedVariables["tag"].ToString());
}
// Create a new accountnumber attribute, set its value, and add
// the attribute to the entity's attribute collection.
Random rndgen = new Random();
entity.Attributes.Add("accountnumber", rndgen.Next().ToString());
Below image shows Account record created from Console Application using c#. As you can see fax field value is mapped from shared variable value.

Below image shows Account record created from WEB API from Rest Builder . As you can see fax field value is mapped from shared variable value.

Post-Operation plugin code on Account Entity
// Create a task activity to follow up with the account customer in 7 days.
Entity followup = new Entity("task");
string sharedVar = string.Empty;
if (context.SharedVariables.Contains("tag"))
{
sharedVar = context.SharedVariables["tag"].ToString();
}
followup["subject"] = "Send e-mail to the new customer.";
followup["description"] =
"Follow up with the customer. Check if there are any new issues that need resolution." + sharedVar;
followup["scheduledstart"] = DateTime.Now.AddDays(7);
followup["scheduledend"] = DateTime.Now.AddDays(7);
followup["category"] = context.PrimaryEntityName;
// Refer to the account in the task activity.
if (context.OutputParameters.Contains("id"))
{
Guid regardingobjectid = new Guid(context.OutputParameters["id"].ToString());
string regardingobjectidType = "account";
followup["regardingobjectid"] =
new EntityReference(regardingobjectidType, regardingobjectid);
}
//<snippetFollowupPlugin4>
// Obtain the organization service reference.
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
//</snippetFollowupPlugin4>
// Create the task in Microsoft Dynamics CRM.
tracingService.Trace("FollowupPlugin: Creating the task activity.");
service.Create(followup);
We are setting shared variable value to Description field on Task record which we are creating from post create plugin on Account.

TODO for blog reader – You could also write plugin code and register step on Pre-validation step to check if shared variable from Organization Service and WEB API is available.
Let me know your comments.
Hope this helps!
2 thoughts on “{Common Data Service} Pass shared variable to plugins execution pipeline from Organization service and WEB API”