Share via


Service Pack 2 可避免自行啟動變更工作流程。

Service Pack 2 可避免自行啟動變更工作流程。

大家好,Stephen 又和各位見面了 — 我是一位 SharePoint Designer 作者。我想告訴各位 Service Pack 2 for Office SharePoint Server 2007 和 Windows SharePoint Services 3.0 (可能為英文網頁) 裡面有一個修正檔案,這個修正檔案會影響利用 SharePoint Designer 2007 設計的工作流程。同時,我會向各位說明如何利用兩個工作流程,而不是一個工作流程,來建立一個工作流程迴圈。

在 Service Pack 2 推出之前,使用者很容易會設計出會無意中自行觸發的工作流程,並掉入一個無限迴圈之中,這種事太常見了。例如,請細想以下的情況:

1) 當項目變更後,某個工作流程啟動了。

2) 該工作流程更新 (或變更) 目前的項目,例如,使用 [目前項目] (Current Item) 動作中的 [設定欄位] (Set Field)。

3) 因為工作流程變更了項目,所以這個工作流程又再次自我觸發了。

所以,如果您有一個會傳送電子郵件給您的變更工作流程,只要更新了目前的項目,您應該很快就會在收件匣中收到數百封電子郵件。

在伺服器上安裝 Service Pack 2 之後,對於項目變更後觸發啟動的工作流程,再也不會因為變更或更新目前的項目而觸發執行了。這種無限迴圈狀況變得不復存在了:

clip_image002

不過,很多人當初設計工作流程時,確實會利用無限迴圈。例如,您可能會設計一種變更工作流程,讓它在某個工作項目上永無休止的循環下去,同時發出每日提醒,直到工作被標示已完成為止。只要加到清單中做為這種用途的 [計數器] (Counter) 欄被更新了,工作流程就會自我觸發。而且工作流程有一項規則會在部分條件成立時,便停止工作流程或讓工作流程「短路」 — 在這種情況下,若工作狀態 = 完成,工作流程就會停止而且不會變更目前的項目。在 SP2 之後,因為這個工作流不會自我觸發,所以工作流程就可以有效地中斷。

SP2 不會中斷應該有用的無限迴圈,不過您一定要設計兩種 (或更多) 會相互觸發的變更工作流程,否則 SP2 會重新建立之前執行的工作。更新/變更目前的項目而促成兩個變更工作流程相互觸發,是一種 "共同循環" 的狀況:

clip_image004

此外,利用數個會彼此觸發而且較短的工作流程來進行一種依據狀態行事的工作流程,這種現象十分普遍。例如,您可能有一份清單,裡面有一個 [狀態] 欄位以及多個與該清單緊密相連的變更工作流程。所有這些工作流程最後都有一個步驟,就是會更新 [狀態] 欄位。因此,有一個工作流程會因為更新了 [狀態] 而觸發其他多個工作流程,然後這些工作流程會查看 [狀態] 欄位中的值,判斷它們是否應該繼續執行或停止。這種依據狀態行事的工作流程也是一種「共同循環」狀況,原因在於一個工作流程會因為變更/更新目前的項目,進而啟動很多其他的變更工作流程。Service Pack 2 不會封鎖此類依賴共同循環並依據狀態行事的工作流程。

總結

· 在 SP2 之前,單一的變更工作流程在更新目前的項目後會進入無限迴圈,因此就會自我觸發了。

· 在 SP2 之後,一個變更工作流程會在更新目前項目時,觸發任何其他的變更工作流程,不過變更工作流程不會自我觸發。所以各種共同循環狀況 -- 包括利用很多較小的變更工作流程,從而進行依據狀態行事的工作流程 -- 都不會被封鎖。

· 在此提醒大家,建立一個會在目前清單中建立項目的變更工作流程,是絕對不可能形成無限迴圈的。每一個工作流程都有一個包含「我無法啟動工作流程」的屬性 — 這種屬性是用來防止當項目建立之後,啟動的工作流程會永無休止的執行。

· 再進一步提醒各位,前面提及的各種情況都只涉及與單一清單或文件庫緊密相關的工作流程而已。不論是變更工作流程或建立工作流程,只要是屬於跨清單的無限迴圈,從來就未曾被封鎖過。

在 Service Pack 2 之前建立迴圈

本節提供一個實例,說明在 SP2 之前,單一變更工作流程如何利用無線迴圈。在 SP2 之後,這個工作流程將不會自我觸發,因此下一節會提供一個實例,說明如何利用兩個獨立工作流程來形成迴圈。

假設您有一個工作清單,它的名稱是 Team Tasks,您想設計一種工作流程來傳送每日提醒,直到工作被標示為已完成後才停止。

首先,將 [計數器] (Counter) 這一欄加到清單中,預設值設為 0。

clip_image006

您需要從清單表單中隱藏 [計數器] (Counter) 欄 ([新增項目] (New Item)、[編輯項目] (Edit Item)),所以只有該工作流程可以存取/更新它。首先,在清單設定頁面中,按一下 [進階設定] (Advanced Settings),然後允許管理內容類型。

clip_image008

在清單設定頁面中,按一下每一種內容類型,然後在下一頁中按一下 [計數器] (Counter) 欄。隱藏 (Hidden) [計數器] 欄。為清單中的每一個內容重複這個步驟。

clip_image010

建立以及隱藏 [計數器] (Counter) 欄位後,就不會在表單中顯示計數器,您可以開始設計工作流程了。

每次建立或變更項目後,[每日提醒] (Daily Reminder) 工作流程應該就會啟動。

clip_image012

第一個步驟會檢查兩件事:(1) 若工作已經標示成完成,工作就會停止。任何時候將工作最終標示成完成時,這個規則就會讓整個迴圈「短路」。(2) 若工作未完成,工作流程會檢查到期日期是否在未來的時間 (今天以後)。如果是,工作流程會暫停,直至到期日期為止,因為您不希望在到期日之前傳送提醒。

clip_image014

第二步會再次檢查工作是否完成 (以防上一個步驟中,工作流程在到期日前一直暫停,但是工作卻在這段時間中完成)。若工作仍然未完成,工作流程暫停一天。

clip_image016

在工作流程已經暫停的狀況下,第三個步驟還會再次檢查工作是否已經完成;如果完成,則工作流程會停止。

若工作尚未完成,則工作流程 (1) 傳送電子郵件提醒;(2) 查詢 [目前項目] (Current Item) 和 [計數器] (Counter) 欄位來設定 CurrentCount 變數;(3) CurrentCount 加 1,然後將這個值儲存至 NewCount 變數;接下來 (4) 將 [計數器] (Counter) 欄設定成 NewCount 變數儲存的值。

基本上,每次工作流程執行後,這個步驟就會讓 [計數器] (Counter) 這一欄加 1,所以您可以查看 [計數器] (Counter) 這一欄,便可以知道已經傳送過多少次提醒了。而且最重要的是,此步驟最後的「在目前項目中設定欄位」(Set Field in Current Item) 這個動作會「變更」目前的項目,所以造成工作流程自我觸發並形成迴圈。

clip_image018

在 Service Pack 2 之後建立迴圈

在 SP2 之後,您仍然可以達到這種迴圈效果,不過需要設計兩個會彼此觸發的工作流程 (共同循環),不用設計單單一個自我觸發的工作流程。

以下您將利用 (1) 一個會遞增計數的「計數器」(Counter) 工作流程,以及一個 (2) 會實際傳送提醒郵件的「工作者」(Worker) 工作流程。

第一個工作流程 —「計數器」(Counter) 工作流程

如前文所述,您需要在清單中建立 [計數器] (Counter) 欄並將預設值設成為 0、允許管理各種內容類型,以及為清單中的每一種內容隱藏此欄位。

clip_image006[1]

這種雙工作流程設計需要 SendMail 這第二個欄,它可以當做「工作者」(Worker) 工作流程的標幟。預設值必須是 [否] (No) – 否則,對工作項目所做的任何變更都會引發提醒郵件的傳送。

clip_image020

建立或變更項目時,「計數器」(Counter) 工作流程就會啟動。

clip_image022

第一步會檢查工作狀態 – 若工作完成,「計數器」(Counter) 工作流程會停止。

clip_image024

若工作到期日期是未來的某一天 (今天以後),則第二個步驟會暫停,一直到了到期日期為止,因為您並不想在到期日之後傳送提醒。

clip_image026

第三步會再次檢查工作是否完成,以防雖然上一個步驟中工作流程已暫停,但是工作後來完成了。若工作仍然未完成,工作流程暫停一天。

clip_image028

最後一個步驟會再次檢查狀態,瞭解在上次暫停一整天時,工作是否完成了。如果未完成,工作流程會 (1) 將 [計數器] (Counter) 這一欄的值加 1,以及 (2) 將 SendMail 標幟設定成 [是] (Yes),預設值為 [否] (No)。

clip_image030

第二個工作流程 —「工作者」(Worker) 工作流程

更新 (變更) 目前的項目後,上述的「計數器」(Counter) 工作流程就會結束。這些更新會觸發「工作者」(Worker) 工作流程,它是設定成當項目變更時就會啟動。

clip_image032

「工作者」(Worker) 工作流程只會檢查並瞭解 SendMail 旗標是否設定成 [是] (Yes);如果是,工作流程會傳送提醒訊息並將旗標設定成原來的 [否] (No)。

將 SendMail 旗標設定成 [否] (No) 是一種會觸發上述「計數器」(Counter) 工作流程的變更。「計數器」(Counter) 和「工作者」(Worker) 工作流程會彼此觸發對方、傳送每日提醒,直至工作被標示成完成為止。

clip_image034

另一種方法是,若不想出現無限迴圈,當「計數器」(Counter) 這一欄到了特定的值 — 比如 5 次提醒 ,就讓「工作者」(Worker) 工作流程呈報工作通知 。視提醒計數,以下步驟會執行不同的分支。當計數達到 5 之時,工作流程會傳送訊息給管理員,而且管理員的電子郵件地址可以在「傳送電子郵件」(Send an Email) 動作中硬性規定,或者利用工作流程查詢動作,從清單中取得。

clip_image036

您也可以在傳送特定個數的提醒之後,讓「工作者」(Worker) 工作流程將工作重新指派給不同的個人或群組。在這一步,工作流程會將工作重新指派給負責追蹤呈報工作的小組成員所組成的 SharePoint 群組。

clip_image038

如果計數達到特定數字後,您想結束迴圈,也請您務必將分支加到「計數器」(Counter) 工作流程的第一步,而不是加到「工作者」(Worker) 工作流程中。當「計數器」(Counter) 這一欄達到 6 之後,這個分支會停止迴圈。

clip_image040

希望這些內容對您會有所幫助。

—Stephen

這是翻譯後的部落格文章。英文原文請參閱 Service Pack 2 prevents an on-change workflow from starting itself

!-->