技术开发 频道

SharePoint Designer 2007设计工作流三个问题

【IT168 技术文档】

   先看 Kaneboy 的《SharePoint Designer 2007, 强大的工作流设计器》。然后,我们针对利用 SPD 2007进行扩展、设计工作流三个常见问题做一些回答。由于开始步入大忙期,时间和精力有限,每个问题我都只点到为止,具体更细节就不累赘。

    1、“从用户处收集数据”这个Action中输出的输出变量是什么,做什么用?或者换个问法,我怎么获取用户填写在收集表单里的数据?

    输出的变量实际上是任务列表中的ItemID。“从用户处收集数据”这个Action是一个强迫工作流暂停以等待用户进行操作的过程。该Action实际是以任务形式在任务列表中新建一条任务向用户派发,然后用户上来编辑任务进行录入数据,以完成任务。这个输出变量ItemID就是用来定位获取用户填写的数据项的。在Conditions中放入“比较任意数据”,选择“任务”列表要查找用户输入值的哪个字段,然后下面把任务ID和输出变量关联即可。

    2、初始变量Initiations和变量Variables有何区别?

    初始变量赋值于工作流启动前,而Variables则赋值于工作流启动后。二者均在整个工作流生命周期内可用。初始变量工作流务必设置默认值,用于当新建就自动触发工作流的情景。无法通过查找获取到的数据,或者多次反复使用的数据都可以存入变量Variables中,以便在Workflow周期里方便使用。

    3、自定义扩展Activity中,如何获取当前SPWeb、SPList、SPListItem、SPFile等?比如,最简单的,如何获取当前工作流运作的ListItem数据?

    完全可以在自定义Activity中通过WorkflowContext上下文获取到当前项或当前SPWeb等信息。除非你要获取其他Site的数据,否则就没必要用去把Site Url、List Guid或ListItem ID等这些数据信息作为输入参数让工作流定制人员来手工输入以获取相关对象。

    下面为一个代码模板(LiveWriter不支持代码色彩,就看黑白的代码吧):

public class MyActivity: Activity { #region Properties public static DependencyProperty __ContextProperty = DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(MyActivity)); [ValidationOption(ValidationOption.Required)] public WorkflowContext __Context { get { return (WorkflowContext)base.GetValue(__ContextProperty); } set { base.SetValue(__ContextProperty, value); } } public static DependencyProperty ListItemProperty = DependencyProperty.Register("ListItem", typeof(int), typeof(MyActivity)); [ValidationOption(ValidationOption.Required)] public int ListItem { get { return (int)base.GetValue(ListItemProperty); } set { base.SetValue(ListItemProperty, value); } } public static DependencyProperty ListIdProperty = DependencyProperty.Register("ListId", typeof(string), typeof(MyActivity)); [ValidationOption(ValidationOption.Required)] public string ListId { get { return (string)base.GetValue(ListIdProperty); } set { base.SetValue(ListIdProperty, value); } } #endregion protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { Guid listGuid = Helper.GetListGuid(__Context, ListId); SPList list = __Context.Web.Lists[listGuid]; SPListItem item = __Context.GetListItem(list, ListItem); // 做自己的事 :) return ActivityExecutionStatus.Closed; }

    其对应在 WSS.ACTIONS 中的节点配置如下:

<Action Name="测试Activity" ClassName="TestActivities.MyActivity" Assembly="TestActivities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=dd27a7cb343a4cac" AppliesTo="list" Category="我的自定义操作"> <RuleDesigner Sentence="输出 %1 到数据库"> <FieldBind Field="ListId,ListItem" Text="此列表" Id="1" DesignerType="ChooseDoclibItem" /> </RuleDesigner> <Parameters> <Parameter Name="__Context" Type="Microsoft.SharePoint.WorkflowActions.WorkflowContext, Microsoft.SharePoint.WorkflowActions" Direction="In"/> <Parameter Name="ListId" Type="System.String, mscorlib" Direction="In" /> <Parameter Name="ListItem" Type="System.Int32, mscorlib" Direction="In" /> </Parameters> </Action>

    几点说明:

    AppliesTo="list" 表示应用到列表,还可以有 AppliesTo="all" 表示应用到包括列表在内的所有sharepoint库表。Category="我的自定义操作",就表示你在 SPD 2007中看到的 Actions 的分类。Action 内属性还有 ListModeration="true" 表示是否要显示未经审核的项,UsesCurrentItem="true" 表示直接使用当前项。

    DesignerType="ChooseDoclibItem" 表示点“此列表”后弹出选择对话框(ChooseDoclibItem限文档库,列表可用ChooseListItem),以选择参数 ListId 和 ListItem。DesignerType表示SPD 2007支持的各种类型,如整数Integer、字符串String,电子邮件Email(含Email关键参数,类似Field="To,CC,Subject,Body"),单个人员SinglePerson,多个人员Person,参数类型ParameterNames,待更新项类型UpdateListItem(类似Field="ListId,ListItem,ItemProperties"),还有一个我们第一个问题用的“向用户收集数据”用到的类型Survey。SPD 2007设计器都支持这些类型的直接设计,因为也才体现出其强大之处(当然也有不足,如不支持InfoPath,不支持调试,不支持StateMachine等)。

    Id="1" 表示对应 Sentence 中的 %1。比如上面效果,你在SPD 2007将看到显示为“输出 此列表 到数据库”,点此列表后,将弹出让你选择你要的项。 下面Parameters节点里就比较好理解了,只要注意 Direction 有 In 和 Out 作为输入参数和输出参数即可。

    SPD 2007 设计工作流基本也就这些东西,主要要扩展的还是需要你用 VS2005 来自定义 Activity 配合,才能达到最大灵活性。

0
相关文章