SharePoint 2010: 设计BCS工作流

一起使用SharePoint工作流和BCS可以实现很多复杂的业务场景。

为什么使用BCS工作流?

比如,有一个简单的费用报销流程,客户希望:仅当总费用超过某个限额时,工作流会把费用报告发送给审批者;如果低于这个限额,则自动审批通过。而每个人的限额是不同的,每个人的限额可以从某个外部系统中获取到。我们可以考虑利用BCS获取到这个数据。如果这个数据是通过外部数据列表暴露在SharePoint的,工作流就可以查询到这个数据。

支持的工具

一般来讲,我们有2种工具来设计BCS工作流。一是采用SharePoint Designer 2010提供的开箱即用的Activity来设计,再有,就是使用Visual Studio。

设计时需要牢记的几点

设计BCS工作流时,有几个点非常重要。

  1. 工作流不能关联到外部数据列表

    在SharePoint 2010里,工作流不能直接关联到外部数据列表。这是因为外部数据不是保存在SharePoint里,所以当列表条目发生变化时无法通知给工作流。但这并不意味着外部数据无法使用工作流。我们可以创建一个站点工作流,或者为某个常规列表(如文档库)创建一个工作流,并让这个列表从外部数据列表读取/更新数据。当然,我们也可以将外部数据列表项作为SPD任务处理的目标,尽管任务链接总是外部数据列表项没有标题。

  2. 访问BCS的工作流必须以服务账号运行,即使在身份模拟步骤下

    工作流会一直以服务账号来运行(一般是IIS的应用程序池账号),并且只有当使用Secure Store Service或者RevertToSelf(因为安全原因,默认情况下被关闭)时才支持工作流。这样的限制是为了保护SharePoint受到恶意模型/开发人员的攻击。因为对后台系统的访问总会以某个服务账号触发,所以我们无法跟踪到底是谁修改了数据。要解决这个问题,我们可以让工作流把SPUser的名称传递到外部数据列表的某个列,或者是某个使用BDC API的自定义Activity,但这仅仅是为了信息追踪的目的而不是一个可靠的安全保护措施。

如何设计BCS工作流?

使用SPD List Item Activity和使用外部数据列表是非常类似的,2者最大的差别是对于SPD List Item Activity,我们识别它时需要使用其Identifying列而不是ID。

使用SPD Activity构建安全限额工作流

接下来我们开始设计前面提及的费用报销工作流。

  • 在SPD中创建外部内容类型,命名为SafeLimit;
    • 有2个字段:EmployeeID和安全限额的值
  • 使用SafeLimit外部内容类型,创建外部数据列表,命名为SafeLimits;
  • 创建一个名称为ExpenseReports的文档库;
    • 添加一个EmployeeID的新列
  • 在SPD中,打开ExpenseReports文档库;
  • 点击"New List Workflow";
  • 为工作流起一个名称,并且输入描述信息,然后点击下一步;
  • 添加一个"Set Workflow Variable"的动作;
  • 点击工作流变量链接,点击"Create New Variable",命名为 SafeLimit;
  • 点击"Value",然后 点击按钮 创建外部数据列表查询;
  • 选择SafeLimits外部数据列表作为数据源;
  • 选择显示Safe Limit的字段Limit;
  • 选择EmplyeeID;
  • 点击对话框中的按钮,在新对话框中选择"Current Item",然后再选择EmployeeID。

完成上面的操作后,结果如下图。现在可以选择SafeLimit变量,并且在工作流中使用它来作决策了。

备注:当点击"Ok"后,会有一个如下的警示信息。这对于外部数据列表来讲是正常的,无需在意。它只是告诉我们如果外部数据列表项目没有唯一值,那么系统将返回第一个找到的项目。

小提示:关于Activity用法和常见错误

什么情况下使用这些Activity?

  • 如果需要从外部数据列表中读取一小部分列,并且在工作流中使用它们。
    • 从同一个外部数据列表中读取多个值并不会缓冲该条目。正因为如此,Activity会对每个要读取的列首先调用Read List方法,然后再调用Read Item方法。所以,如果我们要读取一个包含1000个条目的列表的10个属性值,系统需要发起20个对BDC的调用,并且最终从后台系统中读取到20010个条目。
  • 如果需要创建、更新或者删除外部数据列表的一小部分条目。

需要牢记在心的内容

  • 如果要查找某一个条目,如某个员工的办公室编号,但系统返回的值是Null,我们无法确定是返回了0个条目还是1个条目,我们只知道值是Null,这时候我们该怎么办呢?我们可以首先确认该条目是否存在,如:根据员工 姓名或ID找到该员工。如果该员工存在,然后再找到其办公室编号;如果是Null,那我们就知道该员工没有办公室编号了。
  • 在外部数据列表中创建新的条目后,从同一工作流对该条目的任何修改都必须通过Create List Item方法返回的BDC Identity反馈到该条目。如果尝试通过从所有列中找值的方式来找到该条目,肯定会导致失败。
  • 绝对无法从已有的条目中读取BDC Identity的值,必须通过找非BDC Identity列的值方式才可以找到已有的条目。
posted @ 2010-06-19 18:16  老猴  阅读(882)  评论(0编辑  收藏  举报