若要在巨集中定義自己的函數,請使用 FUNCTION 區塊或 MACRO_FUNCTION 區塊:
語法:使用下列語法來定義函數:
FUNCTION 區塊:
%FUNCTION(type) function-name([usage] [datatype] parameter, ...) [RETURNS(return-var)] { executable-statements [report-block] ... [report-block] [message-block] %}
MACRO_ FUNCTION 區塊:
%MACRO_FUNCTION function-name([usage] parameter, ...) { executable-statements [report-block] ... [report-block] %}
其中:
您可以使用相同名稱來定義多個 FUNCTION 或 MACRO_FUNCTION 區塊, 以便同時處理它們。每一個區塊皆必須有相同的參數列示。 當 Net.Data 呼叫函數時,相同名稱的所有 FUNCTION 區塊或相同名稱的 MACRO_FUNCTION 區塊,會依它們在 Net.Data 巨集中定義時的次序來執行。
對於 FUNCTION 區塊,Net.Data 會以變數值來置換所有的變數參照、 執行所有的函數呼叫,並在可執行的陳述式傳送至語言環境之前, 以結果值來置換函數呼叫。 每一個語言環境以不同的方式處理陳述式。 有關指定可執行的陳述式或呼叫可執行的程式,請參閱執行變數。
對於 MACRO_FUNCTION 區塊, 可執行的陳述式是文字和 Net.Data 巨集語言結構的組合。 此情況下,不會包括任何語言環境,因為 Net.Data 扮演語言處理器的角色, 且會處理可執行的陳述式。
在 Net.Data 巨集中呼叫函數之前,請先在任何其它區塊外定義它們。
當符合 Net.Data 語言結構語法的字元在函數區塊的語言陳述式區段中使用, 作為語法有效的內含程式碼 (如 REXX 或 Perl) 的一部份時, 它們可能會被誤譯為 Net.Data 語言結構,導致在巨集中發生錯誤或無法預期的結果。
例如,Perl 函數可以使用 COMMENT 區塊定界字元 (%{)。 當巨集執行時,%{ 字元會被解譯為 COMMENT 區塊的開頭。然後, Net.Data 會尋找 COMMENT 區塊的結尾,當它讀到函數區塊的結尾時, 會認為找到它。Net.Data 會繼續尋找函數區塊的結尾,當它找不到時, 即會發出錯誤。
使用下列其中一種方法,使用 COMMENT 區塊定界字元或任何其它 Net.Data 特殊字元作為內含程式碼的一部份,不使它們被 Net.Data 解譯為特殊字元:
例如,下列 Perl 函數含有代表 COMMENT 區塊定界字元 %{ 作為 Perl 語言陳述式一部份的字元:
%FUNCTION(DTW_PERL) func() { ... for $num_words (sort bynumber keys %{ $Rtitles{$num} }) { &make_links($Rtitles{$num}{$num_words}); } ... %}
若要確定 Net.Data 將 %{ 字元解譯為 Perl 原始碼而非 Net.Data COMMENT 區塊定界字元, 請以下列任一方式重寫函數:
%FUNCTION(DTW_PERL) func() { %EXEC{ func.prl %} %}
%define percent_openbrace = "%{" %FUNCTION(DTW_PERL) func() { ... for $num_words (sort by number keys $(percent_openbrace) $Rtitles{$num} } { &make_links($Rtitles{$num}{$num_words}); } ... %}
MESSAGE 區塊可讓您決定在順利完成 (或未順利完成) 函數呼叫後, 要如何繼續處理,並且可讓您顯示相關資訊給函數呼叫者。 當處理訊息時,Net.Data 會為呼叫 FUNCTION 區塊的每一個函數, 設定一個語言環境變數 RETURN_CODE。 不會在 MACRO_FUNCTION 區塊的函數呼叫上設定 RETURN_CODE。
MESSAGE 區塊是由一系列的訊息陳述式所組成, 每個陳述式都設有回覆碼值、訊息文字與要執行的動作。 有關 MESSAGE 區塊的語法,請參閱 Net.Data 參考手冊中語言結構一章。
MESSAGE 區塊的範圍可以是廣域或區域。若它是指定在最外層的巨集上,則 MESSAGE 區塊的範圍是廣域的, 且可供在 Net.Data 巨集中執行的所有函數呼叫使用。 如果您定義多個廣域 MESSAGE 區塊,則會採用最近一次定義的。 不過,若 MESSAGE 區塊定義於 FUNCTION 區塊, 那麼,對 FUNCTION 區塊來說 MESSAGE 區塊是區域區塊 (除了 Net.Data 內建函數以外,由廣域訊息區塊處理它的錯誤)。
Net.Data 使用這些規則從函數呼叫處理 RETURN_CODE 或 SQL_STATE 變數值:
下列範例顯示一部份 Net.Data 巨集,其中帶有整體 MESSAGE 區塊, 與一個函數的 MESSAGE 區塊。
%{ 廣域 message 區塊 %} %MESSAGE { -100 : "回覆碼 -100 訊息" : exit 100 : "回覆碼 100 訊息" : continue +default : { 此為超出一行的長訊息。 您可以在此訊息中使用 HTML 標籤,包括 鏈結與套表。%} : continue %} %{ FUNCTION 區塊中的區域 message 區塊 %} %FUNCTION(DTW_REXX) my_function() { %EXEC { my_command.cmd %} %MESSAGE { -100 : "回覆碼 -100 訊息" : exit 100 : "回覆碼 100 訊息" : continue -default : { 此為超出一行的長訊息。 您可以在此訊息中使用 HTML 標籤,包括 鏈結與套表。%} : exit %}
my_function() 傳回一個 RETURN_CODE 值為 50 時, Net.Data 會以下列順序來處理錯誤:
當 Net.Data 找到相配時, 會將訊息文字送給 Web 瀏覽器,並檢查所要求的動作。
當您設定 continue 時, Net.Data 會在印出訊息文字後繼續處理 Net.Data 巨集。 例如, 若巨集呼叫 my_functions() 5 次,且在處理範例中之 MESSAGE 區塊時發現了錯誤 100, 則該程式的輸出如下:
. . . 11 May 1997 $245.45 13 May 1997 $623.23 19 May 1997 $ 83.02 回覆碼 100 訊息 22 May 1997 $ 42.67 總計: $994.37