IBM Books

OS/400 版管理及程式設計指南

定義函數

若要在巨集中定義自己的函數,請使用 FUNCTION 區塊或 MACRO_FUNCTION 區塊:

FUNCTION 區塊
定義可從 Net.Data 巨集呼叫,且由語言環境來處理的次常式。 FUNCTION 區塊必須含有語言陳述式或外部程式的呼叫。

MACRO_FUNCTION 區塊
定義可從 Net.Data 巨集呼叫,且透過 Net.Data 而非語言環境來處理的次常式。 MACRO_FUNCTION 區塊可以含有 HTML 區塊中所容許的任何陳述式。

語法:使用下列語法來定義函數:

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, ...) [RETURNS(return-var)] {
  executable-statements
  report-block
  ...
  report-block
%}

其中:

type
指出架構在起始設定檔中之語言環境。 語言環境會呼叫某個特定的語言處理器 (處理可執行的陳述式), 並提供 Net.Data 和語言處理器之間的標準介面。

function-name
指定 FUNCTION 或 MACRO_FUNCTION 區塊的名稱。 函數呼叫會指定 function-name,它的前面會有一個 @ 符號。有關詳細資料,請參閱"呼叫函數"

您可以使用相同名稱來定義多個 FUNCTION 或 MACRO_FUNCTION 區塊, 以便同時處理它們。每一個區塊皆必須有相同的參數列示。 當 Net.Data 呼叫函數時,相同名稱的所有 FUNCTION 區塊或相同名稱的 MACRO_FUNCTION 區塊,會按它們在 Net.Data 巨集中定義時的次序來執行。

usage
指定參數是輸入 (IN) 參數、輸出 (OUT) 參數、或同時兼具這兩種類型 (INOUT)。 此指定表示參數是否在 FUNCTION 區塊或 MACRO_FUNCTION 區塊或兩者上來回傳遞。用法類型適用於參數列示中所有後續的參數, 直到被另一個用法類型改變為止。 預設類型為 IN。

datatype
參數的資料類型。有些語言環境預期傳遞的參數是資料類型。 例如,當呼叫儲存程序時,SQL 語言環境會預期它們, 這同於呼叫程式時,「直接呼叫」語言環境所預期的一般。請參閱"使用語言環境", 瞭解您正在使用的語言環境的支援資料類型。

parameter
區域變數的名稱,可換成指定於函數呼叫中之相對應引數的值。 例如,可執行之陳述式或 REPORT 區塊中的參數參照 $(parm1), 可換成參數的實際值。 另外,使用該語言的自然語法或當作環境變數使用時, 即可將這些參數傳送至語言環境, 供可執行的陳述式存取。 參數變數參照無法在 FUNCTION 或 MACRO_FUNCTION 區塊外使用。

return-var
請在 RETURNS 關鍵字後指定此參數,來識別特殊的 OUT 參數。 傳回變數的值是在函數區塊中指定的,且它的值會傳回到巨集中呼叫該函數之處。例如,在下列句子中,<p>My name is @my_name().@my_name() 會被傳回變數的值所取代。 如果未設定 RETURNS 子句,函數呼叫的值為:

executable-statements
在取代變數和處理函數之後,傳送至指定語言環境來處理的一組語言陳述式。 executable-statements 可以含有 Net.Data 變數參照與 Net.Data 函數呼叫。

對於 FUNCTION 區塊,Net.Data 會以變數值來置換所有的變數參照、 執行所有的函數呼叫,並在可執行的陳述式傳送至語言環境之前, 以結果值來置換函數呼叫。 每一個語言環境以不同的方式處理陳述式。 有關指定可執行的陳述式或呼叫可執行的程式,請參閱"執行變數"

對於 MACRO_FUNCTION 區塊, 可執行的陳述式是文字和 Net.Data 巨集語言結構的組合。 此情況下,不會包括任何語言環境,因為 Net.Data 扮演語言處理器的角色, 且會處理可執行的陳述式。

report-block
定義一個或多個 REPORT 區塊,來處理 FUNCTION 或 MACRO_FUNCTION 區塊的輸出。 請參閱"報告區塊".

message-block
定義 MESSAGE 區塊,用以處理 FUCNTION 所傳回的任何訊息。 請參閱"訊息區塊"

在 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 區塊定界字元, 請以下列任一方式重寫函數:

訊息區塊

MESSAGE 區塊可讓您決定在順利完成 (或未順利完成) 函數呼叫後, 要如何繼續處理,並且可讓您顯示相關資訊給函數呼叫者。 當處理訊息時,Net.Data 會為呼叫 FUNCTION 區塊的每一個函數, 設定一個語言環境變數 RETURN_CODE。 不會在 MACRO_FUNCTION 區塊的函數呼叫上設定 RETURN_CODE。

MESSAGE 區塊是由一系列的訊息陳述式所組成, 每個陳述式都設有回覆碼值、訊息文字與要執行的動作。 有關 MESSAGE 區塊的語法,請參閱 Net.Data 參考手冊中語言結構一章

MESSAGE 區塊的範圍可以是廣域或區域。若 MESSAGE 區塊是定義在 FUNCTION 區塊中,則對該 FUNCTION 區塊來說其範圍是區域性的。 若它是指定在最外層的巨集上,則 MESSAGE 區塊的範圍是廣域的, 且可供在 Net.Data 巨集中執行的所有函數呼叫使用。 如果您定義多個廣域 MESSAGE 區塊,則會採用最近一次定義的。

Net.Data 會採用下列的規則,來處理從某函數呼叫所傳回的 RETURN_CODE 變數之值:

  1. 檢查區域 MESSAGE 區塊是否有完全相符的;然後根據所指定的,看是要跳出或繼續。
  2. 如果 RETURN_CODE 不是 0,請檢查區域 MESSAGE 區塊是否為 +default-default; 然後根據所指定的,看是要跳出或繼續,不過得視 RETURN_CODE 的符號而定。
  3. 若 RETURN_CODE 不為 0,則檢查區域 MESSAGE 區塊是否為預設值,然後根據所指定的,看是要跳出或繼續。
  4. 檢查廣域 MESSAGE 區塊是否有完全相符的;然後根據所指定的,看是要跳出或繼續。
  5. 若 RETURN_CODE 不為 0,則根據 RETURN_CODE 的符號, 檢查廣域 MESSAGE 區塊是否為 +default-default,然後依指定跳出或繼續。
  6. 若 RETURN_CODE 不為 0,則檢查廣域 MESSAGE 區塊是否為 default,然後依指示跳出或繼續。
  7. 若 RETURN_CODE 不為 0,則發出 Net.Data 內部預設的訊息並跳出。

下列範例顯示一部份 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 會以下列順序來處理錯誤:

  1. 檢查區域 MESSAGE 區塊中是否有完全相符的。
  2. 檢查區域 MESSAGE 區塊中是否為 +default
  3. 檢查區域 MESSAGE 區塊中是否為 default
  4. 檢查廣域 MESSAGE 區塊中是否有完全相符的。
  5. 檢查廣域 MESSAGE 區塊中是否為 +default

當 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


[ 頁面頂端 | 前一頁 | 下一頁 | 目錄 | 索引 ]