本章节描述 Net.Data 宏中使用的 Net.Data 宏语言结构。
每个语言结构说明可以包含以下信息:
宏中使用以下结构;请参阅每个结构说明的语法和例子。
目的
把 Net.Data 宏的函数文档化。因为可以在宏的任何地方使用 COMMENT (注解)块, 所以它不在其它语法图中再作说明。
COMMENT 块也可以用在 Net.Data 初始化文件中。
语法
>>-%{---文本---%}----------------------------------------------><
值
上下文
可以在一个 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 %}
%}
例 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------'
>-----+-| 定义条目 |---------------------+---------------------><
'-{--+---------------------+---%}--'
| .---------------. |
| V | |
'----+-定义条目-+--+--'
'-包含语句-'
定义条目
.----------------.
V |
|---+-变量名--=--+-"-----+----------+--+---"---+-+--------------|
| | +-字符串---+ | |
| | +-变量引用-+ | |
| | '-函数调用-' | |
| | .----------------. | |
| | V | | |
| +-{-----+----------+--+---%}--+ |
| | +-字符串---+ | |
| | +-变量引用-+ | |
| | +-函数调用-+ | |
| | '-new_line-' | |
| +-执行语句--------------------+ |
| +-表格语句--------------------+ |
| +-环境变量语句----------------+ |
| +-| 条件变量 |----------------+ |
| '-| 缩写的条件变量 |----------' |
'-列表语句-----------------------------------'
条件变量
.----------------.
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返回同名的环境变量的当前值。
语法
>>-%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 语句和块在两种上下文中使用,根据使用的不同场合,它们可以有不同的语法。在 DEFINE 块中使用 EXEC 语句,在 FUNCTION 块中使用 EXEC 块。
语法
在 DEFINE 块中使用的 EXEC 语句语法:
.----------------.
V |
>>-%EXEC------"-----+----------+--+---"------------------------><
+-字符串---+
+-变量引用-+
'-函数调用-'
在 FUNCTION 块中使用的 EXEC 块语法:
.---------------.
V |
>>-%EXEC------{----+-字符串---+--+---%}------------------------><
+-变量引用-+
'-函数调用-'
值
上下文
可以在这些上下文中找到 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 块,则它必须是 FUNCTION 块中唯一的可执行语句。 在把此可执行语句传递给语言环境之前,Net.Data 把 EXEC 块中此程序的文件名 追加到由初始化文件中的 EXEC_PATH 配置语句所确定的路径名。结果字符串被传递 到语言环境去执行。
语言环境用于处理 EXEC 块的方法依赖于特定的语言环境;Net.Data 提供的 REXX、 System 和 Perl 语言环境支持 EXEC 块。
当匹配 Net.Data 语言结构语法的字符在函数块的语言结构节中作为一部分语法上有效的嵌入程 序码(例如 REXX 或 Perl)使用时,它们可能被作为 Net.Data 语言结构而被误解释,因而导致 错误或宏中不可预测的结果。
例如,Perl 函数可能使用 COMMENT 块定界符 %{。运行宏时,%{ 被作为 COMMENT 快的开头来 解释。然后 Net.Data 查找 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------+ '-datatype--'
'-INOUT----'
返回说明
|---+----------------------+------------------------------------|
'-RETURNS--(--名称--)--'
函数体
|---+-------------------+--------------------------------------->
| .--------------. |
| V | |
+----内联语句块---+-+
'-执行块------------'
>-----+----------------------------------+----------------------|
| .---------------. |
| V (2) | |
+----报表块--------+---+---------+-+
| '-消息块--' |
| .--------------------. |
| V | |
'-消息块-----+--------------+--+---'
| (2) |
'-报表块-------'
记录:
值
上下文
可以在这些上下文中找到 FUNCTION 块:
限制
DB2 具有以下限制:
例
以下例子是一般例子,没有覆盖所有的语言环境。参阅 Net.Data 语言环境参考获取更多使用具有特定语言环境的 FUNCTION 块的信息。
例 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。对应于 IN 参数 c,它们的值和 y 的值应当已经从 HTML 格式输入 或 DEFINE 语句中定义。当参数 a 和b 返回值时,变量 a 和 b 被赋予新值。当 OUT 参数 d 返回值时变量 z 接受定义。
/* 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 解释程序,让它执行 外部的 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。因为 my_rexx_pgm FUNCTION 块的定义中未使用 RETURNS 子句,所以如果返回代码是 0,则 @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 语句中的值把 IBM 替换为 $(x),12345 替换为 $(y)。因为 SQL 函数 query_1 的定义没有指明输出表格变量, 因此将使用缺省的表格(请参阅 TABLE 变量块中的细节)。在 REPORT 块中 引用的 NLIST 和 Vi 变量是由缺省的表格定义所定义的。由 REPORT 块产生的报表放置在输出的 HTML 中,在其中调用 query_1 函数。
例 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";
遇到 @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 相比较,看如何使用 EXEC 块。例 4 中,System (系统)语言环 境并不了解如何解释 Perl 程序,但是此语言环境知道如何调用外部程序。EXEC 块告诉它调用称为
perl 的一个外部程序。实际 的 Perl 语言语句是由外部 Perl 程序解释的。例 5 没有 EXEC块,因为 Perl 语言环境能够直接解 释 Perl 语言语句。
目的
以指定的参数调用 FUNCTION 块、MACRO_FUNCTION 块或内部函数。如果函数不是内部函数,则必须在指定函数调用之前,先在 Net.Data 宏中定义它。
语法
>>-@function_name---(------------------------------------------->
>-----+-------------------------------------+--)---------------><
| .-,------------------------------. |
| V | |
'----+-变量名--------------------+--+-'
+-变量引用------------------+
+-函数调用------------------+
| .---------------. |
| V | |
'-"----+-字符串---+--+---"--'
+-变量引用-+
'-函数调用-'
值
上下文
可以在这些上下文中找到函数调用:
限制
例
例 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>
&atsign;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>
&atsign;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。
语法
.------------------------.
V |
>>-%HTML----(--名称--)----{-----+------------------+--+---%}---><
+-exec_sql 语句----+
+-变量引用---------+
+-条件块-----------+
+-函数调用---------+
+-HTML 语句--------+
+-包含语句---------+
+-include_url 语句-+
'-循环块-----------'
值
上下文
可以在这些上下文中找到 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 块提供测试一个或多个条件的能力,然后基于条件测试的结果执行一个语句块。您可以在 一个 Net.Data 宏的声明部分、HTML 块、MACRO_FUNCTION 块、REPORT 块、 WHILE 块、 ROW 块中使用 IF 块,也可嵌套在另一个 IF 块内部。
如果条件列表中的字符串值是代表整数的字符串,并且没有前导或尾随空格,则作为数值型 进行比较。它们可以有一个单个的前导加号(+)或者减号(-)。
限制:Net.Data 不支持非整型数的数值比较;例如,浮点型数值的比较。
嵌套的 IF 块:IF 块的语法规则是由块在宏中的位置确定的。如果 IF 块嵌套在一个 IF 块内,而后者在声明部分中任何其它块的外部,则它可以使用外部块 可以使用的任何成分。如果 IF 块嵌套在另一个嵌套在某个 IF 块的块中,则它遵循它所处的那个模 块的语法规则。
在下面的例子中,嵌套的 IF 块必须遵循在它处于一个 HTML 块中时使用的规则。
%IF 块
...
%HTML 块
...
%IF 块
最多可以嵌套 1024 个 IF 块。
语法
>>-%IF--| condition list |-------------------------------------->
>-----| statement_block |--| else_if spec |--%ENDIF------------><
condition list
|---(--+-(--条件列表--)----------+---)--------------------------|
+-条件列表--&&--条件列表--+
+-条件列表--||--条件列表--+
+-!--条件列表-------------+
+-| 条件 |----------------+
'-| 条件项 |--------------'
statement_block
.------------------------------.
V |
|------+------------------------+--+----------------------------|
| (1) |
+-定义块-----------------+
| (1) |
+-定义语句---------------+
| (2) |
+-exec_sql 语句----------+
| (1) |
+-函数块-----------------+
+-函数调用---------------+
| (1) |
+-HTML 块----------------+
| (2) |
+-HTML 语句--------------+
+-条件块-----------------+
+-包含语句---------------+
+-include_url 语句-------+
| (1) |
+-macro_function 块------+
| (1) |
+-消息块-----------------+
| (2) |
+-字符串-----------------+
| (2) |
+-变量引用---------------+
| (2) |
'-循环块-----------------'
条件
|---条件项--+-<--+---条件项-------------------------------------|
+->--+
+-<=-+
+->=-+
+-!=-+
'-==-'
条件项
|---+-变量名--------------------+-------------------------------|
+-变量引用------------------+
+-函数调用------------------+
| .---------------. |
| V | |
'-"----+-字符串---+--+---"--'
+-变量引用-+
'-函数调用-'
else_if spec
|---+---------------------------------------------------------------+->
| .----------------------------------------------------. |
| V | |
'--+----%ELIF--(--condition_list--)--| statement_block |---+-+--'
'-%ELSE--| statement_block |------------------------------'
>---------------------------------------------------------------|
记录:
值
如果两者有一个不为真,则执行一个一般的字符串比较。
上下文
可以在这些上下文中找到 IF 块:
限制
当 IF 块位于 Net.Data 宏声明部分中的任何其它块之外时,它可以包含这些成份:
如果 IF 块位于 Net.Data 宏的 HTML 块、MACRO_FUNCTION 块、REPORT 块、ROW 块或 WHILE 块中,则它可以包含这些成份:
最多可以嵌套 1024 个 IF 块。
例
例 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 管理与程序设计指南的 配置一章中关于指定 Web 服务器对 Net.Data 文件的访问权限这一部分,以获取更多信息。
提示:如果想要包含本地 Web 服务器中的某个 HTML 文件,则 如例 3 中所示的 INCLUDE_URL 使用 INCLUDE_URL 结构。通过使用所演示的语法,您不必更新 Net.Data 初始化文件中的 INCLUDE_PATH 来指定其实 Web 服务器已经知道的目录。
语法
.---------------.
V |
>>-%INCLUDE----"----+-字符串---+--+---"------------------------><
'-变量引用-'
值
上下文
可以在这些上下文中找到 INCLUDE 语句:
限制
INCLUDE 语句可以包含这些成份:
字符串中的函数调用是不允许的。
最多可以嵌套 10 个 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 语句,可以从另一个宏中调用一个宏,而不用要求应用程序用 户选择“递交”按钮。
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---"------+-字符串---+--+--"--------------------><
'-变量引用-'
值
上下文
可以在这些上下文中找到 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"
提示:使用这种方法,您不必更新 Net.Data 配置文件中的 INCLUDE_URL 路径来指定 Web 服务器其实已经知道的目录。如果此字符串 不是以斜杠开头的,则 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 作为变量传递。如果此字符串是以斜杠开头的,则 Net.Data 在本 地 Web 服务器上检索此 INCLUDE 文件。
目的
构建一张定界的值的列表。在构建带多个条件项(例如 在某些 WHERE 或 HAVING 子句中可找到的项目)的 SQL 查询时,可以使用 LIST 语句。
语法
.----------------.
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--函数名--| 参数传递说明 |-------------------->
(4)
>-----| 返回说明 |-------{--| 函数体 |----%}-------------------->
.--------------------.
V |
>--------+--------------+--+--%}-------------------------------><
| (3) |
'-报表块-------'
参数传递说明
|---(--+-----------------------------+---)----------------------|
| .-,---------------------. |
| | (1) | |
| V .-IN-------. | |
'----+----------+---名称---+--'
+-OUT------+
'-INOUT----'
返回说明
(4)
|----------+----------------------+-----------------------------|
'-RETURNS--(--名称--)--'
函数体
.-----------------------------.
V |
|------+-----------------------+--+-----------------------------|
+-exec_sql 语句---------+
+-变量引用--------------+
+-条件块----------------+
+-函数调用--------------+
+-HTML 语句-------------+
+-包含语句--------------+
| (2) |
+-include_url 语句------+
'-循环块----------------'
记录:
值
上下文
可以在这些上下文中找到 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 块在作用域上可以是全局的、或局部于一个 FUNCTION 块。如果 MESSAGE 块是在最外层定义的,则认为它的作用域是全局的。当定义多个 全局 MESSAGE 块时,只有最后一个被处理的模块是活动的块。如果 MESSAGE 块是 在 FUNCTION 块中定义的,则此块的作用域局限于定义它的 FUNCTION 块。请 参阅 Net.Data 管理与程序设计指南中的 MESSAGE 块,获取有关返回码的处理规则。
语法
>>-%MESSAGE--{-------------------------------------------------->
.------------------------------------------------------------------------.
V |
>--------+------------------------------------------------------------------+--+>
'--+-| 返回码说明 |--+--:---| 消息文本说明 |----+---------------+--'
'-| SQLSTATE |----' '-| 操作说明 |--'
>----%--}------------------------------------------------------><
返回码说明
|---+-DEFAULT------------+--------------------------------------|
+-+DEFAULT-----------+
+- -DEFAULT----------+
+-+----+---msg_code--+
| +- --+ |
| '-+--' |
+-包含语句-----------+
'-include_url 语句---'
SQLSTATE
|---SQLSTATE--:------state_id-----------------------------------|
消息文本说明
.----------------.
V |
|----+-"-----+----------+--+---"---+----------------------------|
| +-字符串---+ |
| +-变量引用-+ |
| +-函数调用-+ |
| '-(换行)---' |
| .----------------. |
| V | |
+-{-----+----------+--+---%}--+
| +-字符串---+ |
| +-变量引用-+ |
| '-函数调用-' |
+-包含语句--------------------+
'-include_url 语句------------'
操作说明
.-EXIT-----.
|---+-:--+----------+---+---------------------------------------|
| '-CONTINUE-' |
+-包含语句----------+
'-include_url 语句--'
值
上下文
可以在这些上下文中找到 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 块
%{ 全局消息块 %}
%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"
%}
目的
格式化来自一个函数调用的输出。可以输入一个表格名称参数,指定此报表将使用已命名的表格中 的数据。否则,此报表由函数参数列表中找到的第一个输出表格来生成,或者如果在此列表中找 不到表格名称,则用缺省的表格数据来生成。
语法
.------------------------.
V |
>>-%REPORT----+-------------+--{-------+------------------+--+-->
'-(--名称--)--' +-字符串-----------+
+-条件块-----------+
+-变量引用---------+
+-函数调用---------+
+-HTML 语句--------+
+-包含语句---------+
+-include_url 语句-+
'-循环块-----------'
.------------------------.
V |
>-----+------+------+------------------+--+--%}----------------><
'-行块-' +-字符串-----------+
+-条件块-----------+
+-变量引用---------+
+-函数调用---------+
+-HTML 语句--------+
+-包含语句---------+
+-include_url 语句-+
'-循环块-----------'
值
上下文
可以在这些上下文中找到 REPORT 块:
限制
REPORT 块可以包含这些成份:
对于 OS/390、OS/2、Windows NT 和 UNIX 操作系统: 不能在 SQL 函数内部调用 SQL 函数。
对于 OS/390: MACRO_FUNCTION 块中不允许 REPORT 块。
例
例 1:一张显示名称和位置列表的双列 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>
%}
若在表格中选择一个名称,则调用 Net.Data 宏 name.mac 中详细的 HTML 块,并把这两个值作 为 URL 的一部分发送给它。对于此例子,可以在 name.mac 中 使用这些值来查找有关名称的其它细节。
目的
处理返回自一个函数调用的每个表格行。Net.Data 为表格中的每一行 处理一次 ROW 块中的语句。
语法
.------------------------.
V |
>>-%ROW--{-------+------------------+--+--%}-------------------><
+-字符串-----------+
+-条件块-----------+
+-变量引用---------+
+-函数调用---------+
+-HTML 语句--------+
+-包含语句---------+
+-include_url 语句-+
'-循环块-----------'
值
上下文
可以在这些上下文中找到 ROW 块:
限制
ROW 块可以包含这些成份:
对于 OS/390、OS/2、Windows NT 和 UNIX 操作系统: 不能在 SQL 函数内部调用 SQL 函数。
例
例 1:一张显示名称和位置列表的双列 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>
%}
若在表格中选择一个名称,则调用 Net.Data 宏 name.mac 中详细的 HTML 块,并把这两个值作 为 URL 的一部分发送给它。对于此例子,可以在 name.mac 中 使用这些值来查找有关名称的其它细节。
目的
定义一个变量,它是一个相关数据的集合。此变量包含一系列行和列,包括一行描述 各行字段的列标题。表格语句只能在 DEFINE 语句或模块中。
引用 TABLE 变量时,Net.Data 将该表格的内容作为平面字符表格显示, 或者在 DTW_HTML_TABLE 变量设置为 YES 时将其作为 HTML 表格显示。
语法
>>-%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 块、REPORT 块、ROW 块和 MACRO_FUNCTION 块中使用 WHILE 块。如果条件列表中的字符串值是代表整数的字符串,并且没有前导或尾随空格,则作为数值型 进行比较。它们可以有一个单个的前导加号(+)或者减号(-)。
语法
.------------------------.
V |
>>-%WHILE--| condition list |---{-------+------------------+--+->
+-exec_sql 语句----+
+-函数调用---------+
+-HTML 语句--------+
+-条件块-----------+
+-包含语句---------+
+-include_url 语句-+
+-循环块-----------+
+-变量引用---------+
'-字符串-----------'
>----%}--------------------------------------------------------><
condition list
|---(--+-(--条件列表--)----------+---)--------------------------|
+-条件列表--&&--条件列表--+
+-条件列表--||--条件列表--+
+-!--条件列表-------------+
+-| 条件 |----------------+
'-| 条件项 |--------------'
条件
|---条件项--+-<--+---条件项-------------------------------------|
+->--+
+-<=-+
+->=-+
+-!=-+
'-==-'
条件项
|---+-变量名--------------------+-------------------------------|
+-变量引用------------------+
+-函数调用------------------+
| .---------------. |
| V | |
'-"----+-字符串---+--+---"--'
+-变量引用-+
'-函数调用-'
值
如果两者有一个不为真,则执行一个一般的字符串比较。
上下文
可以在这些上下文中找到 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)
%}
%}