Workflow CRM 2011,以编程方式停止自定义工作流
我一直在尝试以编程方式停止工作流。 我在各种帖子和msdn中都读到,这可以通过更新来实现 通过更新请求显示异步操作状态。 但是每次我更新请求时。工作流停留在中间阶段,如取消或暂停,无法达到最终状态 有什么想法吗Workflow CRM 2011,以编程方式停止自定义工作流,workflow,dynamics-crm-2011,Workflow,Dynamics Crm 2011,我一直在尝试以编程方式停止工作流。 我在各种帖子和msdn中都读到,这可以通过更新来实现 通过更新请求显示异步操作状态。 但是每次我更新请求时。工作流停留在中间阶段,如取消或暂停,无法达到最终状态 有什么想法吗 protected void ExecutePostAccountUpdate(LocalPluginContext localContext) { if (localContext == null) { throw new
protected void ExecutePostAccountUpdate(LocalPluginContext localContext)
{
if (localContext == null)
{
throw new ArgumentNullException("localContext");
}
string fetchXML = "<fetch mapping='logical' count='50' version='1.0'>" +
"<entity name='asyncoperation'>" +
"<filter>" +
"<condition attribute='regardingobjectid' operator='eq' value='" +
localContext.PluginExecutionContext.PrimaryEntityId + "' />" +
"</filter>" +
"</entity>" +
"</fetch>";
EntityCollection col = localContext.OrganizationService.RetrieveMultiple(new FetchExpression(fetchXML));
if (col.Entities.Count > 0)
{
AsyncOperation a = (AsyncOperation)col[0];
a.StateCode = AsyncOperationState.Completed;
a.StatusCode = new OptionSetValue(32);
localContext.OrganizationService.Update(a);
}
}
受保护的void ExecutePostAccountUpdate(LocalPluginText localContext)
{
if(localContext==null)
{
抛出新ArgumentNullException(“localContext”);
}
字符串fetchXML=“”+
"" +
"" +
"" +
"" +
"" +
"";
EntityCollection col=localContext.OrganizationService.RetrieveMultiple(新的FetchExpression(fetchXML));
如果(列实体数>0)
{
AsyncOperation a=(AsyncOperation)列[0];
a、 StateCode=AsyncOperationState.Completed;
a、 StatusCode=新选项设置值(32);
localContext.OrganizationService.Update(a);
}
}
根据,您似乎可以通过代码取消发布工作流
注意:这不一定会停止正在进行的工作流,但会阻止启动该类型的任何新工作流。
const int WorkflowStatusDraft = 1;
const int WorkflowStatusPublished = 2;
public void PublishWorkflow(Guid workflowId)
{
SetStateWorkflowRequest publishRequest = new SetStateWorkflowRequest();
publishRequest.EntityId = workflowId;
publishRequest.WorkflowState = WorkflowState.Published;
publishRequest.WorkflowStatus = WorkflowStatusPublished;
this.CrmService.Execute(publishRequest);
}
public void UnpublishWorkflow(Guid workflowId)
{
SetStateWorkflowRequest unpublishRequest = new SetStateWorkflowRequest();
unpublishRequest.EntityId = workflowId;
unpublishRequest.WorkflowState = WorkflowState.Draft;
unpublishRequest.WorkflowStatus = WorkflowStatusDraft;
this.CrmService.Execute(unpublishRequest);
}
看看我的博客:
确保用户具有取消系统作业的权限
QueryExpression queryExpression = new QueryExpression("asyncoperation") { ColumnSet = new ColumnSet("statuscode") };
queryExpression.Criteria.AddCondition("name", ConditionOperator.Equal, Name of Workflow);
queryExpression.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, regardingobjectId);
var asyncOperations = organizationService.RetrieveMultiple(queryExpression);
foreach (var asyncOperation in asyncOperations.Entities)
{
if (((OptionSetValue)asyncOperation["statuscode"]).Value == 10 || // Waiting
((OptionSetValue)asyncOperation["statuscode"]).Value == 20 || // In Process
((OptionSetValue)asyncOperation["statuscode"]).Value == 0)
{
Entity operation = new Entity("asyncoperation")
{
Id = asyncOperation.Id,
["statecode"] = new OptionSetValue(3),
["statuscode"] = new OptionSetValue(32)
};
organizationService.Update(operation);
}
}
确保用户具有取消系统作业的权限。您是指试图从工作流中的代码中中止工作流,还是指“从外部”中止工作流,如在单独的代码中?可能值得发布一些到目前为止您所获得的示例代码。嘿,alec,我添加了示例代码,我正在尝试从工作流外部中止它,在这种情况下,我尝试从插件。感谢
StateCode
和StatusCode
通常不会对常规更新做出太好的响应。您是否尝试过发出SetStateRequest
?否,在msdn中,它是为了使用更新而编写的,但我已经发现发生了什么,更改工作流状态并不会停止更新。无论新状态如何,工作流都将继续运行。但在流程结束时,会有一个指示,指示最终状态是什么。您应该测试这是否实际“停止”运行工作流。我的理解是,工作流已经在运行,不受取消发布和重新发布的影响。这是一个很好的观点,我已经用这个警告修改了我的答案。老实说,我认为没有办法实现这里的要求。@Alec这是可以实现的,请查看这里的详细信息:
QueryExpression queryExpression = new QueryExpression("asyncoperation") { ColumnSet = new ColumnSet("statuscode") };
queryExpression.Criteria.AddCondition("name", ConditionOperator.Equal, Name of Workflow);
queryExpression.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, regardingobjectId);
var asyncOperations = organizationService.RetrieveMultiple(queryExpression);
foreach (var asyncOperation in asyncOperations.Entities)
{
if (((OptionSetValue)asyncOperation["statuscode"]).Value == 10 || // Waiting
((OptionSetValue)asyncOperation["statuscode"]).Value == 20 || // In Process
((OptionSetValue)asyncOperation["statuscode"]).Value == 0)
{
Entity operation = new Entity("asyncoperation")
{
Id = asyncOperation.Id,
["statecode"] = new OptionSetValue(3),
["statuscode"] = new OptionSetValue(32)
};
organizationService.Update(operation);
}
}