MS.Tech - ???????

.NET & 微软企业服务器 & 前沿技术和产品
随笔 - 92, 评论 - 1040, 引用 - 87

导航

关于

所有内容和观点仅代表个人观点,如有问题和建议请发Email给我。

标签

每月存档

最新留言

广告

 

在MOSS 2007种利用InfoPath 2007结合Workflow Foundation可以高效的做出非常强大的工作流应用。因为在SDK中这部分的内容有点不流畅,读起来比较费劲。所以我想以我的一点小经验和大家Share下,希望能少走点弯路,然后再结合 SDK 、ECM Starter Kits 和 WSS 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、先到这里吧。最后推荐几篇经典文章:

打印 | 张贴于 2007-01-16 01:18:00 | Tag:微软前沿产品  微软企业服务器

留言反馈

#回复: InfoPath + Workflow + MOSS 编辑
我创建了一个表单库(如请假表单库),给了用户创建表单的权利(填写自己的请假申请并提交),但是不可以修改。在表单库的Setting中设置了从IE打开,但是创建一个工作流的时候,在Tasks里面却总是从InfoPath打开,这样审批者就有了更改的权利...想请问怎样在Tasks中实现从IE打开表单文档。
2007-06-04 16:01:00 | [匿名用户:Rachel]
#回复: InfoPath + Workflow + MOSS 编辑
to liuhuimiao :
我把工作流发布上去了,表单也显示安装成功.
部署到一个列表,手工启动及创建项目时启动.

手工启动时出现init.xsn的表单,但点击"启动工作流"无任何反应,查看列表项目,并没有工作流被启动.
创建项目自动启动时,在工作流列出现"启动时失败(正在重试)".
2007-03-30 17:18:00 | [匿名用户:Tony]
#回复: InfoPath + Workflow + MOSS 编辑
上述问题已经解决,不过也比较糊里糊涂,首先比较“引用”里面没有感叹号的项目,其他项的位置都放在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\,而我自己复制进去的三个dll则放在isapi目录下,干脆把这三个都复制过来,感叹号消失了,而且也可以进入设计模式了,但是双击进行设计的时候,又出现了
Could not load file or assembly 'Microsoft.SharePoint.WorkflowActions.intl, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies. The system cannot find the file specified.
google了一下,按着网上的方法从moss服务器上copy了两个assembly的dll到刚才那个目录下,问题解决。。。
2007-02-09 11:19:00 | [匿名用户:jeff]
#回复: InfoPath + Workflow + MOSS 编辑
您好,我的机上安装了vs2005 team suite,上面装了SDK 、ECM Starter Kits 和 WSS Workflow StarterKits ,moss在另一台服务器上,由于本机上没有isapi那个目录,我从moss服务器上复制过来,然后在工具箱添加进去。
新建项目的时候有sharepoint组,但是建立sharepoint工作流项目后,不能对Workflow1.cs双击进行设计工作,(像开发工作流那种图形形式),而且,在工具箱上也见不到任何控件,打开这个项目的“引用”,发现Microsoft.Office.Workflow.Tasks.dll、Microsoft.SharePoint.dll 和 Microsoft.SharePoint.WorkflowActions.dll 都有一个感叹号,请问该如何解决?
2007-02-09 10:05:00 | [匿名用户:jeff]
#回复: InfoPath + Workflow + MOSS 编辑
to Xue-Feng, 复杂的工作流用状态机应该都可以解决的.
2007-01-19 04:04:00 | [匿名用户:liuhuimiao]
#回复: InfoPath + Workflow + MOSS 编辑
奇怪的就是ECM中的例子打不开....提示某某活动没有某某属性...好几个打不开...奇怪了...
2007-01-17 09:24:00 | [匿名用户:windie]
#回复: InfoPath + Workflow + MOSS 编辑
厉害!
提一点:MOSS 虽然强大,但在做类似政府公文流转(很多是用 Notes 搭建的)中的超级复杂、变态工作流时是否还能比较方便?或者有没有比较好的思路?
2007-01-16 23:21:00 | [匿名用户:Xue-Feng Zhang]
#回复: InfoPath + Workflow + MOSS 编辑
如果时间允许的话,我也会谈到状态机这部分的。其实和顺序工作流大同小异的,甚至可以理解顺序工作流就是状态机的一种特例。
在这之前,建议你先看 MOSS SDK 以及 ECM Starter Kits 中状态机的例子。
2007-01-16 22:48:00 | [匿名用户:liuhuimiao]
#回复: InfoPath + Workflow + MOSS 编辑
很好的文章,学习中.
您能写一篇创建SharePoint Server State Machine Workflow 的文章吗?
2007-01-16 13:34:00 | [匿名用户:windie]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.1.8