利用SharePoint Designer开发可循环工作流

介绍

大家都知道SharePoint工作流有两种开发(设计)方式:通过SharePoint Designer和Visual Studio.

  • 使用Visual Studio,开发人员可以通过编码的方式灵活的开发SharePoint工作流.
  • 使用SharePoint Designer,网站管理人员可以基于定义和规则设计SharePoint工作流,无需编码.

使用SharePoint Designer设计工作流是件简单的事情,SharePoint Designer工作流设计器可以帮助我们设计出顺序执行的工作流,然而许多真实场景中的工作流可能并非如此,那么SharePoint Designer是否可以设计出非顺序执行的工作流呢?

本文就将”利用”SharePoint Designer来设计一个可以循环的工作流.

使用SharePoint Designer设计一个简单的工作流

我们先利用SharePoint Designer来设计一个简单的工作流,这个工作流先判断一个Bool型变量是否为False,如果为False则向用户收集一个Bool型的数据,并把它赋给之前的变量.

1.用SharePoint Designer打开文档中心网站.

2.新建 > 工作流:

l 名称:WhileInDesigner

l 附加到列表:文档

点击下一步.

3.新建两个变量.

点击变量(V)按钮,添加下列两个变量:

4.添加一个条件.

点击条件按钮,选择比较任意数据源.

点击等于左边的 >   > 选择工作流数据变量:finish.

点击等于右边的,选择.

        

5.添加操作:收集用户数据

下面我们来添加一个收集用户数据的操作,事实上就是为用户创建一个任务.

点击条件 > 从用户处收集数据.

点击此用户,选择创建当前项目的用户.

点击数据 > 下一步,输入任务名称和说明信息.

l 任务名称:Task In While?

点击下一步 > 添加,添加一个向用户收集的数据canFinish:

l 域名:canFinish

l 信息类型:/(复选框)

l 默认值:

设置输出到变量taskID.

点击变量(V)删除自动生成的变量collect.

6.添加操作:获取用户数据

再添加一个操作来获取刚才收集的canFinish值并将其赋给变量finish.

点击操作 > 其他操作 > 设置工作流变量.

点击工作流变量,选择变量:finish.

点击 >   > 按照下图设置: 

最终的工作流如下图所示:

点击完成,SharePoint Designer会保存,验证并自动将工作流关联到之前选择附加的列表上.

7.测试工作流

现在来测试一下刚才设计的工作流.

打开SharePoint文档中心 > 文档,上传一个文档,为其启动WhileInDesigner工作流.

打开任务,编辑WhileInDesigner工作流创建的Task In While?任务,点击完成任务,这时Task In While?任务和WhileInDesigner工作流的状态都是已完成.

修改XOML实现循环

1.SharePoint Designer生成的文件

回到SharePoint Designer,我们发现SharePoint Designer自动生成了以下文件:

l Task In While_003f_.aspx : Task In While?任务的寄主页

l WhileInDesigner.aspx : 工作流初始化页

l WhileInDesigner.xoml : 工作流定义文件

l WhileInDesigner.xoml.rules : 工作流规则文件

l WhileInDesigner.xoml.wfconfig.xml : 工作流配置文件

右键单击WhileInDesigner.xoml,选择XML方式打开.

可以看到如下XOML文件:

false

2.根元素:RootWorkflowActivityWithData元素

从根元素RootWorkflowActivityWithData的三个名称空间可以看出,SharePoint Designer设计的工作流需要Windows Workflow FoundationWindows SharePoint Services 3.0共同支持.

3.替换IfElseActivity

继续往下看,IfElseActivity元素表示我们添加的条件,它对应于WinWF中的IfElseActivity活动.在XOML中,WinWF元素和活动的名称是相同的.

在SharePoint Designer设计的工作流中,步骤总是SequenceActivity元素或者IfElseActivity元素.

所以这里我们将IfElseActivity元素替换为SequenceActivity元素.

IfElseActivity活动的每一条分支都是一个IfElseBranchActivity活动,我们不再需要它,把它修改为WhileActivity.

IfElseBranchActivity.Codition改为WhileActivity.Codition.

这就是我们之前设计工作流时添加条件的目的,利用条件来生成我们需要的规则文件,因为在本文中,WhileActivity循环的条件也是finish=false.

现在原来的IfElseActivity已经被修改为SequenceActivity和及其子元素WhileActivity了.

4.WhileActivity的子活动

在WinWF中, WhileActivity有且只能有一个子活动,然而我们现在的WhileActivity中却包含了多个子活动(基本上一个元素就是一个子活动),所以我们还需要添加一个SequenceActivity将其余的子活动包含在内.

然后我们来看看这些SequenceActivity的子活动们.

5.LookUpActivity与SharePoint Designer自动生成的变量

LookUpActivity的名称空间前缀是ns0,表示它是一个SharePoint Workflow Action.

有过Visual Studio工作流开发经验的朋友一定会想起CreateTask等活动,不错,LookUpActivity与CreateTask活动同属于SharePoint Workflow Actions,但却有所不同, CreateTask等活动被Visual Studio 2005 Designer for Windows Workflow Foundation支持,支持编码开发;而LookUpActivity等活动基于定义和规则,且不被Visual Studio 2005 Designer for Windows Workflow Foundation支持.

LookUpActivity的作用是从指定的列表项中获取某一域的值,这里,它从我们上传的文档中获取上传者的名称,并将其存储在变量_x005f_String0中.

_x005f_String0是SharePoint Designer自动生成的变量.其前缀_x005f_表示它是由SharePoint自动生成的,如果没有此前缀,那么我们可以在SharePoint Designer工作流设计器中看到此变量,中间的String表示其类型,末位0表示序号(这也是SharePoint Designer自动生成的中间变量的命名规则).

6.CollectDataTask

CollectDataTask用来收集用户数据(创建任务),它的属性描述了该任务的内容类型,分配对象,标题,甚至GUID(CollectDataTask将任务的TaskID绑定到了变量taskID上).

7.FindValueActivity

FindValueActivity的作用大概和LookUpActivity差不多,但是FindValueActivity会提供一个默认值,本文的实验中它的存在与否似乎无关紧要,于是删之.

8.又一个LookUpActivity

接着又是一个LookUpActivity,将其ListItem属性值中的_x005f_Int320修改为taskID,这样LookUpActivity就会从Task In While?任务中获取canFinish域的值并将其存储在变量_x005f_Boolean0

9.SetVariableActivity

SetVariableActivity是一个给变量赋值的活动,这里它将_x005f_Boolean0的值赋给变量finish.

10.最终的XOML文件及其逻辑

OK,所有活动已经介绍并且修改完毕,最终的XOML文件内容如下:

如我们之前的描述,工作流启动之后,WhileActivity将检查变量finish的值,如果为false(默认就是false),则执行WhileActivity的子活动.

WhileActivity的子活动的执行过程是:LookUpActivity获取文档的创建者, CollectDataTask为文档创建者分配任务,待任务完成后, LookUpActivity获取任务中canFinish域的值, SetVariableActivity将其值赋给变量finish.

子活动执行完毕,WhileActivity再次检查finish的值,而此时finish的值可能被SetVariableActivity改变,从而根据此值来继续或停止循环.

11.工作流的关联与测试

现在保存XOML文件并关闭,然后双击以工作流方式打开,因为我们修改了XOML文件,所以相比之前的图片有所区别.

 

步骤1中只包含一个操作:子步骤(ID:ID3).在该工作流的XOML文件中可以看到,ID3正是WhileActivity的ID,说明SharePoint Designer可以识别WhileActivity,但无法正确的将其表示出来.

点击完成来完成工作流与文档的关联,如果忽略了这一步,SharePoint中的工作流将不发生任何变化.

最后来测试一下,编辑任务时,不要勾选canFinish,则工作流会自动再分配一项任务,直到你勾选了canFinish.

  

  总结

通过修改SharePoint Designer生成的XOML文件,使SharePoint Designer设计的工作流能够支持WhileActivity,那我们也有理由相信它可以支持更多的WinWF活动.

而且,SharePoint Workflow Actions中的两类活动虽然使用方法不尽相同,但是实现的功能却是一样的(如CreateTask和CollectDataTask),这是不是意味着使用Visual Studio开发的工作流也可以使用SharePoint Designer间接的设计出来?

虽然经过修改的工作流已经无法在SharePoint Designer中再设计,那么我们可不可以扩展SharePoint Designer的工作流设计器使其支持更加复杂的工作流?或者干脆开发第三方工作流设计工具?

留待慢慢研究…

点击下载PDF文档

24 Comments

  1. paul

    我有个问题一直没搞定。我在用Sharepoint实现会签,也就是要求获取多个人的审批意见,如果都通过就做下一步。我用sharepoint designer的将“表单分配给组”操作,然后在下一步中用任意值判断,但是这样做总是没法取到结果。Help!!

  2. janson shi

    设置了"从用户处收集数据",并设置了变量,可总是取不到用户输入的值,我用作者的例子来设置,也同样获取不到canfinish的值,不知道是什么原因?

  3. janson shi

    @paul
    我也遇到同样的问题,不知道你解决了没有?

    还包括:设置了"从用户处收集数据",并设置了变量,可总是取不到用户输入的值,我用作者的例子来设置,也同样获取不到canfinish的值,不知道是什么原因?

  4. Ryan

    @janson shi
    我也有类似现象。
    我在按照楼主的例子,一步步作下来,在做到第7步时候发生问题,在Task中的任务工作流状态并没有变成完成。求解!
    这个问题困扰我很长时间:点‘完成任务’,Task中的任务状态依然是未开始;而且如果再次点‘完成任务’,页面会报错, 求解!

  5. 小飞侠

    您好!
    我是sharepoint的初学者,现在是没有头绪!
    sharepoint designer 和sharepoint server是什么关系?
    他们到底是用来干吗的?

    可不可以买到这方面的书啊?
    真的非常感谢!

  6. @小飞
    SharePoint Designer是为SharePoint Server设计工作流以及UI等的软件(FrontPage的替代软件.).
    你可以看一下kaneboy的《SPS2003深入指南》,关于MOSS2007的书也会在近期推出.

  7. tengwq

    引用————————————————–
    paul: 我有个问题一直没搞定。
    我在用Sharepoint实现会签,也就是要求获取多个人的审批意见,如果都通过就做下一步。
    我用sharepoint designer的将“表单分配给组”操作,然后在下一步中用任意值判断,但是这样做总是没法取到结果���

    Help!!
    ——————————————————–
    同样有这个问题,就是如果一个操作无变量输出,那是不是就无法取得其中的值?如果已经解决,烦请版主回复一下,不胜感激!!!

  8. VivShu

    Hi,

    谢谢你提供的这段程序。 我还有个问题:我想在这段循环程序中update两个变量日期。 但在运行中它总是使用老的日期。我试过 "update list item" and "Do calulation", 但在没法 update 这两个变量。 不知你是否有 update 变量日期的程序或别的方法。希望能听到你的回音。

    再次谢谢!

    Vivian

  9. 请教一下。除了SharePoint 还有别的什么可以生成Xoml文件吗?
    我现在想做一个Web在线设计的Xoml文件的。不知道有没有可用的程序?
    不想全部自己开发。
    请给一点思路好吗????

发表评论

电子邮件地址不会被公开。 必填项已用*标注