廣域 Script

此主題解說 ClearQuest® 廣域 Script 的概念。

您可以使用廣域 Script 來定義您可以從綱目中任何連結鉤呼叫的一般函數。廣域 Script 就像子常式的程式庫;Rational® ClearQuest 軟體不直接呼叫它們。

當您有多個記錄類型呼叫相同的連結鉤程式碼時,廣域 Script 很有幫助。它們可讓您集中連結鉤程式碼維護,並避免將連結鉤程式碼複製到多個位置。例如,包含在 Rational ClearQuest 電子郵件套件中的廣域 Script,容許多個動作呼叫一個廣域 Script 來傳送通知。

執行廣域 Script 的唯一方式是從另一個 Script 呼叫它。不過,廣域 Script 的呼叫最後仍必須回溯至記錄型連結鉤(例如欄位連結鉤、動作連結鉤或記錄 Script)的呼叫。因為廣域 Script 的呼叫可一律追蹤至記錄型連結鉤,所以會提供每一個廣域 Script 一個隱含的實體物件,該物件會傳遞至產生該呼叫的記錄型連結鉤。

您可以使用 VBScript 和 Perl 撰寫 Script,但一個語言類型無法呼叫另一個語言類型。撰寫廣域 Script 時,請以呼叫它的 Script 的相同語言來撰寫它。

只在廣域連結鉤中使用函數,因為除非程式碼是在函數中,否則會執行廣域 Script 中的所有程式碼。

如需相關資訊,請參閱撰寫 Script使用 Script 作業環境定義

如需相關 Script 的範例,請參閱廣域 Script 範例

對廣域 Script 使用子常式

對於 Perl,$entity 和 $session 變數是廣域變數,當連結鉤執行時,它們會變成作用中。這些變數是在執行時期定義,可使用於廣域 Script 程式碼中。不過,在廣域 Script 的環境定義內,您並不使用這些變數來呼叫 EntitySession 物件方法。

如果廣域 Script 程式碼使用這些變數來呼叫方法(例如 $entity->GetSession),則綱目驗證會失敗,因為 $session 和 $entity 要等到執行時間才會加以定義。例如,廣域子常式外的這個程式碼會失敗,因為您無法對未定義的值 ($session) 呼叫方法。
$info = $session->GetProductInfo();
將 $session 呼叫置於廣域子常式中還不夠。例如,下列程式碼基於相同原因而失敗,因為它嘗試在編譯時期解決 $productInfo
$productInfo = GetProductInfo();
   sub GetProductInfo
   {
       return $session->GetProductInfo();
   }

不使用廣域變數(例如 $productInfo 而呼叫 GetProductInfo())來擷取此值。

在執行 Perl 連結鉤時,$session 一律設定為目前的階段作業。不過,為達到最佳效能,請避免定義對 Session 或 Entity 物件資料敏感的廣域變數;相反的,請撰寫廣域存取元函數 (例如 GetUserLoginName())來擷取值。

廣域 Script 複製作業

廣域 Script 主要是作為可從其他連結鉤(例如:存取控制連結鉤、起始設定連結鉤和驗證連結鉤) 呼叫的子常式集合。若如此做,所有的廣域 Script 程式碼皆納入成為 Perl 程式碼(用以執行每一個連結鉤)的一部分。不過,廣域 Script 程式碼可以包含在子常式範圍之外的陳述式(檔案範圍)。

從 7.0.1 版開始,新增的 Perl 連結鉤加強功能可用來複製廣域 Script。當啟用這項加強功能時,會建立 Perl 連結鉤環境;所有的廣域 Script 程式碼會經過編譯和複製,以建立新的連結鉤環境。複製程序會避免重新編譯程式碼,並可讓連結鉤環境共用剖析樹狀結構。複製 Script 可節省每一個 Perl 連結鉤環境的時間和記憶體,提供更好的效能(尤其是對 Rational ClearQuest Web 的改進更為明顯)。

綱目開發人員在撰寫廣域 Script 時應考量如何使用複製作業。如果已對廣域連結鉤啟用複製作業,廣域 Script 中的檔案範圍陳述式只會執行一次。結果將複製到後續的 Perl 直譯器。如果複製作業已失效,每次建立連結鉤環境時都會執行此程式碼(對每個記錄動作執行一次,對每個記錄 Script 呼叫執行一次)。

為避免在複製的廣域 Script 中執行設定程式碼混淆不清,請將檔案範圍內的設定程式碼移到子常式,並使用特別限定範圍的 our 廣域變數來檢查設定狀態。您可確保設定程式碼在每一個連結鉤環境中一律至少執行一次,並避免多次執行。可從任何需要完成設定的連結鉤呼叫此設定子常式 cab 檔。例如:
  our $run_once;
   sub DoSetup
   {
       return if defined($run_once);
       $run_once = 1;
       # do setup here
   }
sub Defect_Initialization {
 DoSetup();
 # …
 # …
 #reset of Defect_Initialization code….
 # …
 }

在此程式碼範例中,建立連結鉤環境時並未定義 $run_once 變數。在複製此變數之後,它仍然未定義。當連結鉤第一次執行及呼叫 DoSetup() 時,會執行設定程式碼。

註: Perl 廣域 Script 複製作業要求程式碼所呼叫的任何 Perl 程式庫必須是安全執行緒。例如,
use Win32::OLE;
不應使用於複製的連結鉤程式碼中(但可使用於非複製的連結鉤程式碼,包括動作連結鉤、欄位連結鉤和記錄連結鉤)。Win32::OLE 不是安全執行緒,但可在 ClearQuest Web 多執行緒環境外使用。例如,您可以在廣域 Script 內使用
require Win32::OLE; import Win32::OLE;
來避免複製 Win32::OLE 模組,但該模組不應用在搭配 Rational ClearQuest Web 使用的綱目中。
小心: 因為 Perl 模組超出 IBM® 的控制,所以 IBM 無法保證 Perl 模組是否為安全執行緒。如需執行緒安全的相關資訊,請參閱可在 http://www.perl.org 取得的 Perl 文件。

意見