InfoPath + Workflow + MOSS

来源:互联网 发布:学校网络舆情监控制度 编辑:程序博客网 时间:2024/04/18 20:35

MOSS 2007种利用InfoPath 2007结合Workflow Foundation可以高效的做出非常强大的工作流应用。因为在SDK中这部分的内容有点不流畅,读起来比较费劲。所以我想以我的一点小经验和大家Share下,希望能少走点弯路,然后再结合SDKECM Starter KitsWSS Workflow StarterKits 快速掌握这个非常棒的功能。

1、我要创建用于 MOSS 的 Workflow 项目。

     请下载 WSS Workflow StarterKits,安装后将有个"SharePoint Server"的组,内有 SharePoint Sequential Workflow Library 和 SharePoint State Machine Workflow Library 两个项目模板。利用这两个模板创建的项目,对 Workflow 的开发、部署都很方便。

  • 项目用到的 Microsoft.Office.Workflow.Tasks.dll、Microsoft.SharePoint.dll 和 Microsoft.SharePoint.WorkflowActions.dll均在装有MOSS 2007的机器的 C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI\ 目录下。其中开发时主要注意记得在VS2005工具箱里注册 microsoft.sharepoint.WorkflowActions.dll,就可以从工具箱里拖拉出MOSS 特有的 Workflow 控件了。
  • Feature.xml:在 MOSS 中, Workflow 是作为 MOSS 的 Feature 存在的,具体使用时再关联到具体某个 List 或 Library 中并创建实例运作的。因为 Feature.xml 文件就是安装部署时候要把生成的项目 dll 文件作为 Feature 注册到MOSS 中的描述文件了。刚打开时是空的,只是一些提示,按提示插入 Feature 的 Snippets,就有一段 xml 代码插入。其中 GUID 可通过 VS2005 菜单 Tools 下的 Create GUID 创建一个新的 GUID 填入;中间有个 <ElementManifest Location="workflow.xml" /> 节点用于关联工作流 xml 描述文件。
  • Workflow.xml:工作流描述文件。其中有工作流名字Name(该名字在添加 Workflow 关联具体列表或文档库时显示在工作流列表中);GUID(同样通过 Create GUID 生成填入);CodeBesideClass和CodeBesideAssembly对应工作流类全名和程序集全称(项目如进行签名,此处需明确PublickToken,同时把 install.bat 中 gacutil 部分反注释掉);TaskListContentTypeId为工作流使用到的任务列表的 ContentType ID,默认为 Workflow Tasks 的 ContentTypeID,一般不需要修改;AssociationUrl、InstantiationUrl和ModificationUrl一般也不用改,默认创建即是用于呈现InfoPath 的页面,其中 AssociationUrl 为用来关联 Workflow 和列表或文档库,并设置工作流运行参数的页面;InstantiationUrl为用于当手动启用工作流时呈现给用户的初始化页面。Association_FormURN 和 Instantiation_FormURN 等以 _FormURN 结尾的节点都存放其相应的InfoPath Form 的 ID(该 ID 可通过设计InfoPath Form时,打开“文件->属性”窗口即可看到该InfoPath Form 的 ID)。关于 TaskForm 下面解释。
  • install.bat:用于安装部署Workflow的批处理文件。根据具体情况注释或反注释命令行,同时配置MOSS地址即可。
  • Workflow1.cs:工作流设计和代码。

2、我的 InfoPath 表单模版无法正常发布,或者发布后状态为“Installing”而不是“Ready”。

    请检查以下几个环节,一般无法正常发布都有可能是以下原因造成。

  1. 首先检查表单模版是否与浏览器兼容。设计表单模版状态下,打开 InfoPath 菜单“工具-->检查设计方案”,然后再在右边任务窗格中点“更改兼容性设置”弹出表单选项,把“浏览器兼容性”组里的“设计一个可在浏览器或InfoPath 中打开的表单模版”勾起来,然后进行检查。
  2. 如果表单发布用于 Web Access,可同样打开“表单选项”,在“安全和信任”中把“安全级别”调整为“域”级别。
  3. 确认所有的表单最好都不曾发布过。判断依据,把.xsn表单模版文件拷贝到其他地方,打开右键“设计”打开它,如果出现警告错误框提示“此表单已经发布到一个位置,但后来被保存或移动到了另外一个位置。如果确保基于此模板的表单正常工作,请重新发布表单”,那就说明该表单已经发布过,否则则没发布过。没发布过的表单模板,每次保存表单模板时均提示是“发布”还是“保存”,一概“保存”。
  4. 如果该 InfoPath 表单有后部 C#或VB.NET代码,即不小心用 VSTA 打开过,那么发布时会要求必须经过管理员审核,也会造成无法正常发布表单。可在“表单选项”窗口中“编程”里,点击“删除代码”即可。
  5. InfoPath 2007是中文版本,但发布到英文版本的MOSS 中时也会出现发布异常。同样在“表单选项”窗口中“浏览器”里,选择表单语言为“英语(美国)”即可。

3、我在 MOSS 列表中设置 Workflow 为新增一条记录 A 时就自动启动,同时给审批者创建一条任务,该任务用了我自己定义的任务InfoPath 表单,但该InfoPath 任务表单中有几个字段是要读取记录A中字段值来显示的。

    这个问题的实质就是要把某条具体 ListItem 中的字段值传递给 Task 表单(该表单为 InfoPath 表单),然后再通过Task表单显示出来。这里头有三个子问题:怎样获取和当前Workflow相关的 ListItem、通过怎样方式把值传递给 Task表单、Task 表单最后又怎么呈现。

  1. 怎样获取和当前Workflow相关的ListItem:通过SPWorkflowActivationProperties.Item来获取当前 SPListItem。
  2. 通过怎样方式传递给 Task 表单。请查看《How to:Access Workflow Task form Data》。例如 taskProperties.ExtendedProperties["ApplyNo"] = this.ApplyNo;。
  3. Task表单最后怎么呈现。察看《Creating the WOrkflow Task Edit Form》的第4、5、6点。主要是要选择绑定 ows_ 字段时,默认是没有 ows_ 字段的“主”数据源,你必须选择“ItemMetadata (辅助)”数据源才能看到ows_字段。

    具体范例可以查看 ECMStarterKits中 HelloWorld 经典示例。结合上面注意的几点。

4、我现在已经在 Workflow.xml 里配置了一个 Task Form了(有类似这么一个节点<Task0_FormURN>urn:schemas-microsoft-com:office:infopath:ReviewTaskForm:-myXSD-2005-11-22T23-52-35</Task0_FormURN>),这个 Task Form是我第一个 Task 用到的,但我还有第二步,第三步,每个步骤都会建一个任务,我的每个任务都要对应不同的 Task Form 来收集每个阶段的用户录入的数据来运作工作流的。怎么加第二个任务表单?

    根据 SDK 《Windows Task Form〉,无疑,增加第二个Task Form的第一步就是在把设计好的第2步用到的InfoPath 表单模板的 ID(URN) 配置起来。即在<Task0_FormURN>节点下增加类似这么一个节点:<Task1_FormURN>urn:schemas-microsoft-com:office:infopath:MultiStage-Initiation:-myXSD-2006-04-28T22-44-03</Task1_FormURN>。

    真正核心的问题来了,怎么让第2个任务表单<Task1_FormURN>和实际工作流中分配的第2条任务关联起来?好,关键就在 SPWorkflowTaskProperties.TaskType 这个属性。TaskType = 0 时就表示这是第一个任务请用第一个任务表单,TaskType=1时就表示这是第二个任务请用第二个任务表单。就是这么简单。:)

    你可以打开 ECM StarterKits中的 MultiStage 示例,这个示例是比较实用的例子,务必研读。打开示例中的 WorkflowTask.cs,找个GetTaskCreationProperties()方法。修改如下:

public SPWorkflowTaskProperties GetTaskCreationProperties(int taskType)
{
    SPWorkflowTaskProperties properties = new SPWorkflowTaskProperties();
    properties.AssignedTo = this.Participants[0].AccountId;
    properties.Title = this.TaskTitle;
    properties.Description = this.TaskInstructions;
    properties.SendEmailNotification = true;
    properties.TaskType = taskType;
    properties.DueDate = (DateTime)this.dueDate;

    return properties;
}

    然后再打开 Workflow1.cs 代码,搜索到这么一行代码 activity.TaskCreationProperties = this.activeTask.GetTaskCreationProperties(); 改为:

activity.TaskCreationProperties = this.activeTask.GetTaskCreationProperties(this.completedStages);

    至此,这个 MultiStage 例子就更智能化了。你在增加工作流步骤外,还可以方便控制每个步骤任务用到的 InfoPath 表单了,而不是都用同一个表单。

5、先到这里吧。最后推荐几篇经典文章: