我正在使用OOB工作流程(使用CRM UI工作流设计器设计)和自定义操作(使用.NET代码编写的操作)的组合,在CRM中设计冗长的审批系统。想法是将整个分支/更简单的逻辑保留在OOB工作流中,并在必要时调用自定义操作。但是我对这种方法的问题很少:
如何处理操作代码中生成的运行时错误? 例如,我的一个操作包含通过Web服务将数据推送到外部系统的代码。如果此Web服务调用失败,我需要在父工作流中执行一些步骤。
我如何处理'条件'这不能由“检查条件”处理。步骤?例如,假设在执行某个工作流程步骤之前,我需要检查一些无法在CRM中查询的数据。我可以创建一个Action,它将根据自定义逻辑返回true / false,然后可以在父工作流中检查。
另一种方法是使用插件,但我倾向于尽可能使用OOB功能。任何输入都会有所帮助。
答案 0 :(得分:2)
首先让我们清楚语义,因为我不确定你是否理解你在说什么 - 有些动作(你可以将它们称为自定义动作,但是你应该参考你创建的每个工作流程)自定义,我发现你的帖子中你将它们描述为OOB,这也是语义错误 - 你创建的每个工作流程都是自定义工作流程,可能是使用OOB步骤,但这是一个不同的故事)和自定义工作流程活动。我假设您要使用自定义工作流程活动,因为它更适合您在此处尝试实现的目标。您还将您的问题标记为CRM 2011和CRM 2013 - 不确定您的意思,因为CRM 2011无法使用操作。
所以基本上自定义工作流活动可以有输入和输出参数。输出参数可以回答您的两个问题,因为您可以在自定义处理后使用它们来获取错误消息,或者在工作流程中稍后的条件语句中使用它们。输出参数可以定义如下:
[Output("Error message")]
public OutArgument<string> ErrorMessage { get; set; }
您可以在此处找到更多示例: https://technet.microsoft.com/en-us/library/gg327842.aspx
您当然可以通过调用
来设置此属性ErrorMessage.Set(executionContext, messageText)
所以现在当您定义工作流时,无论何时需要在OOB块中无法配置的内容,您都可以将自定义块放在完成之后只需检查输出中的错误(这只是一个示例,您可以将其设置为pimp通过添加额外的输出参数,使其更通用),如果它是空的然后做某事,如果没有然后做其他事情,例如发送带有错误消息的电子邮件。这一切都取决于你想要实现的目标。
动作用于不同的目的,它们对于创建可以通过插件或javascript(webAPI)轻松调用的逻辑非常有用,并允许您在一个事务中执行所有操作时同时添加插件。也许它会在您的工作流程中的某个地方有用,但据我记得在CRM 2013中,无法从工作流程中调用操作......
更新: 好的,如果我们正在处理CRM 2016,我们可以从工作流程调用Action。在这种情况下最擅长的是取决于场景和我们想要实现的目标,但是为了让我更容易决定让我突出主要的差异:
1)活动只是可以放在工作流程中的代码块。它们自己的动作不是代码,它们是您可以调用的自定义消息。当然你可以在这个自定义消息上注册一个插件,并在那里做你想要的任何自定义逻辑,但这是另一个步骤
2)操作可以在事务中运行,而不是活动(但是你可以在Actions中运行Activities,所以在这种情况下它们可以在事务中运行)
3)可以直接从Javascript,插件和工作流程调用操作。这是一件很棒的事情,但是如果你要说10个自定义动作,你将只在你的一个工作流程中使用它们,当你注册插件时它们将是可见的(并且任何js开发人员都可以用JS调用它们) )
所以基本上,动作是一个很大的功能,可以用于多种目的(包括自己运行的活动!),活动要简单得多,但在你的情况下,它们也可以完成它们的工作。所以你应该问自己一些问题:
我是否需要在逻辑内部运行逻辑?
和
我是否需要在除工作流程之外的其他地方调用此逻辑?
如果您有任何“是”,那么请选择“操作”,“否”,然后选择“活动”,因为您将毫无理由地过度复杂化。