在开箱即用的工作流中处理操作 errors/output
Handling Action errors/output inside out-of-the-box Workflows
我正在使用 OOB 工作流(使用 CRM UI Workflow Designer 设计)和自定义操作(使用 .NET 代码编写的操作)的组合在 CRM 中设计一个冗长的审批系统。想法是将整个 branching/simpler 逻辑保留在 OOB 工作流中,并在必要时调用自定义操作。但是我对这种方法几乎没有疑问:
如何处理操作代码中产生的 运行 时间错误?
例如,我的一个 Actions 包含通过 Web 服务将数据推送到外部系统的代码。如果此 Web 服务调用失败,我需要在父工作流中执行一些步骤。
如何处理'Check Condition'步骤无法处理的'if conditions'?例如,假设在执行之前某个工作流程步骤我需要检查一些无法在 CRM 中查询的数据。我可以创建一个基于自定义逻辑 return true/false 的操作,然后可以在父工作流中检查该逻辑。
另一种方法是使用插件,但我倾向于尽可能多地使用 OOB 功能。任何输入都会有所帮助。
首先让我们理清语义,因为我不确定你是否理解你在说什么 - 有动作(你可以将它们称为自定义动作,但你应该参考你的每个工作流程创建为自定义,我从你的 post 中了解到你将它们描述为 OOB,这在语义上也是错误的 - 你创建的每个工作流都是一个自定义工作流,也许它正在使用 OOB 步骤,但那是另一回事)和自定义工作流活动。我假设您想使用自定义工作流活动,因为它们更适合您在这里想要实现的目标。此外,您将问题标记为 CRM 2011 和 CRM 2013 - 不确定您的意思,因为 Actions 不适用于 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 块中无法配置的东西,你都可以放置你的自定义块,完成后只需检查它的输出错误(这只是一个例子,你可以拉皮条通过添加额外的输出参数,使其更通用),如果它是空的,那么做一些事情,如果不是,那么做一些其他事情,例如发送带有错误消息的电子邮件。这完全取决于您要实现的目标。
Actions 服务于不同的目的,它们对于创建可以通过插件或 javascript (webAPI) 轻松调用的逻辑很有用,并且允许您在其上放置一个插件,同时在一个事务中完成所有事情.也许它会在您的工作流程中的某个地方有用,但据我所知,在 CRM 2013 中无法从工作流程中调用操作...
更新:
好的,如果我们正在处理 CRM 2016,我们可以从工作流中调用 Action。在这种情况下什么是最好的实际上取决于场景和我们想要实现的目标,但为了更容易做出决定让我强调主要区别:
1) 活动只是可以放入您的工作流中的代码块。动作本身不是代码,它们是您可以调用的自定义消息。当然,您可以在此自定义消息上注册一个插件,并在那里执行您想要的任何自定义逻辑,但这是另一个步骤
2) 动作可以是 运行 在交易中,活动不是(但你可以 运行 动作中的活动,所以在这种情况下它们可以 运行 在交易中)
3) 可以直接从 Javascript、插件和工作流中调用操作。这是一件很棒的事情,但是如果你让我们说 10 个自定义操作,你将只在你的一个工作流程中使用它们,当你注册插件时它们将是可见的(并且任何 js 开发人员都可以使用 JS 调用它们)
所以基本上,Actions 是一个大而胖的功能,可以用于多种目的(包括 运行ning 活动本身!),活动要简单得多,但在您的情况下,它们也会完成自己的工作。所以你应该问自己以下问题:
我需要我的逻辑来 运行 内部交易吗?
和
我是否需要在我的工作流之外的其他地方调用此逻辑?
如果你有任何 "Yes" 然后去行动,没有,然后去活动,因为你会没有任何充分的理由使事情过于复杂。
我正在使用 OOB 工作流(使用 CRM UI Workflow Designer 设计)和自定义操作(使用 .NET 代码编写的操作)的组合在 CRM 中设计一个冗长的审批系统。想法是将整个 branching/simpler 逻辑保留在 OOB 工作流中,并在必要时调用自定义操作。但是我对这种方法几乎没有疑问:
如何处理操作代码中产生的 运行 时间错误? 例如,我的一个 Actions 包含通过 Web 服务将数据推送到外部系统的代码。如果此 Web 服务调用失败,我需要在父工作流中执行一些步骤。
如何处理'Check Condition'步骤无法处理的'if conditions'?例如,假设在执行之前某个工作流程步骤我需要检查一些无法在 CRM 中查询的数据。我可以创建一个基于自定义逻辑 return true/false 的操作,然后可以在父工作流中检查该逻辑。
另一种方法是使用插件,但我倾向于尽可能多地使用 OOB 功能。任何输入都会有所帮助。
首先让我们理清语义,因为我不确定你是否理解你在说什么 - 有动作(你可以将它们称为自定义动作,但你应该参考你的每个工作流程创建为自定义,我从你的 post 中了解到你将它们描述为 OOB,这在语义上也是错误的 - 你创建的每个工作流都是一个自定义工作流,也许它正在使用 OOB 步骤,但那是另一回事)和自定义工作流活动。我假设您想使用自定义工作流活动,因为它们更适合您在这里想要实现的目标。此外,您将问题标记为 CRM 2011 和 CRM 2013 - 不确定您的意思,因为 Actions 不适用于 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 块中无法配置的东西,你都可以放置你的自定义块,完成后只需检查它的输出错误(这只是一个例子,你可以拉皮条通过添加额外的输出参数,使其更通用),如果它是空的,那么做一些事情,如果不是,那么做一些其他事情,例如发送带有错误消息的电子邮件。这完全取决于您要实现的目标。
Actions 服务于不同的目的,它们对于创建可以通过插件或 javascript (webAPI) 轻松调用的逻辑很有用,并且允许您在其上放置一个插件,同时在一个事务中完成所有事情.也许它会在您的工作流程中的某个地方有用,但据我所知,在 CRM 2013 中无法从工作流程中调用操作...
更新: 好的,如果我们正在处理 CRM 2016,我们可以从工作流中调用 Action。在这种情况下什么是最好的实际上取决于场景和我们想要实现的目标,但为了更容易做出决定让我强调主要区别:
1) 活动只是可以放入您的工作流中的代码块。动作本身不是代码,它们是您可以调用的自定义消息。当然,您可以在此自定义消息上注册一个插件,并在那里执行您想要的任何自定义逻辑,但这是另一个步骤
2) 动作可以是 运行 在交易中,活动不是(但你可以 运行 动作中的活动,所以在这种情况下它们可以 运行 在交易中)
3) 可以直接从 Javascript、插件和工作流中调用操作。这是一件很棒的事情,但是如果你让我们说 10 个自定义操作,你将只在你的一个工作流程中使用它们,当你注册插件时它们将是可见的(并且任何 js 开发人员都可以使用 JS 调用它们)
所以基本上,Actions 是一个大而胖的功能,可以用于多种目的(包括 运行ning 活动本身!),活动要简单得多,但在您的情况下,它们也会完成自己的工作。所以你应该问自己以下问题:
我需要我的逻辑来 运行 内部交易吗?
和
我是否需要在我的工作流之外的其他地方调用此逻辑?
如果你有任何 "Yes" 然后去行动,没有,然后去活动,因为你会没有任何充分的理由使事情过于复杂。