2

背景

CRM 2011(和 CRM Online)中的工作流和对话过程允许我们向启用电子邮件的记录(例如联系人、帐户和用户)发送电子邮件。如果启用电子邮件的记录没有电子邮件地址,则该过程将失败并出现异常(工作流保持等待状态,对话框抛出异常):

未处理的异常:System.ServiceModel.FaultException`1 [[Microsoft.Xrm.Sdk.OrganizationServiceFault,Microsoft.Xrm.Sdk,Version=5.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35]]:在聚会或聚会上找不到对象地址被标记为不可通过电子邮件发送

我的场景

在许多情况下,由于无法发送电子邮件而导致整个过程出错是很严厉的(同样我接受在许多情况下这种行为也是可取的)。例如,如果我正在创建和更新许多记录作为大型工作流程的一部分,并且只是希望在流程结束时发送一封简单、礼貌的确认电子邮件,我不希望整个流程仅仅因为最后一步而失败无法完成。我可以在我的工作流程中添加一个简单的条件语句,以在发送电子邮件步骤之前检查地址是否存在。这可行,但我(或更具体地说,我的用户)需要记住为创建的每个电子邮件步骤执行此操作。

理论解决方案

理想情况下,我会有一个子工作流程,它可以接受一个电子邮件对象作为输入,然后我会在发送电子邮件之前运行一个小检查以确认有一个发件人和收件人。如果数据丢失,我可以静默地使子流程失败或调用不同的逻辑,例如向原始用户发送电子邮件或编写错误记录。

但是,鉴于以下......

  • CRM Online 中仍然不支持自定义工作流程序集
  • 工作流不接受传入参数
  • 甚至对话框也不支持将“电子邮件对象”作为输入参数,也不支持将值数组(例如,对于收件人)作为输入参数
  • 子对话框在完成后不会将控制权返回给调用者

...我正在努力构想一种模式或解决方案,它可以有效地让我避免用户必须记住在他们创建的每个工作流或对话框中进行硬编码检查(以检查是否存在收件人电子邮件地址)。

理想情况下,我想要一个类似于通用子工作流的东西,它接受电子邮件对象(或它的序列化或其他表示),进行检查并在可能的情况下发送电子邮件。

交给你

我试图设计一个自定义解决方案,但它很快就会过度设计(系统实体上的插件等)。否则,我看不到避免将责任推给用户的方法。有没有其他人遇到过类似的要求,更好的是,设计了一个解决方案?

4

1 回答 1

2

好吧,我可以想到一个非常简单的解决方案。

  1. 电子邮件上的新字段 - “自动发送”,位,默认否

  2. 新工作流程 - 创建电子邮件,如果“自动发送”== 是 && 发送包含数据 && 收件人包含数据 -> 在上下文中发送电子邮件

  3. 在所有其他工作流程中,不要使用“发送电子邮件”操作,而是使用“创建记录”操作来创建电子邮件记录,正常填充电子邮件,同时填充“自动发送”字段。

通过这种方式,用户几乎可以像往常一样创建电子邮件,但您可以使用单个工作流程来执行验证逻辑并实际发送它。

于 2012-09-10T21:49:21.287 回答