InfoPath + Workflow + MOSS

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、先到這裏吧。最後推薦幾篇經典文章:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章