このセクションでは、Net.Data マクロで使用する言語構成要素について説明します。
それぞれの言語構成要素の説明には、 以下の情報が記載されていることがあります。
マクロでは以下の構成要素を使用します。 構文と例については、それぞれの構成要素の説明を参照してください。
目的
Net.Data マクロの機能を説明します。 COMMENT ブロックはマクロのどこででも使用できるため、 他の構文図ではこのブロックを記載しません。
COMMENT ブロックは、Net.Data 初期設定ファイルでも使用できます。
構文
>>-%{---text---%}----------------------------------------------><
値
コンテキスト
コメントは、Net.Data マクロの Net.Data 言語構成要素間、 または Net.Data 初期設定ファイルのどこにでも配置することができます。
制約
どのようなテキストや文字でも使用できますが、 コメント・ブロックをネストすることはできません。
例
例 1: 基本のコメント・ブロック
%{ This is a comment block. It can contain any number of lines and contain any characters. Its contents are ignored by Net.Data. %}
例 2: FUNCTION ブロックのコメント
%function(DTW_REXX) getAddress(IN name, %{ customer name %} IN phone, %{ customer phone number %} OUT address %{ customer address %} ) { .... %}
例 3: HTML ブロックのコメント
%html(report) { %{ run the query and save results in a table %} @myQuery(resultTable) %{ build a form to display a page of data %} <form method="POST" action="report"> %{ send the table to a REXX function to send the data output %} @displayRows(START_ROW_NUM, submit, resultTable, RPT_MAX_ROWS) %{ pass START_ROW_NUM as a hidden variable to the next invocation %} <input name="START_ROW_NUM" type="hidden" value="$(START_ROW_NUM)"> %{ build the next and previous buttons %} %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" %{ starting row number for output table %} RPT_MAX_ROWS = "25" %{ maximum number of rows in the table %} resultTable = %table %{ table to hold query results %} %}
Example 5: Net.Data 初期設定ファイル中のコメント
%{ changes: removed RETURN_CODE parm and DTW_DEFAULT ENVIRONMENT statement %} ... ENVIRONMENT (DTW_SQL) dtwsql (IN LOCATION, DB2SSID, DB2PLAN, TRANSACTION_SCOPE) ENVIRONMENT (DTW_ODBC) odbcdll (IN LOCATION, TRANSACTION_SCOPE) ENVIRONMENT (DTW_PERL) perldll () ENVIRONMENT (DTW_REXX) rexxdll () ENVIRONMENT (DTW_FILE) filedll () ENVIRONMENT (DTW_APPLET) appldll () ENVIRONMENT (DTW_SYSTEM) sysdll ()
目的
DEFINE セクションでは、マクロの宣言パーツに変数名を定義します。 このセクションは、 以下のとおりステートメントでもブロックでもかまいません。
変数定義は、二重引用符 ("") を使用して単一行にしたり、 大括弧とパーセント記号 ({ %}) を使って複数行にわたるようにすることができます。 変数を定義すると、 マクロのどこででもその変数を参照できるようになります。
構文
>>-%DEFINE----+----------------------------+--------------------> | (1) | '-(--+-STATIC---------+---)--' | (1) | '-TRANSIENT------' >-----+-| define entry |--------------------------+------------>< '-{--+------------------------------+---%}--' | .------------------------. | | V | | '----+-define entry------+--+--' '-include statement-' define entry .--------------------------. V | |---+-variable name--=--+-"-----+--------------------+--+---"---+-+-> | | +-string-------------+ | | | | +-variable reference-+ | | | | '-function call------' | | | | .--------------------------. | | | | V | | | | +-{-----+--------------------+--+---%}--+ | | | +-string-------------+ | | | | +-variable reference-+ | | | | +-function call------+ | | | | '-new_line-----------' | | | +-exec statement------------------------+ | | +-table statement-----------------------+ | | +-envvar statement----------------------+ | | +-| conditional variable |--------------+ | | '-| abbreviated conditional variable |--' | '-list statement----------------------------------------------' >---------------------------------------------------------------| conditional variable |---variable name---?-------------------------------------------> .--------------------------. V | >-----+-"-----+--------------------+--+---"---+-----------------> | +-string-------------+ | | +-variable reference-+ | | '-function call------' | | .--------------------------. | | V | | '-{-----+--------------------+--+---%}--' +-string-------------+ +-variable reference-+ '-function call------' .--------------------------. V | >-------:--+-"-----+--------------------+--+---"---+------------| | +-string-------------+ | | +-variable reference-+ | | '-function call------' | | .--------------------------. | | V | | '-{-----+--------------------+--+---%}--' +-string-------------+ +-variable reference-+ '-function call------' abbreviated conditional variable .--------------------------. V | |---?----+-"-----+--------------------+--+---"---+--------------| | +-string-------------+ | | +-variable reference-+ | | '-function call------' | | .--------------------------. | | V | | '-{-----+--------------------+--+---%}--' +-string-------------+ +-variable reference-+ '-function call------'
注:
値
コンテキスト
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 は同じ名前の環境変数の現行値を戻します。
構文
>>-%ENVVAR-----------------------------------------------------><
コンテキスト
ENVVAR ステートメントは、DEFINE ブロックまたはステートメントで指定することができます。
値
制約
ENVVAR ステートメントにはその他の要素を含めることができません。
例
例 1: この例では、ENVVAR は、 参照時に環境変数 SERVER_SOFTWARE の現行値、 つまり Web サーバー名を戻す変数を定義します。
%DEFINE SERVER_SOFTWARE = %ENVVAR %HTML(REPORT) { The server is $(SERVER_SOFTWARE). %}
目的
変数の参照時または関数の呼び出し時に実行される外部プログラムを指定します。
Net.Data がマクロ内で実行可能変数を見つけると、 参照された実行可能プログラムを以下の方法で探します。
許可のヒント: Net.Data が実行されるユーザー ID が、 EXEC ステートメントまたはブロックによって参照されるどのファイルについてもアクセス権限を持つようにしてください。詳しくは、 Net.Data 管理およびプログラミングの手引き の構成の章にある、 Net.Data ファイルへの Web サーバーのアクセス権限の指定に関するセクションを参照してください。
EXEC ステートメントおよびブロックは、 使用する場所に応じて 2 つの異なるコンテキストで使用し、 その構文も異なります。DEFINE ブロックでは EXEC ステートメントを使用し、 FUNCTION ブロックでは EXEC ブロックを使用します。
構文
DEFINE ブロックで使用する際の EXEC ステートメント構文 :
.--------------------------. V | >>-%EXEC------"-----+--------------------+--+---"-------------->< +-string-------------+ +-variable reference-+ '-function call------'
FUNCTION ブロックで使用する際の EXEC ブロック構文 :
.-------------------------. V | >>-%EXEC------{----+-string-------------+--+---%}-------------->< +-variable reference-+ '-function call------'
値
コンテキスト
EXEC ブロックまたはステートメントは、 以下のコンテキストで検出することができます。
制約
EXEC ブロックまたはステートメントには、以下の要素を含めることができます。
以下の Net.Data に提供される言語環境では、 EXEC ステートメントがサポートされます。
例
例 1: 変数により参照される実行可能ファイル
%DEFINE mycall = %EXEC "MYEXEC.EXE $(empno)" %HTML (report){ <P>Here is the report you requested: <HR>$(mycall) %}
この例では、変数 mycall を参照するたびに MYEXEC.EXE を実行します。
例 2: 関数により参照される実行可能ファイル
%FUNCTION(DTW_REXX) my_rexx_pgm(INOUT a, b, IN c, INOUT d){ %EXEC{ mypgm.cmd this is a test %} %}
この例は、 関数 my_rexx_pgm の呼び出し時に mypgm.cmd を実行します。
目的
Net.Data がマクロから呼び出すサブルーチンを定義します。FUNCTION ブロックの実行可能ステートメントは、 言語環境により直接解釈されるインライン・ステートメントにしたり、 外部プログラムの呼び出しにすることができます。
FUNCTION ブロック内部で EXEC ブロックを使用する場合、 その EXEC ブロックは、 FUNCTION ブロック内の唯一の実行可能ステートメントでなければなりません。 実行可能ステートメントを言語環境に渡す前に、 Net.Data は、初期設定ファイルの EXEC_PATH 構成ステートメントで判別されるパス名に、 EXEC ブロックのプログラムのファイル名を追加します。 結果ストリングは、実行される言語環境に渡されます。
言語環境が EXEC ブロックを処理するのに使用する方法は、 特定の言語環境により異なります。REXX、System、および Perl の Net.Data 提供言語環境だけが EXEC ブロックをサポートします。
Net.Data 言語構成要素構文に一致する文字が、 構文的に有効な組み込みプログラム・コード (たとえば、REXX または Perl) の一部として、 関数ブロックの言語ステートメント・セクションで使用されると、 それらの文字が誤って Net.Data 言語構成要素として解釈され、 マクロでエラーが生じたり、予測できない結果が生じたりすることがあります。
たとえば、Perl 関数が COMMENT ブロックの区切り文字として %{ を使用する場合があります。 このマクロが実行されると、%{ という文字は COMMENT ブロックの先頭と解釈されます。 そして Net.Data は、COMMENT ブロックの終わりを探し、 この関数ブロックの終わりに達したときに COMMENT ブロックの終わりが見つかったものと判定します。 その後で Net.Data はさらに関数ブロックの終わりを探し、 それが見つからない場合には、エラーを発行します。
Net.Data 特殊文字を組み込みプログラム・コードの一部として使用し、 Net.Data によって特殊文字として解釈されないようにするためには、 以下の方法を使用してください。
たとえば、次の Perl 関数には、Perl 言語ステートメントの一部として、 COMMENT ブロックの区切り文字を表す文字 %{ が含まれています。
%function(DTW_PERL) func() { ... for $num_words (sort bynumber keys %{ $Rtitles{$num} }) { &make_links($Rtitles{$num}{$num_words}); } ... %}
Net.Data が %{ 文字を Net.Data の COMMENT ブロック区切り文字としてでなく、 Perl ソース・コードとして解釈するようにするには、 次のいずれかの方法でこの関数を書き直してください。
%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--(--lang_env--)--function_name--| parm passing spec |--> .-;---------------------------------------------. >----+-| returns spec |--{--| function body |----%}--+--------->< parm passing spec |---(--+---------------------------------------------+---)------| | .-,-------------------------------------. | | | (1) | | | V .-IN-------. | | '----+----------+---+-----------+---name---+--' +-OUT------+ '-datatype--' '-INOUT----' returns spec |---+----------------------+------------------------------------| '-RETURNS--(--name--)--' function body |---+-------------------------------+---------------------------> | .--------------------------. | | V | | +----inline statement block---+-+ '-exec block--------------------' >-----+-----------------------------------------------+---------| | .---------------------. | | V (2) | | +----report block--------+---+----------------+-+ | '-message block--' | | .--------------------------. | | V | | '-message block-----+--------------------+--+---' | (2) | '-report block-------'
注:
値
コンテキスト
FUNCTION ブロックは、以下のコンテキストで検出することができます。
制約
DB2 には以下の制限があります。
例
以下の例は一般的なものであり、 すべての言語環境をカバーするわけではありません。 特定の言語環境での 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 が評価されると、@substring 関数呼び出しが検索され、 サブストリング FUNCTION ブロックが実行されます。 変数が FUNCTION ブロックの実行可能ステートメントで置換されてから、 テキスト・ストリングの s = substr("longstring", 1, 4) が REXX インタープリターに渡されて実行されます。 RETURNS 文節が指定してあるため、 a の評価において @substring 関数呼び出しの値は、 "long" (つまり s の値) に置き換えられます。
例 2: 外部 REXX プログラムの呼び出し
%FUNCTION(DTW_REXX) my_rexx_pgm(INOUT a, b, IN c, OUT d) { %EXEC{ mypgm.cmd this is a test %} %} %HTML(INPUT) { <P> Original variable values: $(w) $(x) $(z) <P> @my_rexx_pgm(w, x, y, z) <P> Modified variable values: $(w) $(x) $(z) %}
変数 w および x は、 関数の INOUT パラメーター a と b に対応します。 これらの値と y の値 (IN パラメーター c に対応) は、 HTML 形式入力または DEFINE ステートメントで定義しておく必要があります。 変数 a および b には、 パラメーター a および b が値を戻すときに、 新規の値が割り当てられます。 変数 z は、 OUT パラメーター d が値を戻すときに定義されます。
/* Sample REXX Program for Example 2 */ /* Test arguments */ num_args = arg(); say 'There are' num_args 'arguments'; do i = 1 to num_args; say 'arg' i 'is "'arg(i)'"' end; /* Set variables passed from Net.Data */ d = a || b || c; /* concatenate a, b, and c forming d */ a = ''; /* reset a to null string */ b = ''; /* reset b to null string */ return;
There are 1 arguments arg 1 is "this is a test"
EXEC ステートメントは、REXX インタープリターが外部 REXX プログラム mypgm.cmd を実行するように REXX 言語環境 に命令します。 REXX 言語環境は、Net.Data 変数を REXX プログラムと共用できるため、 mypgm.cmd を実行する前に、 REXX 変数 a、b、 および c に Net.Data 変数 w、x、および y の値を割り当てることができます。 mypgm.cmd は、 変数 a、b、 および c を REXX ステートメントで直接使用することができます。 プログラムが終了すると、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>Here is the status of your order: <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 ステートメントで $(x) を IBM、 $(y) を 12345 に置き換えます。 SQL 関数 query_1 の定義では出力表変数を指定しないため、 デフォルトの表が使用されます (詳しくは、TABLE 変数ブロックを参照してください)。 REPORT ブロックで参照される NLIST および Vi 変数は、 デフォルトの表定義で定義されています。 REPORT ブロックで作成されるレポートは、 query_1 関数が呼び出される出力 HTML に置かれます。
例 4: Perl スクリプトを実行するシステム呼び出し
%FUNCTION(DTW_SYSTEM) today() RETURNS(result) { %exec{ perl "today.prl" %} %} %HTML(INPUT) { @today() %}
$date = `date`; chop $date; open(DTW, "> $ENV{DTWPIPE}") || die "Could not open: $!"; print DTW "result = \"$date\"\n";
System 言語環境は、 C 言語の system() 関数呼び出しを使用して FUNCTION ブロックの実行可能ステートメントをオペレーティング・システムに渡すことによって、 これらの実行可能ステートメントを解釈します。 この方式では、REXX 言語環境が行うように、 Net.Data 変数を実行可能ステートメントへ直接渡したり取り出したりすることができません。 このため、System 言語環境は、以下のように変数の受け渡しと取り出しを行います。
@today 関数呼び出しが検出されると、 Net.Data は実行可能ステートメントで変数置換を行います。 この例では実行可能ステートメントに Net.Data 変数がないため、 変数置換は行われません。 実行可能ステートメントとパラメーターは System 言語環境に渡されます。 この言語環境は、名前付きパイプを作成し、環境変数 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 "Could not open: $!"; print DTW "result = \"$date\"\n"; %} %HTML(INPUT) { @today() %}
ブロックの使用法を調べるため、この例と 例 4 を比較します。例 4 では、System 言語環境は Perl プログラムの解釈方法を理解していませんが、 言語環境は外部プログラムの呼び出し方法を理解しています。 EXEC ブロックは、 外部プログラムとして perl という名前のプログラムを呼び出すことを言語環境に命令します。 実際の Perl 言語ステートメントは、 外部 Perl プログラムによって解釈されます。 例 5 には EXEC ブロックがありません。これは、 Perl 言語環境が Perl 言語ステートメントを直接解釈することができるからです。
目的
FUNCTION ブロック、MACRO_FUNCTION ブロック、 あるいは引き数を指定した組み込み関数を呼び出します。関数が組み込み関数ではない場合、 関数呼び出しを指定する前に、 あらかじめ Net.Data マクロでその関数を定義しておかなければなりません。
構文
>>-@function_name---(-------------------------------------------> >-----+-----------------------------------------------+--)----->< | .-,----------------------------------------. | | V | | '----+-variable_name-----------------------+--+-' +-variable reference------------------+ +-function call-----------------------+ | .-------------------------. | | V | | '-"----+-string-------------+--+---"--' +-variable reference-+ '-function call------'
値
コンテキスト
関数呼び出しは、以下のコンテキストで検出することができます。
制約
例
例 1: SQL 関数 formQuery の呼び出し
%FUNCTION(DTW_SQL) formQuery(){ SELECT $(queryVal) from $(tableName) %} %HTML (input){ <P>Which columns of $(tableName) do you want to see? <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>Here are the columns you selected: <HR>@formQuery() %}
例 2: 入出力パラメーターを指定した REXX 関数の呼び出し
%FUNCTION(DTW_REXX) my_rexx_pgm(INOUT a, b, IN c, OUT d) { %EXEC{ mypgm.cmd this is a test %} %} %HTML(INPUT) { <P> Original variable values: $(w) $(x) $(z) <P> @my_rexx_pgm(w, x, y, z) <P> Modified variable values: $(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) %}
例 4: INOUT パラメーターの使用方法を示したマクロ
%DEFINE a = "initial value of a"
%FUNCTION(DTW_REXX) func1(INOUT x) {
Say 'value at start of function:<br>
Say 'x =' x
Say '
<p>
'
x = "new value of a"
%REPORT {
<p>
value at start of report block:<br>
x = $(x)<br>
@dtw_assign(x, "newest value of a")
value at end of report block:<br>
x = $(x)<br>
%}
%}
%HTML(report) {
initial values:<br>
a = $(a)<br>
@func1(a)
value after function call:<br>
a = $(a)<br>
%}
出力結果:
initial values: a = initial value of a value at start of function: x = initial value of a value at start of report block: x = new value of a value at end of report block: x = newest value of a value after function call: a = newest value of a
目的
Web ページの表示方法を定義します。実行する HTML ブロックの名前は、 Net.Data の起動時に URL に指定されます。 HTML ブロックには、ほとんどの Net.Data マクロ言語ステートメント、 および HTML や Javascript などの有効な表示ステートメントを含むことができます。
構文
>>-%HTML----(--name--)------------------------------------------> .-----------------------------. V | >-----{-----+-----------------------+--+---%}------------------>< +-exec_sql statement----+ +-variable reference----+ +-if block--------------+ +-function call---------+ +-HTML statement--------+ +-include statement-----+ +-include_url statement-+ '-while block-----------'
値
コンテキスト
HTML ブロックは、以下のコンテキストで検出することができます。
制約
HTML ブロックには、以下の要素を含めることができます。
例
例 1: ヘッダーおよびフッター用の組み込みファイルを指定した HTML ブロック
%HTML(example1){ %INCLUDE"header.html" <P>You can put <EM>any</EM> HTML in an HTML block. An SQL function call is made like this: @xmp1() %INCLUDE"footer.html" %}
例 2: ピリオドを含む名前の HTML ブロック
%HTML(my.report){ %INCLUDE"header.html" <P>You can put <EM>any</EM> HTML in an HTML block. An SQL function call is made like this: @xmp1() %INCLUDE"footer.html" %}
条件付きストリング処理を行います。IF ブロックにより、1 つまたは複数の条件を処理することができ、 続いて条件テストの結果に基づいて、 ステートメントのブロックを処理することができます。 IF ブロックは、Net.Data マクロの宣言パーツ、HTML ブロック、 MACRO_FUNCTION ブロック、REPORT ブロック、WHILE ブロック、ROW ブロックで使用することも、 別の IF ブロックの内部でネストさせることもできます。
条件リストのストリング値が整数を表すストリングであり、 しかもこれらのストリングの先頭または末尾に空白文字がない場合、 これらの値は比較のための数値として処理されます。これらの値の先頭に、 プラス (+) または マイナス (-) 記号を 1 つ付けることができます。
制約事項: Net.Data は非整数の数値比較をサポートしません。 例、浮動小数点数。
ネストされた IF ブロック: IF ブロック構文の規則は、 マクロにおけるブロックの位置によって決定されます。IF ブロックが、 宣言パーツのほかのすべてのブロックの外側にある IF ブロックの内部でネストされている場合、 ネストされた IF ブロックは、 外側のブロックが使用することのできる要素をすべて使用できます。IF ブロックが、IF ブロックの中の別のブロック内でネストされている場合、 そのネストされた IF ブロックが入っているブロックの構文規則に従います。
以下の例では、 ネストされた IF ブロックは、 HTML ブロック内で使用される規則に従わなければなりません。
%IF block ... %HTML block ... %IF block
IF ブロックは最大 1024 までネストできます。
構文
>>-%IF--| condition list |--------------------------------------> >-----| statement_block |--| else_if spec |--%ENDIF------------>< condition list |---(--+-(--condition list--)----------------+---)--------------| +-condition list--&&--condition list--+ +-condition list--||--condition list--+ +-!--condition list-------------------+ +-| condition |-----------------------+ '-| term |----------------------------' statement_block .---------------------------------. V | |------+---------------------------+--+-------------------------| | (1) | +-define block--------------+ | (1) | +-define statement----------+ | (2) | +-exec_sql statement--------+ | (1) | +-function block------------+ +-function call-------------+ | (1) | +-HTML block----------------+ | (2) | +-HTML statement------------+ +-if block------------------+ +-include statement---------+ +-include_url statement-----+ | (1) | +-macro_function block------+ | (1) | +-message block-------------+ | (2) | +-string--------------------+ | (2) | +-variable reference--------+ | (2) | '-while block---------------' condition |---term--+-<--+---term-----------------------------------------| +->--+ +-<=-+ +->=-+ +-!=-+ '-==-' term |---+-variable_name-----------------------+---------------------| +-variable reference------------------+ +-function call-----------------------+ | .-------------------------. | | V | | '-"----+-string-------------+--+---"--' +-variable reference-+ '-function call------' else_if spec |---+---------------------------------------------------------------+-> | .----------------------------------------------------. | | V | | '--+----%ELIF--(--condition_list--)--| statement_block |---+-+--' '-%ELSE--| statement_block |------------------------------' >---------------------------------------------------------------|
注:
値
どちらかの条件が当てはまらない場合、標準のストリング比較が行われます。
コンテキスト
IF ブロックは、以下のコンテキストで検出することができます。
制約
IF ブロックが Net.Data マクロの宣言パーツのほかのすべてのブロックの外側にあるときには、 IF ブロックに以下の要素を含めることができます。
IF ブロックが、Net.Data マクロの HTML ブロック、MACRO_FUNCTION ブロック、 REPORT ブロック、ROW ブロック、または WHILE ブロックに入っているときには、 IF ブロックに以下の要素を含めることができます。
IF ブロックは最大 1024 までネストできます。
例
例 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> The function call failed with failure code $(RETURN_CODE). %ELIF ($(RETURN_CODE) == $(warning_rc)) <P> The function call succeeded with warning code $(RETURN_CODE). %ELIF ($(RETURN_CODE) == $(success_rc)) <P>The function call was successful. %ELSE P>The function call returned with unknown return code $(RETURN_CODE). %ENDIF %}
例 3: 数値比較
%IF (ROW_NUM < "100") <p>The table is not full yet... %ELIF (ROW_NUM == "100") <p>The table is now full... %ELSE <p>The table has overflowed... %ENDIF
暗黙の表変数 ROW_NUM は常に整数値を戻し、 比較対象の値も整数であるため、数値比較が行われます。
例 4: ネストされた IF ブロック
%IF (MONTH == "January") %IF (DATE = "1") HAPPY NEW YEAR! %ELSE Ho hum, just another day. %ENDIF %ENDIF
目的
ファイルを読み取って、 ステートメントが指定された Net.Data マクロに取り込みます。
Net.Data は、 初期設定ファイルの INCLUDE_PATH ステートメントで指定したディレクトリーを検索して、 組み込みファイルを見つけます。
ほとんどの高水準言語で使用するのと同じ方法で、 組み込みファイルを使用することができます。 組み込みファイルでは、共通ヘッダーおよびフッターを挿入したり、 共通の変数の集合を定義したり、 FUNCTION ブロック定義の共通サブルーチン・ライブラリーを Net.Data マクロに取り込むことができます。
Net.Data は、マクロを処理しているときに一度だけ INCLUDE ステートメントを実行し、 マクロ内の INCLUDE ステートメントのロケーションに組み込みファイルの内容を挿入します。 組み込みファイルの名前の変数参照が解決されるのは、 INCLUDE ステートメントを最初に実行するときで、 組み込みファイルの内容を実行するときではありません。
INCLUDE ステートメントが ROW ブロックまたは WHILE ブロック内にあるときには、 Net.Data は INCLUDE ステートメントを繰り返し実行しません。 Net.Data は、最初に ROW ブロックまたは WHILE ブロックを実行するときに、 INCLUDE ステートメントを実行し、 組み込みファイルの内容をブロックに取り込み、 その後、組み込みファイルの内容をもつ ROW ブロックまたは WHILE ブロックを繰り返し実行します。
許可のヒント Net.Data が実行されるユーザー ID が、 INCLUDE ステートメントによって参照されるどのファイルについてもアクセス権限を持つようにしてください。 詳しくは、 Net.Data 管理およびプログラミングの手引き の構成の章にある、 Net.Data ファイルへの Web サーバーのアクセス権限の指定に関するセクションを参照してください。
ヒント : ローカル Web サーバーから HTML ファイルを組み込みたい場合には、 INCLUDE_URL の例 3 に示すように INCLUDE_URL 構成要素を使用してください。 表示されている構文を使用することにより、 すでに Web サーバーに認識されているディレクトリーを指定するために、 Net.Data 初期設定ファイルの INCLUDE_PATH を更新する必要はありません。
構文
.-------------------------. V | >>-%INCLUDE----"----+-string-------------+--+---"-------------->< '-variable reference-'
値
コンテキスト
INCLUDE ステートメントは、以下のコンテキストで検出することができます。
制約
INCLUDE ステートメントには、以下の要素を含めることができます。
ストリング内での関数呼び出しは許可されません。
INCLUDE ステートメントは最大 10 までネストできます。
例
例 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 ステートメントを使用すると、 アプリケーション・ユーザーがサブミット・ボタンを選択しなくても、 別のマクロから 1 つのマクロを呼び出すことができます。
Net.Data は、マクロを処理しているときに一度だけ INCLUDE_URL ステートメントを実行し、 マクロ内の INCLUDE_URL ステートメントのロケーションに組み込みファイルの内容を挿入します。 組み込みファイルの名前の変数参照が解決されるのは、 INCLUDE_URL ステートメントを最初に実行するときで、 組み込みファイルの内容を実行するときではありません。
INCLUDE_URL ステートメントが ROW ブロックまたは WHILE ブロック内にあるときには、 Net.Data は INCLUDE_URL ステートメントを繰り返し実行しません。 Net.Data は、最初に ROW ブロックまたは WHILE ブロックを実行するときに、 INCLUDE_URL ステートメントを実行し、 組み込みファイルの内容をブロックに取り込み、 その後、組み込みファイルの内容をもつ ROW ブロックまたは WHILE ブロックを繰り返し実行します。
構文
.-------------------------. V | >>-%INCLUDE_URL---"------+-string-------------+--+--"---------->< '-variable reference-'
値
コンテキスト
INCLUDE_URL ステートメントは、以下のコンテキストで検出することができます。
制約
INCLUDE_URL ステートメントには、以下の要素を含めることができます。
OS/390 では、INCLUDE_URL ファイルは最大 256 KB とすることができます。 他のオペレーティング・システムでは制限はありません。
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"
ヒント : この方法を使うことにより、 すでに Web サーバーに認識されているディレクトリーを指定するために、 Net.Data 構成ファイルの INCLUDE_URL パスを更新する必要はありません。 string がスラッシュで始まっていない 場合、 Net.Data は、ストリングがサーバー名であると推定し、 対応する名前のサーバーからファイルを取り出そうとします。
例 4: リモート・サーバーからのほかの Net.Data マクロの組み込み
%REPORT{ <P>Current hot pick as of @DTW_rTIME(): %include_url "http://www.ibm.com/cgi-bin/db2www/hotpic.mac/report?custno=$(custno)"
この例では、マクロ hotpic.mac が呼び出され、custno が変数として送られます。string がスラッシュで始まっている場合、 Net.Data は、ローカル Web サーバーから INCLUDE ファイルを取り出します。
目的
値の区切りリストを作成します。 一部の WHERE または HAVING 文節に見られるように、 複数の項目を指定して SQL 照会を作成するときに、 LIST ステートメントを使用することができます。
構文
.--------------------------. V | >>-%LIST--"-----+--------------------+--+---"----variable name-->< +-string-------------+ +-variable reference-+ '-function call------'
値
コンテキスト
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--function_name--| parm passing spec |--------> (4) >-----| returns spec |-------{--| function body |----%}---------> .--------------------------. V | >--------+--------------------+--+--%}------------------------->< | (3) | '-report block-------' parm passing spec |---(--+-----------------------------+---)----------------------| | .-,---------------------. | | | (1) | | | V .-IN-------. | | '----+----------+---name---+--' +-OUT------+ '-INOUT----' returns spec (4) |----------+----------------------+-----------------------------| '-RETURNS--(--name--)--' function body .----------------------------------. V | |------+----------------------------+--+------------------------| +-exec_sql statement---------+ +-variable reference---------+ +-if block-------------------+ +-function call--------------+ +-HTML statement-------------+ +-include statement----------+ | (2) | +-include_url statement------+ '-while block----------------'
注:
値
コンテキスト
MACRO_FUNCTION ブロックは、以下のコンテキストで検出することができます。
制約
MACRO_FUNCTION ブロックには、以下の要素を含めることができます。
OS/400 ではサポートなし
例
例 1: メッセージ処理を指定するマクロ関数
%MACRO_FUNCTION setMessage(IN rc, OUT message) { %IF (rc == "0") @dtw_assign(message, "Function call was successful.") %ELIF (rc == "-1") @dtw_assign(message, "Function failed, out of memory.") %ELIF (rc == "-2") @dtw_assign(message, "Function failed, invalid parameter.") %ENDIF %}
例 2: ヘッダー情報を指定するマクロ関数
%MACRO_FUNCTION setup(IN browserType) { %{ call this function at the top of each HTML block in the macro %} %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 ブロックは、その効力範囲をグローバルにすることも、 1つの FUNCTION ブロック対象にローカルにすることもできます。 MESSAGE ブロックが最外部のマクロ・レイヤーで定義してある場合、 そのブロックの効力範囲はグローバルであると考えられます。 複数のグローバル MESSAGE ブロックが定義されている場合、 処理された最新のブロックだけがアクティブであると考えられます。 MESSAGE ブロックが FUNCTION ブロック内で定義されている場合、 そのブロックの効力範囲は、 定義されている FUNCTION ブロック対象にローカルとなります。 戻りコードの処理規則については、 Net.Data 管理およびプログラミングの手引き の MESSAGE ブロックのセクションを参照してください。
構文
>>-%MESSAGE--{--------------------------------------------------> .--------------------------------------------------------------------------------------. V | >--------+--------------------------------------------------------------------------------+--+> '--+-| return code spec |--+--:---| message text spec |----+------------------+--' '-| SQLSTATE |----------' '-| action spec |--' >----%--}------------------------------------------------------>< return code spec |---+-DEFAULT---------------+-----------------------------------| +-+DEFAULT--------------+ +- -DEFAULT-------------+ +-+----+---msg_code-----+ | +- --+ | | '-+--' | +-include statement-----+ '-include_url statement-' SQLSTATE |---SQLSTATE--:------state_id-----------------------------------| message text spec .--------------------------. V | |----+-"-----+--------------------+--+---"---+------------------| | +-string-------------+ | | +-variable reference-+ | | +-function call------+ | | '-(new_line)---------' | | .--------------------------. | | V | | +-{-----+--------------------+--+---%}--+ | +-string-------------+ | | +-variable reference-+ | | '-function call------' | +-include statement---------------------+ '-include_url statement-----------------' action spec .-EXIT-----. |---+-:--+----------+--------+----------------------------------| | '-CONTINUE-' | +-include statement------+ '-include_url statement--'
値
コンテキスト
MESSAGE ブロックは、以下のコンテキストで検出することができます。
制約
MESSAGE ブロックには、以下の要素を含めることができます。
OS/390、OS/2、Windows NT、および UNIX オペレーティング・システムの場合: SQL 関数内部から SQL 関数を呼び出すことはできません。
例
例 1: ローカル MESSAGE ブロック
%{ local message block inside a FUNCTION block %} %FUNCTION(DTW_REXX) my_function() { %EXEC { my_command.cmd %} %MESSAGE{ -601: {<H3>The table has already been created, please go back and enter your name.</H3> <P><a href="input">Return</a> %} default: "<H3>Can't continue because of error $(RETURN_CODE)</H3>"%} : exit %}
例 2: グローバル MESSAGE ブロック
%{ global message block %} %MESSAGE { -100 : "Return code -100 message" : exit 100 : "Return code 100 message" : continue +default : { This is a long message that spans more than one line. You can use HTML tags, including links and forms, in this message. %} : continue %} %{ local message block inside a FUNCTION block %} %FUNCTION(DTW_REXX) my_function() { %EXEC { my_command.cmd %} %MESSAGE { -100 : "Return code -100 message" : exit 100 : "Return code 100 message" : continue -default : { This is a long message that spans more than one line. You can use HTML tags, including links and forms, in this message. %} : exit %}
例 3: INCLUDE ステートメントを含む MESSAGE ブロック
%message { %include "rc1000.msg" %include "rc2000.msg" %include "defaults.msg" %}
目的
関数呼び出しからの出力を形式化します。 表名パラメーターを入力すると、 指定された表でレポートがデータを使用するのを指定することができます。 そうしないと、レポートは、 関数パラメーター・リストで最初に検出された出力表で生成されます。 また、リストに表名がない場合、 レポートはデフォルトの表データで生成されます。
構文
>>-%REPORT----+-------------+--{--------------------------------> '-(--name--)--' .-----------------------------. V | >--------+-----------------------+--+---+-----------+-----------> +-string----------------+ '-row block-' +-if block--------------+ +-variable reference----+ +-function call---------+ +-HTML statements-------+ +-include statement-----+ +-include_url statement-+ '-while block-----------' .-----------------------------. V | >--------+-----------------------+--+--%}---------------------->< +-string----------------+ +-if block--------------+ +-variable reference----+ +-function call---------+ +-HTML statements-------+ +-include statement-----+ +-include_url statement-+ '-while block-----------'
値
コンテキスト
REPORT ブロックは、以下のコンテキストで検出することができます。
制約
REPORT ブロックには、以下の要素を含めることができます。
OS/390、OS/2、 Windows NT、および UNIX オペレーティング・システムの場合: SQL 関数内部から SQL 関数を呼び出すことはできません。
OS/390 の場合: REPORT ブロックは、MACRO_FUNCTION ブロックでは使用できません。
例
例 1: 名前と場所のリストを表示する 2 列の HTML 表
%FUNCTION(DTW_SQL) mytable() { %REPORT{ <H2>Query Results</H2> <P>Select a name for details. <TABLE BORDER=1> <TR><TD>Name</TD><TD>Location</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 マクロの details HTML ブロックが呼び出され、 URL のパーツとして 2 つの値が送信されます。 この例では、name.mac で値を使用すると、 名前に関する詳細をルックアップすることができます。
目的
関数呼び出しから戻されるそれぞれの表行を処理します。 Net.Data は、 それぞれの行ごとに ROW ブロック内のステートメントを 1 度処理します。
構文
.-----------------------------. V | >>-%ROW--{-------+-----------------------+--+--%}-------------->< +-string----------------+ +-if block--------------+ +-variable reference----+ +-function call---------+ +-HTML statements-------+ +-include statement-----+ +-include_url statement-+ '-while block-----------'
値
コンテキスト
ROW ブロックは、以下のコンテキストで検出することができます。
制約
ROW ブロックには、以下の要素を含めることができます。
OS/390、OS/2、 Windows NT、および UNIX オペレーティング・システムの場合: SQL 関数内部から SQL 関数を呼び出すことはできません。
例
例 1: 名前と場所のリストを表示する 2 列の HTML 表
%REPORT{ <H2>Query Results</H2> <P>Select a name for details. <TABLE BORDER=1> <TR><TD>Name</TD><TD>Location</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 マクロの details HTML ブロックが呼び出され、 URL のパーツとして 2 つの値が送信されます。 この例では、name.mac で値を使用すると、 名前に関する詳細をルックアップすることができます。
目的
関連データの集合である変数を定義します。 変数には行および列のセットが含まれ、 これにはそれぞれの行のフィールドを説明する列見出し行が含まれます。 表ステートメントは、DEFINE ステートメントまたはブロックでしか指定できません。
TABLE 変数を参照する際、Net.Data は、 表の内容をプレーンの文字表、または HTML 表 (DTW_HTML_TABLE 変数を YES に設定した場合) のいずれかに表示します。
構文
>>-%TABLE--| upper limit |------------------------------------->< upper limit |---+--------------------+--------------------------------------| '-(--+-number-+---)--' '-ALL----'
値
コンテキスト
TABLE ステートメントは、以下のコンテキストで検出することができます。
制約
TABLE ステートメントには、以下の要素を含めることができます。
例
例 1: 上限を 30 行に指定した Net.Data 表
%DEFINE myTable1=%TABLE(30)
例 2: デフォルトであるすべての行を使用する Net.Data 表
%DEFINE myTable2=%TABLE
例 3: すべての行を指定した Net.Data 表
%DEFINE myTable3=%TABLE(ALL)
目的
条件付きストリング処理に基づいて、ループ構成要素を提供します。 WHILE ブロックは、HTML ブロック、REPORT ブロック、ROW ブロック、 IF ブロック、および MACRO_FUNCTION ブロックで使用することができます。 条件リストのストリング値が整数を表し、 しかもストリングの先頭または末尾に空白文字がない場合、 これらの値は比較のための数値として処理されます。 また、値の先頭にはプラス (+) または マイナス (-) 記号を 1 つ付けることができます。
構文
>>-%WHILE--| condition list |---{-------------------------------> .-----------------------------. V | >--------+-----------------------+--+--%}---------------------->< +-exec_sql statement----+ +-function call---------+ +-HTML statement--------+ +-if block--------------+ +-include statement-----+ +-include_url statement-+ +-while block-----------+ +-variable reference----+ '-string----------------' condition list |---(--+-(--condition list--)----------------+---)--------------| +-condition list--&&--condition list--+ +-condition list--||--condition list--+ +-!--condition list-------------------+ +-| condition |-----------------------+ '-| term |----------------------------' condition |---term--+-<--+---term-----------------------------------------| +->--+ +-<=-+ +->=-+ +-!=-+ '-==-' term |---+-variable_name-----------------------+---------------------| +-variable reference------------------+ +-function call-----------------------+ | .-------------------------. | | V | | '-"----+-string-------------+--+---"--' +-variable reference-+ '-function call------'
値
どちらかの条件が当てはまらない場合、標準のストリング比較が行われます。
コンテキスト
WHILE ブロックは、以下のコンテキストで検出することができます。
制約
WHILE ブロックには、以下の要素を含めることができます。
例
例 1: 表に行を生成する WHILE ブロック
%DEFINE loopCounter = "1" %HTML(build_table) { %WHILE (loopCounter <= "100") { %{ generate table tag and column headings %} %IF (loopCounter == "1") <TABLE BORDER> <TR> <TH>Item # <TH>Description </TR> %ENDIF %{ generate individual rows %} <TR> <TD> <TD>$(loopCounter) <TD>@getDescription(loopCounter) </TR> %{ generate end table tag %} %IF (loopCounter == "100") </TABLE> %ENDIF %{ increment loop counter %} @dtw_add(loopCounter, "1", loopCounter) %} %}