I was just trying out if changing the status for the workflow is possible programmatically. Well this is something I tried.
Created a function which would take primary key(guid) of the entity intance and would return all the workflow logs for that entity instance having status as “In Progress” and changing their status to “Failed”
The function to retrieve all the workflowlog id
private ArrayList GetInProgressWorkflowLogIDForEntity(CrmService crmService, string EntityId)
{
QueryExpression myQuery = new QueryExpression();
ColumnSet myCols = new ColumnSet();
// to retireve workflowlogid
myCols.Attributes = new String[] { “workflowlogid” };
myQuery.ColumnSet = myCols;
myQuery.EntityName = EntityName.workflowlog.ToString();
ConditionExpression myCondtionExpression1 = new ConditionExpression();
// entityinstance id against which workflowlog is running
myCondtionExpression1.AttributeName = “regardingobjectid”;
myCondtionExpression1.Operator = ConditionOperator.Equal;
myCondtionExpression1.Values = new object[] {EntityId };
// Status of workflowlog
// Failed – 3
// Succeeded – 2
// In Progress – 1
ConditionExpression myCondtionExpression2 = new ConditionExpression();
myCondtionExpression2.AttributeName = “In Progress”;
myCondtionExpression2.Operator = ConditionOperator.Equal;
myCondtionExpression2.Values = new object[] { “1” };
FilterExpression myFilterExpression = new FilterExpression();
myFilterExpression.FilterOperator = LogicalOperator.And;
myFilterExpression.Conditions = new ConditionExpression[] { myCondtionExpression1, myCondtionExpression2 };
myQuery.Criteria = myFilterExpression;
BusinessEntityCollection myBE=crmService.RetrieveMultiple(myQuery);
ArrayList myWFLogList = new ArrayList();
foreach (BusinessEntity myBusinessEntity in myBE.BusinessEntities)
{
workflowlog myWFLogId = (workflowlog)myBusinessEntity;
myWFLogList.Add(myWFLogId.workflowlogid.Value.ToString());
}
return myWFLogList;
}
Using TargetUpdateWorkflowLog class
ArrayList myWorkflowLog=GetInProgressWorkflowLogIDForEntity(crmService, “55B93CBB-99E3-DD11-9D85-00164145E126”);
foreach (String wfLogId in myWorkflowLog)
{
TargetUpdateWorkflowLog myUpdateWorkflow = new TargetUpdateWorkflowLog();
myUpdateWorkflow.WorkflowLog = new workflowlog();
myUpdateWorkflow.WorkflowLog.workflowlogid = new Key();
// workflowlogid of workflow having status as In Progress
// to be changed to Failed – 3
myUpdateWorkflow.WorkflowLog.workflowlogid.Value = new Guid(wfLogId);
// Failed – 3
// Succeeded – 2
// In Progress – 1
myUpdateWorkflow.WorkflowLog.status = new Picklist();
myUpdateWorkflow.WorkflowLog.status.name = “Failed”;
myUpdateWorkflow.WorkflowLog.status.Value = 3;
UpdateRequest myRequest = new UpdateRequest();
myRequest.Target = myUpdateWorkflow;
UpdateResponse myRes = (UpdateResponse)crmService.Execute(myRequest);
}
One thought on “Programmatically updating the status of workflow logs using TargetUpdateWorkflowLog class in CRM 4.0”