SharePoint 2010: 设计BCS工作流
一起使用SharePoint工作流和BCS可以實(shí)現(xiàn)很多復(fù)雜的業(yè)務(wù)場(chǎng)景。
為什么使用BCS工作流?
比如,有一個(gè)簡(jiǎn)單的費(fèi)用報(bào)銷流程,客戶希望:僅當(dāng)總費(fèi)用超過(guò)某個(gè)限額時(shí),工作流會(huì)把費(fèi)用報(bào)告發(fā)送給審批者;如果低于這個(gè)限額,則自動(dòng)審批通過(guò)。而每個(gè)人的限額是不同的,每個(gè)人的限額可以從某個(gè)外部系統(tǒng)中獲取到。我們可以考慮利用BCS獲取到這個(gè)數(shù)據(jù)。如果這個(gè)數(shù)據(jù)是通過(guò)外部數(shù)據(jù)列表暴露在SharePoint的,工作流就可以查詢到這個(gè)數(shù)據(jù)。
支持的工具
一般來(lái)講,我們有2種工具來(lái)設(shè)計(jì)BCS工作流。一是采用SharePoint Designer 2010提供的開箱即用的Activity來(lái)設(shè)計(jì),再有,就是使用Visual Studio。
設(shè)計(jì)時(shí)需要牢記的幾點(diǎn)
設(shè)計(jì)BCS工作流時(shí),有幾個(gè)點(diǎn)非常重要。
在SharePoint 2010里,工作流不能直接關(guān)聯(lián)到外部數(shù)據(jù)列表。這是因?yàn)橥獠繑?shù)據(jù)不是保存在SharePoint里,所以當(dāng)列表?xiàng)l目發(fā)生變化時(shí)無(wú)法通知給工作流。但這并不意味著外部數(shù)據(jù)無(wú)法使用工作流。我們可以創(chuàng)建一個(gè)站點(diǎn)工作流,或者為某個(gè)常規(guī)列表(如文檔庫(kù))創(chuàng)建一個(gè)工作流,并讓這個(gè)列表從外部數(shù)據(jù)列表讀取/更新數(shù)據(jù)。當(dāng)然,我們也可以將外部數(shù)據(jù)列表項(xiàng)作為SPD任務(wù)處理的目標(biāo),盡管任務(wù)鏈接總是外部數(shù)據(jù)列表項(xiàng)沒有標(biāo)題。
工作流會(huì)一直以服務(wù)賬號(hào)來(lái)運(yùn)行(一般是IIS的應(yīng)用程序池賬號(hào)),并且只有當(dāng)使用Secure Store Service或者RevertToSelf(因?yàn)榘踩?#xff0c;默認(rèn)情況下被關(guān)閉)時(shí)才支持工作流。這樣的限制是為了保護(hù)SharePoint受到惡意模型/開發(fā)人員的攻擊。因?yàn)閷?duì)后臺(tái)系統(tǒng)的訪問總會(huì)以某個(gè)服務(wù)賬號(hào)觸發(fā),所以我們無(wú)法跟蹤到底是誰(shuí)修改了數(shù)據(jù)。要解決這個(gè)問題,我們可以讓工作流把SPUser的名稱傳遞到外部數(shù)據(jù)列表的某個(gè)列,或者是某個(gè)使用BDC API的自定義Activity,但這僅僅是為了信息追蹤的目的而不是一個(gè)可靠的安全保護(hù)措施。
如何設(shè)計(jì)BCS工作流?
使用SPD List Item Activity和使用外部數(shù)據(jù)列表是非常類似的,2者最大的差別是對(duì)于SPD List Item Activity,我們識(shí)別它時(shí)需要使用其Identifying列而不是ID。
使用SPD Activity構(gòu)建安全限額工作流
接下來(lái)我們開始設(shè)計(jì)前面提及的費(fèi)用報(bào)銷工作流。
- 在SPD中創(chuàng)建外部?jī)?nèi)容類型,命名為SafeLimit;
- 有2個(gè)字段:EmployeeID和安全限額的值
- 使用SafeLimit外部?jī)?nèi)容類型,創(chuàng)建外部數(shù)據(jù)列表,命名為SafeLimits;
- 創(chuàng)建一個(gè)名稱為ExpenseReports的文檔庫(kù);
- 添加一個(gè)EmployeeID的新列
- 在SPD中,打開ExpenseReports文檔庫(kù);
- 點(diǎn)擊"New List Workflow";
- 為工作流起一個(gè)名稱,并且輸入描述信息,然后點(diǎn)擊下一步;
- 添加一個(gè)"Set Workflow Variable"的動(dòng)作;
- 點(diǎn)擊工作流變量鏈接,點(diǎn)擊"Create New Variable",命名為 SafeLimit;
- 點(diǎn)擊"Value",然后 點(diǎn)擊按鈕 創(chuàng)建外部數(shù)據(jù)列表查詢;
- 選擇SafeLimits外部數(shù)據(jù)列表作為數(shù)據(jù)源;
- 選擇顯示Safe Limit的字段Limit;
- 選擇EmplyeeID;
- 點(diǎn)擊對(duì)話框中的按鈕,在新對(duì)話框中選擇"Current Item",然后再選擇EmployeeID。
完成上面的操作后,結(jié)果如下圖。現(xiàn)在可以選擇SafeLimit變量,并且在工作流中使用它來(lái)作決策了。
備注:當(dāng)點(diǎn)擊"Ok"后,會(huì)有一個(gè)如下的警示信息。這對(duì)于外部數(shù)據(jù)列表來(lái)講是正常的,無(wú)需在意。它只是告訴我們?nèi)绻獠繑?shù)據(jù)列表項(xiàng)目沒有唯一值,那么系統(tǒng)將返回第一個(gè)找到的項(xiàng)目。
小提示:關(guān)于Activity用法和常見錯(cuò)誤
什么情況下使用這些Activity?
- 如果需要從外部數(shù)據(jù)列表中讀取一小部分列,并且在工作流中使用它們。
- 從同一個(gè)外部數(shù)據(jù)列表中讀取多個(gè)值并不會(huì)緩沖該條目。正因?yàn)槿绱?#xff0c;Activity會(huì)對(duì)每個(gè)要讀取的列首先調(diào)用Read List方法,然后再調(diào)用Read Item方法。所以,如果我們要讀取一個(gè)包含1000個(gè)條目的列表的10個(gè)屬性值,系統(tǒng)需要發(fā)起20個(gè)對(duì)BDC的調(diào)用,并且最終從后臺(tái)系統(tǒng)中讀取到20010個(gè)條目。
- 如果需要?jiǎng)?chuàng)建、更新或者刪除外部數(shù)據(jù)列表的一小部分條目。
需要牢記在心的內(nèi)容
- 如果要查找某一個(gè)條目,如某個(gè)員工的辦公室編號(hào),但系統(tǒng)返回的值是Null,我們無(wú)法確定是返回了0個(gè)條目還是1個(gè)條目,我們只知道值是Null,這時(shí)候我們?cè)撛趺崔k呢?我們可以首先確認(rèn)該條目是否存在,如:根據(jù)員工 姓名或ID找到該員工。如果該員工存在,然后再找到其辦公室編號(hào);如果是Null,那我們就知道該員工沒有辦公室編號(hào)了。
- 在外部數(shù)據(jù)列表中創(chuàng)建新的條目后,從同一工作流對(duì)該條目的任何修改都必須通過(guò)Create List Item方法返回的BDC Identity反饋到該條目。如果嘗試通過(guò)從所有列中找值的方式來(lái)找到該條目,肯定會(huì)導(dǎo)致失敗。
- 絕對(duì)無(wú)法從已有的條目中讀取BDC Identity的值,必須通過(guò)找非BDC Identity列的值方式才可以找到已有的條目。
轉(zhuǎn)載于:https://www.cnblogs.com/dwang/archive/2010/06/19/1761002.html
總結(jié)
以上是生活随笔為你收集整理的SharePoint 2010: 设计BCS工作流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用windbg排查一个内存溢出的问题
- 下一篇: [JS] - 判断IE6和IE7