本章說明使用在 Net.Data 巨集檔中的語言結構。
每一個語言結構說明,都有下列資訊:
下列是用於巨集中的結構;關於語法及範例的詳細資訊,請參閱每一個結構說明。
目的
替 Net.Data 巨集的函數製作文件。因為 COMMENT 區塊可以使用在巨集檔中任何地方, 所以沒有在其他語法圖內製作文件。
語法
>>-%{---本文---%}----------------------------------------------><
值
上下文
備註可以放置在一個 Net.Data 巨集中任何兩個 Net.Data 語言結構之間。
限制
接受任何本文或字元;但是備註區塊不可為巢狀。
範例
範例 1:基本備註區塊
%{
這是備註區塊。不限制行數及字元。Net.Data 不處理它的內容。
%}
範例 2: FUNCTION 區塊中的備註
%function(DTW_REXX) getAddress(IN name, %{ 客戶名稱 %}
IN phone, %{ 客戶電話號碼 %}
OUT address %{ 客戶地址 %}
)
{
....
%}
範例 3:HTML 區塊中的備註
%html(report) {
%{ 執行查詢並儲存結果於表格 %}
@myQuery(resultTable)
%{ 建置套表以顯示一頁資料 %}
<form method="POST" action="report">
%{ 傳送表格給 REXX 函數,以傳送資料輸出 %}
@displayRows(START_ROW_NUM, submit, resultTable, RPT_MAX_ROWS)
%{ 將 START_ROW_NUM 作為隱藏變數傳給下一筆呼叫 %}
<input name="START_ROW_NUM" type="hidden" value="$(START_ROW_NUM)">
%{ 建置下一個或前一個按鈕 %}
%if (submit == "both" || submit == "next_only")
<input name="submit" type="submit" value="next">
%endif
%if (submit == "both" || submit == "prev_only")
<input name="submit" type="submit" value="previous">
%endif
</form>
%}
範例 4: DEFINE 區塊中的備註
%define {
START_ROW_NUM = "1" %{ 輸出表格的起始列列號 %}
RPT_MAX_ROWS = "25" %{ 表格列數的最大值 %}
resultTable = %table %{ 保留查詢結果的表格 %}
%}
目的
DEFINE 區段在巨集中的宣告部份定義變數名稱, 可以是陳述式或是區塊。
變數定義使用雙引號 (""),可以在單一行, 或使用大括弧加上百分比符號 ({ %}),可以分成多行。 定義了變數之後,您可以在巨集的任何地方參考它。
語法
>>-%DEFINE----+----------------------------+-------------------->
| (1) |
'-(--+-STATIC---------+---)--'
| (1) |
'-TRANSIENT------'
>-----+-| 定義登錄 |---------------------------+---------------><
'-{--+---------------------------+---%}--'
| .---------------------. |
| V | |
'----+-定義登錄-------+--+--'
'-include 陳述式-'
定義登錄
.----------------.
V |
|---+-變數名稱--=--+-"-----+----------+--+---"---+-+------------|
| | +-字串-----+ | |
| | +-變數參照-+ | |
| | '-函數呼叫-' | |
| | .----------------. | |
| | V | | |
| +-{-----+----------+--+---%}--+ |
| | +-字串-----+ | |
| | +-變數參照-+ | |
| | +-函數呼叫-+ | |
| | '-換行-----' | |
| +-exec 陳述式-----------------+ |
| +-table 陳述式----------------+ |
| +-envvar 陳述式---------------+ |
| +-| 條件式變數 |--------------+ |
| '-| 縮寫的條件式變數 |--------' |
'-列示陳述式-----------------------------------'
條件式變數
.----------------.
V |
|---+-----------+--?----+-"-----+----------+--+---"---+--------->
'-變數名稱--' | +-字串-----+ |
| +-變數參照-+ |
| '-函數呼叫-' |
| .----------------. |
| V | |
'-{-----+----------+--+---%}--'
+-字串-----+
+-變數參照-+
'-函數呼叫-'
>-----+------------------------------------+--------------------|
| .----------------. |
| V | |
'-:--+-"-----+----------+--+---"---+-'
| +-字串-----+ |
| +-變數參照-+ |
| '-函數呼叫-' |
| .----------------. |
| V | |
'-{-----+----------+--+---%}--'
+-字串-----+
+-變數參照-+
'-函數呼叫-'
縮寫的條件式變數
.----------------.
V |
|---?----+-"-----+----------+--+---"---+------------------------|
| +-字串-----+ |
| +-變數參照-+ |
| '-函數呼叫-' |
| .----------------. |
| V | |
'-{-----+----------+--+---%}--'
+-字串-----+
+-變數參照-+
'-函數呼叫-'
註:
值
上下文
DEFINE 區塊或陳述式必須在巨集的 IF 區塊之內,或在 Net.Data 巨集宣告部份的其他區塊之外。
限制
%DEFINE var = "The value is $(var)."
範例
範例 1:簡式變數定義
%DEFINE var1 = "orders" %DEFINE var2 = "$(var1).html"
執行時,變數參照 $(var2) 被運算為 orders.html。
範例 2:字串內含雙引號
%DEFINE hi = "say ""hello""" %DEFINE empty = ""
顯示時,變數 hi 的值為 say "hello"。 變數 empty 是空值。
範例 3: 多重變數的定義
%DEFINE{ DATABASE = "testdb"
home = "http://www.software.ibm.com"
SHOWSQL = "YES"
PI = "3.14150"
%}
範例 4:變數的多行定義
%DEFINE text = {This variable definition
spans two lines
%}
範例 5:這個條件式變數的範例示範 如果結果值不包含任何 NULL 值時,變數 var 如何取用 引號 ("") 內的結果值。
%DEFINE var = ? "Hello! $(V)@MyFunc()" %}
目的
定義一個變數為 DEFINE 區塊中的環境變數。 當參考 ENVVAR 變數時,Net.Data 以相同名稱傳回 環境變數的現行值。使用這個方法來參考環境變數 比使用 DTW_GETENV 更有效率。 有關 DTW_GETENV 的詳細資訊,請參閱DTW_GETENV。
語法
>>-%ENVVAR-----------------------------------------------------><
上下文
ENVVAR 陳述式可以在 DEFINE 區塊或陳述式中。
值
限制
ENVVAR 陳述式不可以包含其他元素。
範例
範例 1:在本例中,ENVVAR 定義一變數, 此變數被參考到時會傳回現行值給環境變數 SERVER_SOFTWARE,亦即 Web 伺服器名稱。
%DEFINE SERVER_SOFTWARE = %ENVVAR
%HTML(REPORT) {
伺服器是 $(SERVER_SOFTWARE)。
%}
目的
當參考變數或呼叫函數時,指定一個執行的外部程式名稱。
當 Net.Data 在巨集檔中發現一個執行變數時, 它會使用下列方法尋找被參考到的可執行的程式:
授權要訣: 確定 Web 伺服器具有存取權, 可以使用任何被 EXEC 陳述式或區塊所參考到的檔案。 有關設定 Web 伺服器使用 Net.Data 檔案之存取權的詳細資料, 請參閱 Net.Data 管理及程式設計指南中的架構章節部分。
EXEC 陳述式及區塊用於兩個不同的上下文,二者的語法不同, 視使用位置而定。 EXEC 陳述式用於 DEFINE 區塊,EXEC 區塊用於 FUNCTION 區塊。
語法
EXEC 陳述式用於 DEFINE 區塊:
.----------------.
V |
>>-%EXEC------"-----+----------+--+---"------------------------><
+-字串-----+
+-變數參照-+
'-函數呼叫-'
EXEC 區塊語法用於 FUNCTION 區塊:
.---------------.
V |
>>-%EXEC------{----+-字串-----+--+---%}------------------------><
+-變數參照-+
'-函數呼叫-'
值
上下文
在這些上下文中可找到 EXEC 區塊或陳述式:
限制
EXEC 區塊或陳述式可以包含這些元素:
範例
範例 1:被變數參考的可執行檔
%DEFINE mycall = %EXEC "MYEXEC.EXE $(empno)"
%HTML (report){
<P>這是您要求的的報告:
<HR>$(mycall)
%}
這個範例會針對每次對變數 mycall 的參照而執行 MYEXEC.EXE。
範例 2:被函數參考的可執行檔
%FUNCTION(DTW_REXX) my_rexx_pgm(INOUT a, b, IN c, INOUT d){
%EXEC{ mypgm.cmd 這是測試 %}
%}
當函數 my_rexx_pgm 被呼叫時,這個範例執行 mypgm.cmd。
目的
定義 Net.Data 從巨集檔呼叫來的次常式。 FUNCTION 區塊中的可執行檔陳述式,可以包含直接由語言環境解譯過來的語言陳述式, 也可以指示呼叫外部程式。
如果您在 FUNCTION 區塊中使用的 EXEC 區塊, 它必須是 FUNCTION 區塊中的唯一可執行檔陳述式。將可執行檔陳述式傳給語言環境之前, Net.Data 把 EXEC 陳述式中的程式檔案名稱, 附加到起始設定檔之 EXEC_PATH 架構陳述式決定的路徑名稱中。最後將產生的字串,傳給要執行的語言環境。
語言環境處理 EXEC 區塊時使用的方法, 取決於該個特定語言環境。僅有 REXX、系統、以及 Perl Net.Data 所支援的語言環境,支援 EXEC 區塊。
當符合 Net.Data 語言結構語法的字元於函數區塊的語言陳述式區段中使用, 作為語法有效的內含程式碼 (如 REXX 或 Perl) 的一部份時, 可能會將它們誤譯為 Net.Data 語言結構,而導致在巨集內發生錯誤或無法預測的結果。
例如,Perl 函數必須使用 COMMENT 區塊定界字元 (%{)。當執行巨集時, %{ 字元會被解譯為 COMMENT 區塊的開頭。然後,Net.Data 會尋找 COMMENT 區塊的尾端, 所以當它讀取函數區塊的尾端時,它會認為找到 COMMENT 區塊的尾端。Net.Data 隨後會繼續尋找函數區塊的尾端, 當它找不到時,便會發出錯誤。
請使用下列一種方法,使用 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});
}
...
%}
語法
>>-%FUNCTION--(--語言環境--)--函數名稱--| 參數傳送規格 |-------->
.-;------------------------------------.
>-----+-| 傳回規格 |--{--| 函數本體 |----%}--+-----------------><
參數傳送規格
|---(--+-----------------------------+---)----------------------|
| .-,---------------------. |
| | (1) | |
| V .-IN-------. | |
'----+----------+---名稱---+--'
+-OUT------+
'-INOUT----'
傳回規格
|---+----------------------+------------------------------------|
'-RETURNS--(--名稱--)--'
函數本體
|---+-----------------------+----------------------------------->
| .------------------. |
| V | |
+----列入陳述式區塊---+-+
'-exec 區塊-------------'
>-----+--------------------------------------+------------------|
| .-----------------. |
| V (2) | |
+----報告區塊--------+---+-----------+-+
| '-訊息區塊--' |
| .----------------------. |
| V | |
'-訊息區塊-----+----------------+--+---'
| (2) |
'-報告區塊-------'
註:
值
上下文
在這些上下文中可找到 FUNCTION 區塊:
限制
FUNCTION 區塊可以包含這些元素:
僅有 REXX、系統、以及 Perl Net.Data 所支援的語言環境,支援 EXEC 區塊。
範例
下面是一般範例,並未涵蓋所有的語言環境。 有關在特定的語言環境中使用 FUNCTION 區塊的詳細資訊,請參閱 Net.Data 語言環境參考手冊。
範例 1:REXX 子字串函數
%DEFINE lstring = "longstring"
%FUNCTION(DTW_REXX) substring(IN x, y, z) RETURNS(s) {
s = substr("$(x)", $(y), $(z));
%}
%DEFINE a = {@substring(lstring, "1", "4")%} %{ assigns "long" to a %}
在求 a 的值時, 找到 @ 子字串函數呼叫並執行子字串 FUNCTION 區塊。FUNCTION 區塊中的可執行陳述式會被置換, 然後字串 s = substr("longstring", 1, 4) 被傳送到 REXX 直譯器執行。 因為指定了 RETURNS 子句,所以 @子字串指定的值在 a 的運算式中被置換成"long", 即為 s 的值。
範例 2:呼叫外部 REXX 程式
%FUNCTION(DTW_REXX) my_rexx_pgm(INOUT a, b, IN c, OUT d) {
%EXEC{ mypgm.cmd 這是測試 %}
%}
%HTML(INPUT) {
<P> 原始變數值:$(w) $(x) $(z)
<P> @my_rexx_pgm(w, x, y, z)
<P> 已修改之變數值:$(w) $(x) $(z)
%}
變數 w 與 x 對應至函數中的 INOUT 參數 a 與 b。 它們的值與對應至 IN 參數 c 的值 y, 應已從 HTML 表格輸入或 DEFINE 陳述式定義。變數 a 與 b 在參數 a 與 b 傳回值時, 會被指定新值。當 OUT 參數 d 傳回一個值時,即定義了變數 z。
/* 範例 2 */ /* 測試引數 */ num_args = arg(); say '有' num_args '個引數'; do i = 1 to num_args; say '引數' i '是"'arg(i)'"' end; /* 設定 Net.Data 傳來的變數 */ d = a || b || c; /* 連結 a, b, c 形成 d */ a = ''; /* 重設 a 為空字串 */ b = ''; /* 重設 b 為空字串 */ return;
有 1 引數 引數 1 是 "這是測試"
EXEC 陳述式告訴 REXX 語言環境去通知 REXX 直譯器開始執行外部 REXX 程式 mypgm.cmd。因為 REXX 語言環境可以直接與 REXX 程式共用 Net.Data 變數, 所以由它在執行 mypgm.cmd 前,會指定 REXX 變數 a、 b 及 c 為 Net.Data 變數 w、x 及 y 的值。mypgm.cmd 可以直接在 REXX 陳述式中使用變數 a、 b 及 c。當程式終止時,REXX 變數 a、b 及 d 從 REXX 程式取回, 它們的值被指定給 Net.Data 變數 w、 x 及 z。 因為 RETURNS 子句沒有被用在 my_rexx_pgm FUNCTION 區塊的定義之內, 所以 @my_rexx_pgm 函數呼叫的值為空字串,"", (如果回覆碼為 0) 或為 REXX 程式回覆碼 (如果回覆碼不是零)。
範例 3:SQL 查詢及報告
%FUNCTION(DTW_SQL) query_1(IN x, IN y) {
SELECT customer.num, order.num, part.num, status
FROM customer, order, shippingpart
WHERE customer.num = '$(x)'
AND customer.ordernumber = order.num
AND order.num = '$(y)'
AND order.partnumber = part.num
%REPORT{
<P>這是您的訂購狀態:
<P>$(NLIST)
<UL>
%ROW{
<LI>$(V1) $(V2) $(V3) $(V4)
%}
</UL>
%}
%}
%DEFINE customer_name="IBM"
%DEFINE customer_order="12345"
%HTML(REPORT) {
@query_1(customer_name, customer_order)
%}
@query_1 函數呼叫在 SELECT 陳述式中以 IBM 取代 $(x),以 12345 取代 $(y)。 因為 SQL 函數 query_1 的定義中沒有定義輸出表格變數, 所以使用預設的表格(有關詳細資料, 請參閱 TABLE 表格區塊)。REPORT 區塊中參照的 NLIST 及 Vi 變數, 是由預設的表定義所定義。REPORT 區塊產生的報告被放置在呼叫 query_1 函數的輸出 HTML。
範例 4:執行 Perl script 的系統呼叫
%FUNCTION(DTW_SYSTEM) today() RETURNS(result) {
%exec{ perl "today.prl" %}
%}
%HTML(INPUT) {
@today()
%}
$date = `date`;
chop $date;
open(DTW, "> $ENV{DTWPIPE}") || die "無法開啟: $!";
print DTW "result = \"$date\"\n";
「系統」語言環境解譯 FUNCTION 區塊中的可執行檔陳述式時, 是經由 C 語言 system() 函數呼叫,傳給作業系統。 這個方法無法向 REXX 語言環境般,直接向可執行檔陳述式傳收 Net.Data 變數。 「系統」語言環境是以下列方法傳收變數:
遇到 @today 函數呼叫時, Net.Data 將對可執行檔陳述式進行變數替代。本例的可執行檔陳述式中沒有 Net.Data 變數, 所以不替代變數。可執行檔陳述式及參數傳給「系統」語言環境後, 此語言環境立即建立一個具名管線,並將環境變數 DTWPIPE 設定為具名管線。
然後,再以 C system() 函數呼叫,呼叫外部程式。外部程式以唯寫方式開啟管路, 再以標準資料流檔的方式將輸出參數的值寫入管路中。外部程式藉由寫入 STDOUT 產生 HTML 輸出。本例將系統日期程式的輸出, 指定至 FUNCTION 區塊 RETURNS 子句識別的變數結果中。 結果變數的這個值,則會置換 HTML 區塊中的 @today() 函數呼叫。
範例 5:Perl 語言環境
%FUNCTION(DTW_PERL) today() RETURNS(result) {
$date = `date`;
chop $date;
open(DTW, "> $ENV{DTWPIPE}") || die "無法開啟: $!";
print DTW "result = \"$date\"\n";
%}
%HTML(INPUT) {
@today()
%}
您可以比較本例與「範例 4」中 EXEC 陳述式的使用方式。 範例 4 的「系統」語言環境不瞭解如何解譯 Perl 程式,但知道如何呼叫外部程式。 EXEC 陳述式要它以外部程式的方式呼叫 perl 程式。 實際的 Perl 語言陳述式,是由外部 Perl 程式解譯。 範例 5 的 Perl 語言環境可以直接解譯 Perl 語言陳述式,所以沒有 EXEC 陳述式。
目的
呼叫一個先前定義的 FUNCTION 或 MACRO_FUNCTION 區塊, 或具有指定引數的內建函數。 如果該函數不是內建函數,您必需先在 Net.Data 巨集定義函數後,才能指定函數呼叫。
語法
>>-@函數名稱---(----+--------------------------------+--)------><
| .-,-------------------------. |
| V | |
'----+-變數名稱-------------+--+-'
'-"--+-字串-----+---"--'
+-變數參照-+
'-函數呼叫-'
值
上下文
在這些上下文中可找到函數呼叫:
限制
範例
範例 1:呼叫結構化查詢語言函數 formQuery
%FUNCTION(DTW_SQL) formQuery(){
SELECT $(queryVal) from $(tableName)
%}
%HTML (input){
<P>想察看 $(tableName) 的哪些直欄?
<FORM METHOD="POST" ACTION="report">
<INPUT NAME="queryVal" TYPE="CHECKBOX" VALUE="NAME">Name
<INPUT NAME="queryVal" TYPE="CHECKBOX" VALUE="MAIL">E-mail
<INPUT NAME="queryVal" TYPE="CHECKBOX" VALUE="FAX">FAX
<INPUT TYPE="SUBMIT" VALUE="Submit request">
%}
%HTML (report){
<P>這些是您所選取的直欄:
<HR>@formQuery()
%}
範例 2:以輸入及輸出參數呼叫 REXX 函數
%FUNCTION(DTW_REXX) my_rexx_pgm(INOUT a, b, IN c, OUT d) {
%EXEC{ mypgm.cmd 這是測試 %}
%}
%HTML(INPUT) {
<P> 原始變數值:$(w) $(x) $(z)
<P> @my_rexx_pgm(w, x, y, z)
<P> 已修改之變數值:$(w) $(x) $(z)
%}
範例 3: 以使用變數參照及函數呼叫的輸入參數呼叫 REXX 函數
%FUNCTION(DTW_REXX) my_rexx_pgm(IN a, b, c, d, OUT e) {
...
%}
%HTML(INPUT){
<p> @my_rexx_pgm($(myA), @getB(), @retrieveC(), $(myD), myE)
%}
目的
包含任何將被從屬站的 Web 瀏覽器或任何可辨識 HTML 的工具所處理的 HTML 標籤或本文。HTML 區塊中也有大部份的 Net.Data 巨集語言陳述式, 這些陳述式在執行時被求值及執行。Net.Data 尋找 Net.Data 巨集陳述式並執行它們。 Net.Data 假設所有其他的本文皆為 HTML,並將它送給 Web 瀏覽器。
語法
.--------------------------.
V |
>>-%HTML----(--名稱--)----{-----+--------------------+--+---%}--><
+-exec_sql 陳述式----+
+-變數參照-----------+
+-if 區塊------------+
+-函數呼叫-----------+
+-HTML 陳述式--------+
+-include 陳述式-----+
+-include_url 陳述式-+
'-while 區塊---------'
值
上下文
在這些上下文中可找到 HTML 區塊:
限制
HTML 區塊可以包含這些元素:
範例
範例 1:帶有標題及表尾之併入檔的 HTML 區塊
%HTML(example1){
%INCLUDE"header.html"
<P>您可以放置<EM>任何</EM> HTML 於 HTML 區塊中。
SQL 函數呼叫大致如下:
@xmp1()
%INCLUDE"footer.html"
%}
範例 2:包含句點的 HTML 區塊名稱
%HTML(my.report){
%INCLUDE"header.html"
<P>您可以放置<EM>任何</EM> HTML 於 HTML 區塊中。
SQL 函數呼叫大致如下:
@xmp1()
%INCLUDE"footer.html"
%}
執行條件字串處理。 IF 區塊提供測試一或多個條件的能力, 然後基於條件測試的結果執行一區塊的陳述式。 您可以在 Net.Data 巨集內宣告部份、HTML 區塊、MACRO_FUNCTION 區塊、 REPORT 區塊、WHILE 區塊及 ROW 區塊中使用 IF 區塊,亦可 在另一個 IF 區塊內建立巢狀。
條件列示中的字串值, 如果是代表整數且前端或尾端沒有白色空間時,將被作為數字來比較。 它們可以有單一加號 (+) 或減號 (-) 置於前端。
限制: Net.Data 不支援非整數數字的小數比較,如,浮點數。
巢狀 IF 區塊: IF 區塊語法的規則 由巨集檔中區塊的位置決定。如果 IF 區塊在宣告部份任何其他區塊之外的 IF 區塊之中建立巢狀, 則其之外區塊能使用的任何元素它也可以使用。如果 If 區塊在一個 IF 區塊中的其他區塊之中建立巢狀,則它依循所在之區塊的語法規則。
在下列範例,巢狀 IF 區塊必須遵循當它在 HTML 區塊之中時的規則。
%IF 區塊
...
%HTML 區塊
...
%IF 區塊
請參閱在這個章節隨後所列的限制。
語法
>>-%IF--| 條件列示 |-------------------------------------------->
>-----| 陳述式區塊 |--| else_if 規格 |--%ENDIF-----------------><
條件列示
|---(--+-(--條件列示--)----------+---)--------------------------|
+-條件列示--&&--條件列示--+
+-條件列示--||--條件列示--+
+-!--條件列示-------------+
+-| 條件 |----------------+
'-| 詞彙 |----------------'
陳述式區塊
.--------------------------------.
V |
|------+--------------------------+--+--------------------------|
| (1) |
+-define 區塊--------------+
| (1) |
+-define 陳述式------------+
| (2) |
+-exec_sql 陳述式----------+
| (1) |
+-函數區塊-----------------+
+-函數呼叫-----------------+
| (1) |
+-HTML 區塊----------------+
| (2) |
+-HTML 陳述式--------------+
+-if 區塊------------------+
+-include 陳述式-----------+
+-include_url 陳述式-------+
| (1) |
+-macro_function 區塊------+
| (1) |
+-訊息區塊-----------------+
| (2) |
+-字串---------------------+
| (2) |
+-變數參照-----------------+
| (2) |
'-while 區塊---------------'
條件
|---詞彙--+-<--+---詞彙-----------------------------------------|
+->--+
+-<=-+
+->=-+
+-!=-+
'-==-'
詞彙
|---+-變數名稱-------------+------------------------------------|
'-"--+-字串-----+---"--'
+-變數參照-+
'-函數呼叫-'
else_if 規格
|---+----------------------------------------------------+------|
| .-----------------------------------------. |
| V | |
'--+----%ELIF--(--條件列示--)--| 陳述式區塊 |---+-+--'
'-%ELSE--| 陳述式區塊 |------------------------'
註:
值
如果其中一個條件非真,則執行一般字串比較。
上下文
在這些上下文中可找到 IF 區塊:
限制
當 IF 區塊位於巨集的宣告部份中任何其他區塊之外時, 可以包含這些元素。
當 IF 區塊位於 HTML 區塊、MACRO_FUNCTION 區塊、REPORT 區塊 或 WHILE 區塊中時,可以包含這些元素。
範例
範例 1:Net.Data 巨集宣告部份中的 IF 區塊
%DEFINE a = "1"
%DEFINE b = "2"
...
%IF ($(DTW_HTML_TABLE) == "YES")
%define OUT_FORMAT = "HTML"
%ELSE
%define OUT_FORMAT = "CHARACTER"
%ENDIF
%HTML(REPORT){
...
%}
範例 2: HTML 區塊內的 IF 區塊
%HTML(REPORT){
@myFunctionCall()
%IF ($RETURN_CODE) == $(failure_rc))
<P> 函數呼叫失敗,其回覆碼為 $(RETURN_CODE)。
%ELIF ($(RETURN_CODE) == $(warning_rc))
<P> 函數呼叫繼續,其警告碼為 $(RETURN_CODE)。
%ELIF ($(RETURN_CODE) == $(success_rc))
<P>函數呼叫順利完成。
%ELSE
P>函數呼叫傳回不明回覆碼 $(RETURN_CODE)。
%ENDIF
%}
範例 3: 數字比較
%IF (ROW_NUM < "100")
<p>表格尚未填滿...
%ELIF (ROW_NUM == "100")
<p>表格已滿...
%ELSE
<p>表格溢位...
%ENDIF
數字比較之所以能完成是 由於隱含的表格變數 ROW_NUM 總是傳回整數值, 且這個被比較的值也是整數。
範例 4: 巢狀 IF 區塊
%IF (MONTH == "January")
%IF (DATE = "1")
新年快樂!
%ELSE
哈,又是另一天。
%ENDIF
%ENDIF
目的
讀取且納入檔案到指定陳述式的 Net.Data 巨集中。
Net.Data 在起始設定檔 INCLUDE_PATH 陳述式指定的目錄中,尋找併入檔。
您併入檔的使用方式,可以與大部份的高階語言相同。 您可以插入共用標題及註腳、定義共用變數設定、 或將 FUNCTION 區塊定義的共用次常式程式庫納入 Net.Data 巨集中。
只有在處理巨集並插入參考檔案內容在巨集檔中 INCLUDE 陳述式的位置時, Net.Data 才會執行 INCLUDE 陳述式。 分析參考檔案名稱的任何變數參照的時刻 最先是在執行 INCLUDE 陳述式時, 而不是在執行參考檔案內容時。
當 INCLUDE 陳述式位於 ROW 或 WHILE 區塊中時, Net.Data 不會重複執行 INCLUDE 陳述式。Net.Data 第一次執行 ROW 或 WHILE 區塊時會執行 INCLUDE 陳述式, 納入參考檔案內容到區塊,然後用參考檔案內容重複執行 ROW 或 WHILE 區塊。
授權要訣:確定 Net.Data 執行時所用的使用者 ID, 有權存取 INCLUDE 陳述式所參照的任何檔案。有關設定 Web 伺服器使用 Net.Data 檔案之存取權的詳細資料, 請參閱 Net.Data 管理及程式設計指南中的架構章節部分。
要訣: 如果您要從一個區域 Web 伺服器併入 HTML 檔案, 可使用如範例 3 所顯示的 INCLUDE_URL 結構。 只要使用示範的語法,您就不須更新 Net.Data 起始設定檔案中的 INCLUDE_PATH, 去設定 Web 伺服器已經知道的目錄。
語法
.---------------.
V |
>>-%INCLUDE----"----+-字串-----+--+---"------------------------><
'-變數參照-'
值
上下文
在這些上下文中可找到 INCLUDE 陳述式:
限制
INCLUDE 陳述式可以包含這些元素:
不容許字串中的函數呼叫。
範例
範例 1:HTML 區塊中的 INCLUDE 陳述式
%HTML(start){
%INCLUDE "header.hti"
...
%}
範例 2:REPORT 區塊中的 INCLUDE 陳述式
%REPORT {
%INCLUDE "report_header.txt"
%ROW {
%INCLUDE "row_include.txt"
%}
%INCLUDE "report_footer.txt"
%}
範例 3: INCLUDE 陳述式中的變數參照
%define library = "/qsys.lib/mylib.lib/" %define filename = "macros.file/incfile.mbr" %include "$(library)$(filename)"
目的
讀取並納入另一個檔案到指定此陳述式的 Net.Data 輸出結果中。 指定的檔案,可能在區域或遠端伺服器中。
使用 INCLUDE_URL 陳述式,您可以從一個巨集呼叫另一個巨集,而不須應用程式使用者選取「提出」按鈕。
只有在處理巨集並插入參考檔案內容在巨集檔中 INCLUDE_URL 陳述式的位置時, Net.Data 才會執行 INCLUDE_URL 陳述式。 分析參考檔案名稱的任何變數參照的時刻 最先是在執行 INCLUDE_URL 陳述式時, 而不是在執行參考檔案內容時。
當 INCLUDE_URL 陳述式位於 ROW 或 WHILE 區塊中時, Net.Data 不會重複執行 INCLUDE_URL 陳述式。Net.Data 第一次執行 ROW 或 WHILE 區塊時會執行 INCLUDE_URL 陳述式, 納入參考檔案內容到區塊,然後用參考檔案內容重複執行 ROW 或 WHILE 區塊。
語法
.---------------.
V |
>>-%INCLUDE_URL---"------+-字串-----+--+--"--------------------><
'-變數參照-'
值
上下文
在這些上下文中可找到 INCLUDE_URL 陳述式:
限制
INCLUDE_URL 陳述式可以包含這些元素:
INCLUDE_URL 檔案有下列檔案大小限制:
INCLUDE_URL 沒有 在 OS/400 環境中受支援。
範例
範例 1:從另一個伺服器併入 HTML 檔案
%include_url "http://www.ibm.com/path/myfile.html"
範例 2:藉由呼叫遠端伺服器名稱從該伺服器併入 HTML 檔案
%include_url "myserver/path/myfile.html"
其中 myserver 即為伺服器名稱。
範例 3:從區域 Web 伺服器併入 HTML 檔案
%include_url "/path/myfile.html"
要訣: 只要使用這個方法,您就不須更新 Net.Data 架構檔中的 INCLUDE_URL 路徑,去設定 Web 伺服器已經知道的目錄。如果字串 不是以斜線開始,Net.Data 會假設該字串是一個伺服器名稱, 並嘗試用對應的名稱從伺服器取回檔案。
範例 4:從遠端伺服器併入其他 Net.Data 巨集
%REPORT{
<P>現行新選擇為 @DTW_rTIME():
%include_url "http://www.ibm.com/cgi-bin/db2www/hotpic.mac/report?custno=$(custno)"
在這個範例中, 巨集檔 hotpic.mac 被呼叫而 custno 被作為變數傳送。如果字串是以斜線開始, 則 Net.Data 將從區域 Web 伺服器取回 INCLUDE 檔案。
目的
建置一個定界限的值列示。當您用多重項目建立結構 SQL 查詢時,可以使用 LIST 陳述式, 就像某些 WHERE 或 HAVING 子句一般。
語法
.----------------.
V |
>>-%LIST--"-----+----------+--+---"----變數名稱----------------><
+-字串-----+
+-變數參照-+
'-函數呼叫-'
值
上下文
在這些上下文中可找到 LIST 陳述式:
限制
LIST 陳述式可以包含這些元素:
範例
範例 1:變數列示
%DEFINE{
DATABASE="custcity"
%LIST " OR " conditions
conditions="cond1='Sao Paolo'"
conditions="cond2='Seattle'"
conditions="cond3='Shanghai'"
whereClause=conditions ? "WHERE $(conditions)" : ""
%}
目的
定義一個可以從 Net.Data 巨集呼叫的次常式。 在 MACRO_FUNCTION 區塊中的可執行的陳述式必須是 Net.Data 巨集語言來源陳述式。
語法
>>-%MACRO_FUNCTION--函數名稱--| 參數傳送規格 |------------------>
.----------------------.
V |
>-----{--| 函數本體 |-------+----------------+--+--%}----------><
| (3) |
'-報告區塊-------'
參數傳送規格
|---(--+-----------------------------+---)----------------------|
| .-,---------------------. |
| | (1) | |
| V .-IN-------. | |
'----+----------+---名稱---+--'
+-OUT------+
'-INOUT----'
函數本體
.-------------------------------.
V |
|------+-------------------------+--+---------------------------|
+-exec_sql 陳述式---------+
+-變數參照----------------+
+-if 區塊-----------------+
+-函數呼叫----------------+
+-HTML 陳述式-------------+
+-include 陳述式----------+
| (2) |
+-include_url 陳述式------+
'-while 區塊--------------'
註:
值
上下文
在這些上下文中可找到 MACRO_FUNCTION 區塊:
限制
這個結構不適用於 OS/390 作業系統。
MACRO_FUNCTION 區塊可以包含這些元素:
OS/400 上不被支援
只有 OS/400 才支援
範例
範例 1: 指定訊息處理的巨集函數
%MACRO_FUNCTION setMessage(IN rc, OUT message) {
%IF (rc == "0")
@dtw_assign(message, "函數呼叫順利完成。")
%ELIF (rc == "-1")
@dtw_assign(message, "函數失敗,記憶體不足。")
%ELIF (rc == "-2")
@dtw_assign(message, "函數失敗,參數無效。")
%ENDIF
%}
範例 2: 指定表頭資訊的巨集函數
%MACRO_FUNCTION setup(IN browserType) {
%{ 在巨集中每一個 HTML 區塊頂端呼叫這個函數 %}
%INCLUDE "header_info.html"
@dtw_rdate()
%IF (browserType == "IBM")
@setupIBM()
%ELIF (browserType == "MS")
@setupMS()
%ELIF (browserType == "NS")
@setupNS()
%ELSE
@setupDefault()
%ENDIF
%}
目的
根據函數回覆碼,指定顯示的訊息及採行的建議動作。
在 MESSAGE 區塊中定義一組回覆碼、對應訊息、以及建議動作。函數呼叫完成後, Net.Data 比較它的回覆碼與 MESSAGE 區塊中定義的回覆碼。如果函數的回覆碼符合 MESSAGE 區塊中定義的回覆碼, Net.Data 立即顯示訊息,並評估動作作,判斷應該繼續處理或跳出 Net.Data 巨集。
MESSAGE 區塊可以是整體範圍,也可以是區域單一 FUNCTION 區塊。 巨集最外層次定義的 MESSAGE 巨集,作為整體範圍。如果定義多個整體 MESSAGE 區塊, 僅最後一個區塊有效。如果 MESSAGE 區塊定義在 FUNCTION 區域中, 則該區域在所屬 FUNCTION 區塊的區域範圍中。有關回覆碼處理程序規則, 請參閱 Net.Data 管理程式設計指南 中的 MESSEAGE 部分。
語法
>>-%MESSAGE--{-------------------------------------------------->
.-------------------------------------------------------------------.
V |
>--------+-------------------------------------------------------------+--+>
'--+-| 回覆碼規格 |--+--:---| 訊息文字規格 |----| 動作規格 |--'
'-| SQLSTATE |----'
>----%--}------------------------------------------------------><
動作規格
|--+---------------+--------------------------------------------|
'-| 動作規格 |--'
回覆碼規格
|---+-DEFAULT----------+----------------------------------------|
+-+DEFAULT---------+
+- -DEFAULT--------+
+-+----+---訊息碼--+
| +- --+ |
| '-+--' |
'-include 陳述式---'
SQLSTATE
|---SQLSTATE--:----+-state_id---+-------------------------------|
'-英數字字串-'
訊息文字規格
.----------------.
V |
|----+-"-----+----------+--+---"---+----------------------------|
| +-字串-----+ |
| +-變數參照-+ |
| +-函數呼叫-+ |
| '-換行-----' |
| .----------------. |
| V | |
+-{-----+----------+--+---%}--+
| +-字串-----+ |
| +-變數參照-+ |
| '-函數呼叫-' |
'-include 陳述式--------------'
動作規格
.-EXIT-----.
|---+-:--+----------+-+-----------------------------------------|
| '-CONTINUE-' |
'-include 陳述式--'
值
上下文
在這些上下文中可找到 MESSAGE 區塊:
限制
MESSAGE 區塊可以包含這些元素:
SQLSTATE 在 OS/400 平台上不受支援。
範例
範例 1:區域 MESSAGE 區塊
%{ FUNCTION 區塊中的區域訊息區塊 %}
%FUNCTION(DTW_REXX) my_function() {
%EXEC { my_command.cmd %}
%MESSAGE{
-601: {<H3>已建立表格,請返回並輸入您的名稱。</H3>
<P><a href="input">Return</a>
%}
default: "<H3>無法繼續執行,因為發生錯誤 $(RETURN_CODE)</H3>"%} : exit
%}
範例2:整體 MESSAGE 區塊
%{ global message block %}
%MESSAGE {
-100 : "回覆碼 -100 的訊息" : exit
100 : "回覆碼 100 訊息" : continue
+default : {
此為超出一行的長訊息。
您可以在此訊息中使用包括鏈結和套表
的 HTML 標籤。 %} : continue
%}
%{ FUNCTION 區塊中的區域訊息區塊 %}
%FUNCTION(DTW_REXX) my_function() {
%EXEC { my_command.cmd %}
%MESSAGE {
-100 : "回覆碼 -100 的訊息" : exit
100 : "回覆碼 100 訊息" : continue
-default : {
此為超出一行的長訊息。
您可以在此訊息中使用包括鏈結和套表
的 HTML 標籤。 %} : exit
%}
範例 3:包含 INCLUDE 陳述式的 MESSAGE 區塊
%message {
%include "rc1000.msg"
%include "rc2000.msg"
%include "defaults.msg"
%}
目的
製作函數呼叫之輸出的格式。您可以輸入一個表格名稱參數, 來設定這個表格使用被命名表格內的資料。否則, 所產生的表格會使用函數參數列示中第一個輸出表格上的資料, 或是當參數列示上沒有表格名稱時,使用預設的表格資料。
語法
>>-%REPORT----+-------------+--{-------------------------------->
'-(--名稱--)--'
.--------------------------.
V |
>--------+--------------------+--+---+----------+--------------->
+-字串---------------+ '-row 區塊-'
+-if 區塊------------+
+-變數參照-----------+
+-函數呼叫-----------+
+-HTML 陳述式--------+
+-include 陳述式-----+
+-include_url 陳述式-+
'-while 區塊---------'
.--------------------------.
V |
>--------+--------------------+--+--%}-------------------------><
+-字串---------------+
+-if 區塊------------+
+-變數參照-----------+
+-函數呼叫-----------+
+-HTML 陳述式--------+
+-include 陳述式-----+
+-include_url 陳述式-+
'-while 區塊---------'
值
上下文
在這些上下文中可找到 REPORT 區塊:
限制
報告區塊可以包含這些元素:
在 OS/390 平台上: SQL 函數內無法呼叫 SQL 函數。
範例
範例 1:顯示一列姓名及位置的雙欄 HTML 表格
%FUNCTION(DTW_SQL) mytable() {
%REPORT{
<H2>查詢結果</H2>
<P>選取名稱以顯示明細。
<TABLE BORDER=1>
<TR><TD>姓名</TD><TD>位置</TD>
%ROW{
<TR>
<TD>
<a href="/cgi-bin/db2www/name.mac/details?name=$(V1)&location=$(V2)">$(V1)</a></TD>
<TD>$(V2)</TD>
%}
</TABLE>
%}
選取表格中的一個名稱,可呼叫 name.mac Net.Data 巨集的明細 HTML 區塊, 將這二個值當作 URL 的一部份來傳送給它。您可以在本例的 name.mac 中使用這些值來尋找名稱的其它明細。
目的
處理函數呼叫傳回的每一個表格列。 Net.Data 只為各列處理一個 ROW 區塊中的陳述式。
語法
.--------------------------.
V |
>>-%ROW--{-------+--------------------+--+--%}-----------------><
+-字串---------------+
+-if 區塊------------+
+-變數參照-----------+
+-函數呼叫-----------+
+-HTML 陳述式--------+
+-include 陳述式-----+
+-include_url 陳述式-+
'-while 區塊---------'
值
上下文
在這些上下文中可找到 ROW 區塊:
限制
ROW 區塊可以包含這些元素:
在 OS/390 平台上: SQL 函數內無法呼叫 SQL 函數。
範例
範例 1:顯示一列姓名及位置的雙欄 HTML 表格
%REPORT{
<H2>查詢結果</H2>
<P>選取名稱以顯示明細。
<TABLE BORDER=1>
<TR><TD>姓名</TD><TD>位置</TD>
%ROW{
<TR>
<TD>
<a href="/cgi-bin/db2www/name.mac/details?name=$(V1)&location=$(V2)">$(V1)</a></TD>
<TD>$(V2)</TD>
%}
</TABLE>
%}
選取表格中的一個名稱,可呼叫 name.mac Net.Data 巨集的明細 HTML 區塊, 將這二個值當作 URL 的一部份來傳送給它。您可以在本例的 name.mac 中使用這些值來尋找名稱的其它明細。
目的
定義一套相關資料的變數。 它裡面有一個相同記錄或橫列的陣列、以及一個說明各列欄位的直欄名稱陣列。 表格陳述式只能用於 DEFINE 陳述式或區塊。
語法
>>-%TABLE--| 上限 |--------------------------------------------><
上限
|---+------------------+----------------------------------------|
'-(--+-號碼-+---)--'
'-ALL--'
值
上下文
在這些上下文中可找到 TABLE 陳述式:
限制
TABLE 陳述式可以包含這些元素:
範例
範例 1: 列數上限為 30 的 Net.Data 表格
%DEFINE myTable1=%TABLE(30)
範例 2: 使用所有列數預設值的 Net.Data
%DEFINE myTable2=%TABLE
範例 3: 指定所有列數的 Net.Data 表格
%DEFINE myTable3=%TABLE(ALL)
目的
提供根據條件式字串處理程序的迴路結構。 您可以在 HTML 區塊、報告區塊、 ROW 區塊、IF 區塊及 MACRO_FUNCTION 區塊中使用 WHILE 區塊。條件列示中的字串值, 如果是代表整數且前端或尾端沒有白色空間時,將被作為數字來比較。 它們可以有單一加號 (+) 或減號 (-) 置於前端。
語法
.-----------------------.
V |
>>-%WHILE--| 條件列示 |---{-------+-----------------+--+--%}---><
+-exec_sql 陳述式-+
+-函數呼叫--------+
+-HTML 陳述式-----+
+-if 區塊---------+
+-while 區塊------+
+-變數參照--------+
'-字串------------'
條件列示
|---(--+-(--條件列示--)----------+---)--------------------------|
+-條件列示--&&--條件列示--+
+-條件列示--||--條件列示--+
+-!--條件列示-------------+
+-| 條件 |----------------+
'-| 詞彙 |----------------'
條件
|---詞彙--+-<--+---詞彙-----------------------------------------|
+->--+
+-<=-+
+->=-+
+-!=-+
'-==-'
詞彙
|---+-變數名稱-------------+------------------------------------|
'-"--+-字串-----+---"--'
+-變數參照-+
'-函數呼叫-'
值
如果其中一個條件非真,則執行一般字串比較。
上下文
在這些上下文中可找到 WHILE 區塊:
限制
WHILE 區塊可以包含這些元素:
範例
範例 1:產生表格列數的 WHILE 區塊
%DEFINE loopCounter = "1"
%HTML(build_table) {
%WHILE (loopCounter <= "100") {
%{ 產生表格標籤及欄位標題 %}
%IF (loopCounter == "1")
<TABLE BORDER>
<TR>
<TH>Item #
<TH>Description
</TR>
%ENDIF
%{ 產生個別的列 %}
<TR>
<TD>
<TD>$(loopCounter)
<TD>@getDescription(loopCounter)
</TR>
%{ 產生終止表格標籤 %}
%IF (loopCounter == "100")
</TABLE>
%ENDIF
%{ 增量迴路計數器 %}
@dtw_add(loopCounter, "1", loopCounter)
%}
%}