管理及程式設計指南

定義函數

若要在巨集中定義自己的函數,請使用 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, ...)  {
  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 函數呼叫。 executable-statements 包括 HTML 區塊中所容許的那些可執行的陳述式。

對於 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 區塊的範圍是廣域的, 且可供在 Net.Data 巨集中執行的所有函數呼叫使用。 如果您定義多個廣域 MESSAGE 區塊,則會採用最近一次定義的。 不過,若 MESSAGE 區塊定義於 FUNCTION 區塊, 那麼,對 FUNCTION 區塊來說 MESSAGE 區塊是區域區塊 (除了 Net.Data 內建函數以外,由廣域訊息區塊處理它的錯誤)。

Net.Data 使用這些規則從函數呼叫處理 RETURN_CODE 或 SQL_STATE 變數值:

  1. 檢查區域 MESSAGE 區塊是否有 RETURN_CODE 或 SQL_STATE 值的完全相符;依指定結束或繼續。
  2. 若此值不是 0,檢查區域 MESSAGE 區塊是否有 +default-default;根據值的正負號而定,依指定結束或繼續。
  3. 若此值不是 0,檢查區域 MESSAGE 區塊是否有 default;依指定結束或繼續。
  4. 檢查廣域 MESSAGE 區塊是否有 RETURN_CODE 或 SQL_STATE 的完全相符;依指定結束或繼續。
  5. 若此值不是 0,檢查廣域 MESSAGE 區塊是否有 +default-default;根據此值的正負號而定,依指定結束或繼續。
  6. 若此值不是 0,檢查廣域 MESSAGE 區塊是否有 default,依指定結束或繼續。
  7. 若此值不是 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.cmd %}
  %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


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