若要在巨集檔案中定義自己的函數,請使用 FUNCTION 區塊或 MACRO_FUNCTION 區塊。
MACRO_FUNCTION 區塊是可以改善執行效能的 FUNCTION 區塊的替代區塊。 MACRO_FUNCTION 區塊僅是由 Net.Data 來處理,且不會呼叫語言環境。 關於這兩個結構的詳細資訊在 Net.Data 參考手冊中可找到。
語法:使用下列語法來定義函數:
FUNCTION 區塊:
%FUNCTION(type) function-name(usage 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
%}
其中:
Net.Data 會提供幾個預設的語言環境。
您可以使用相同名稱來定義多重 FUNCTION 或 MACRO_FUNCTION 區塊, 以便同時處理。 每一個區塊皆必須有相同的參數列示。 當 Net.Data 呼叫函數時, 相同名稱的所有 FUNCTION 區塊或相同名稱的 MACRO_FUNCTION 區塊,會以定義於 Net.Data 巨集中的次序來執行。
對於 FUNCTION 區塊,Net.Data 會以變數值來置換所有的變數參照、 執行所有的函數呼叫,並在可執行的陳述式傳送至語言環境之前, 以結果值來置換函數呼叫。 每一個語言環境以不同的方式處理陳述式。 有關指定可執行的陳述式或呼叫可執行的程式,請參閱執行變數。
對於 MACRO_FUNCTION 區塊, 可執行的陳述式是 HTML 陳述式和 Net.Data 巨集語言結構的組合。 此情況下,不會呼叫任何語言環境,因為 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 bynumber keys $(percent_openbrace) $Rtitles{$num} }) {
&make_links($Rtitles{$num}{$num_words});
}
...
%}
MESSAGE 區塊可讓您決定在順利完成 (或未順利完成) 函數呼叫後, 要如何繼續處理,並且可讓您顯示相關資訊給函數呼叫者。 Net.Data 使用下列訊息區塊處理:
MESSAGE 區塊是由一系列的訊息陳述式所組成, 每個陳述式都設有回覆碼值、訊息文字與要執行的動作。 有關 MESSAGE 區塊的語法,請參閱 Net.Data 參考手冊中語言結構一章。
MESSAGE 區塊的範圍可以是廣域或區域。若 MESSAGE 區塊是定義在 FUNCTION 區塊中,則對該 FUNCTION 區塊來說其範圍是區域性的。 若它是指定在最外層的巨集上,則 MESSAGE 區塊的範圍是廣域的, 且可供在 Net.Data 巨集中執行的所有函數呼叫使用。 如果您定義多個廣域 MESSAGE 區塊,則會採用最近一次定義的。
Net.Data 會採用下列的規則,來處理從某函數呼叫所傳回的 RETURN_CODE 變數之值:
下列範例顯示一部份 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.mbr %}
%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