本章节描述 Net.Data 宏文件中使用的 Net.Data 宏语言结构。
每个语言结构说明可以包含以下信息:
宏中使用以下结构;请参阅每个结构说明的语法和例子。
目的
把 Net.Data 宏的函数文档化。因为可以在宏文件的任何地方使用 COMMENT (注解)块, 所以它不在其它语法图中再作说明。
语法
>>-%{---文本---%}----------------------------------------------><
值
上下文
可以在一个 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 %} %}
目的
DEFINE 段定义宏的声明部分中的变量名,它或可以是一个语句,或是一个块。
用双引号(""),变量定义可以在单行中;使用方括号或百分号({ %}),则可以跨多行。 在定义变量后,您可以在宏的任何地方引用它。
语法
>>-%DEFINE----+-| 定义条目 |---------------------+------------->< '-{--+---------------------+---%}--' | .---------------. | | 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 如何获取在值 ("")内部的结果值。在下面的例子中,$(V) 和 MyFunc 都不可 有 NULL 结果。
%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) { The server is $(SERVER_SOFTWARE). %}
目的
当引用变量或调用某函数时,指定要执行的外部程序。
当引用变量或调用函数时,Net.Data 首先查找 Net.Data 初始化文件中 EXEC_PATH 变 量指定的目录,如果找不到,则把可执行文件的名称传送给系统外壳程序。
权限提示:确保此 Web 服务器具有对 EXEC 语句或块引用的任 何文件的访问权。请参阅 Net.Data 管理和程序设计指南的 配置一章中关于指定 Web 服务器对 Net.Data 文件的访问权限这一部分,以获取更多信息。
EXEC 语句和块在两种上下文中使用,根据使用的不同场合,它们可以有不同的语法。在 DEFINE 块中使用 EXEC 语句,在 FUNCTION 块中使用 EXEC 块。
语法
在 DEFINE 块中使用的 EXEC 语句语法:
.----------------. V | >>-%EXEC------"-----+----------+--+---"------------------------>< +-字符串---+ +-变量引用-+ '-函数调用-'
在 FUNCTION 块中使用的 EXEC 块语法:
.---------------. V | >>-%EXEC------{----+-字符串---+--+---%}------------------------>< +-变量引用-+ '-函数调用-'
值
上下文
可以在这些上下文中找到 EXEC 块或语句:
限制
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 块的方法依赖于特定的语言环境。只有 REXX、 System 和 Perl Net.Data 提供的语言环境支持 EXEC 块。
语法
>>-%FUNCTION--(--语言环境--)--函数名--| 参数传递说明 |----------> .-;----------------------------------. >-----+-| 返回说明 |--{--| 函数体 |----%}--+------------------->< 参数传递说明 |---(--+-----------------------------+---)----------------------| | .-,---------------------. | | | (1) | | | V .-IN-------. | | '----+----------+---名称---+--' +-OUT------+ '-INOUT----' 返回说明 |---+----------------------+------------------------------------| '-RETURNS--(--名称--)--' 函数体 |---+-------------------+---------------------------------------> | .--------------. | | V | | +----内联语句块---+-+ '-执行块------------' >-----+----------------------------------+----------------------| | .---------------. | | V (2) | | +----报表块--------+---+---------+-+ | '-消息块--' | '-消息块--.--------------------. | V | | ---+--------------+--+---' | (2) | '-报表块-------'
记录:
值
上下文
可以在这些上下文中找到 FUNCTION 块:
限制
FUNCTION 块可以包含这些成份:
只有 REXX、System 和 Perl Net.Data 提供的语言环境支持 EXEC 语句。
例
以下例子是一般例子,没有覆盖所有的语言环境。 参阅 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 | | '----+-变量名--------+--+-' +-"--字符串--"--+ +-变量引用------+ '-函数调用------'
值
上下文
可以在这些上下文中找到函数调用:
限制
例
例 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) %}
目的
包含任何将由客户的 Web 浏览器或任何可以理解 HTML 的工具进行处理的 HTML 标记或文本。 HTML 块还包含大部分 Net.Data 宏语言语句,这些语句在运行时求值和执行。Net.Data 查找 Net.Data 宏语句并执行之。 Net.Data 假定所有其它的文本都是 HTML 的,并把它发送给 Web 服务器。
语法
.------------------------. 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" %}
可以执行有条件的字符串 处理。 IF 块提供测试一个或多个条件的能力,然后基于条件测试的结果执行一个语句块。您可以在 一个 Net.Data 宏的声明部分、HTML 块、MACRO_FUNCTION 块、REPORT 块、 WHILE 块、 ROW 块中使用 IF 块,也可嵌套在另一个 IF 块内部。
如果条件列表中的字符串值是代表整数的字符串,并且没有前导或尾随空格,则作为数值型 进行比较。 它们可以有一个单个的前导加号(+)或者减号(-)。
限制: Net.Data 不支持非整型数的数值比较。例如浮点数。
嵌套的 IF 块:IF 块的语法规则是由块在宏文件中的位置确定 的。如果 IF 块嵌套在一个 IF 块内,而后者在声明部分中任何其它块的外部,则它可以使用外部块 可以使用的任何元素。如果 IF 块嵌套在另一个嵌套在某个 IF 块的块中,则它遵循它所处的那个模 块的语法规则。
在下面的例子中,嵌套的 IF 块必须遵循在它处于一个 HTML 块中时使用的规则。
%IF b块 ... %HTML 块 ... %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) | '-循环块-----------------' 条件 |---条件项--+-<--+---条件项-------------------------------------| +->--+ +-<=-+ +->=-+ +-!=-+ '-==-' 条件项 |---+-变量引用------+-------------------------------------------| +-"--字符串--"--+ +-变量名--------+ '-函数调用------' 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 块中,则它可以包含这些成份:
例
例 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 块。
权限提示:确保此 Web 服务器具有对 INCLUDE 语句引用的任 何文件的访问权。请参阅 Net.Data 管理和程序设计指南的 配置一章中关于指定 Web 服务器对 Net.Data 文件的访问权限这一部分,以获取更多信息。
提示:如果想要包含本地 Web 服务器中的某个 HTML 文件,则 如例 3 中所示的 INCLUDE_URL 使用 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 语句,可以从另一个宏中调用一个宏,而不用要求应用程序用 户选择“递交”按钮。
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 语句可以包含这些成份:
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 cond1="cond1='Sao Paolo'" cond2="cond2='Seattle'" cond3="cond3='Shanghai'" whereClause=conditions ? "WHERE $(conditions)" : "" %}
目的
定义一个可以从 Net.Data 宏中进行调用的子程序。MACRO_FUNCTION 块中的可执行语 句必须是 Net.Data 宏语言源语句。
语法
>>-%MACRO_FUNCTION--函数名--| 参数传递说明 |----{--| 函数体 |---> >-----+--------------+--%}------------------------------------->< | (3) | '-报表块-------' 参数传递说明 |---(--+-----------------------------+---)----------------------| | .-,---------------------. | | | (1) | | | V .-IN-------. | | '----+----------+---名称---+--' +-OUT------+ '-INOUT----' 函数体 .-----------------------------. V | |------+-----------------------+--+-----------------------------| +-exec_sql 语句---------+ +-变量引用--------------+ +-条件块----------------+ +-函数调用--------------+ +-HTML 语句-------------+ +-包含语句--------------+ | (2) | +-include_url 语句------+ '-循环块----------------'
记录:
值
上下文
可以在这些上下文中找到 MACRO_FUNCTION 块:
限制
此结构在 OS/390 操作系统中不可用。
MACRO_FUNCTION 块可以包含这些成份:
不支持 OS/400
只支持 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--+ | +- --+ | | '-+--' | '-包含语句-----------' SQLSTATE |---SQLSTATE--:----+-state_id-------+---------------------------| '-字母数字字符串-' 消息文本说明 .----------------. V | |----+-"-----+----------+--+---"---+----------------------------| | +-字符串---+ | | +-变量引用-+ | | +-函数调用-+ | | '-(换行)---' | | .----------------. | | V | | +-{-----+----------+--+---%}--+ | +-字符串---+ | | +-变量引用-+ | | '-函数调用-' | '-包含语句--------------------' 操作说明 .-EXIT-----. |---+-:--+----------+-+-----------------------------------------| | '-CONTINUE-' | '-包含语句--------'
值
上下文
可以在这些上下文中找到 MESSAGE 块:
限制
MESSAGE 块可以包含这些成份:
OS/400 平台不支持 SQLSTATE。
例
例 1: 一个本地 MESSAGE 块
%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>" %}
例 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 平台: 不能在 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 中 使用这些值来查找有关名称的其它细节。
目的
处理返回自一个函数调用的每个表格行。Net.Data 为表格中的每一行 处理一次 ROW 块中的语句。
语法
.------------------------. V | >>-%ROW--{-------+------------------+--+--%}------------------->< +-字符串-----------+ +-条件块-----------+ +-变量引用---------+ +-函数调用---------+ +-HTML 语句--------+ +-包含语句---------+ +-include_url 语句-+ '-循环块-----------'
值
上下文
可以在这些上下文中找到 ROW 块:
限制
ROW 块可以包含这些成份:
对于 OS/390 平台: 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--| 上限 |-------------------------------------------->< 上限 |---+------------------+----------------------------------------| '-(--+-数值-+---)--' '-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--| 条件列表 |---{-------+---------------+--+--%}----->< +-exec_sql 语句-+ +-函数调用------+ +-HTML 语句-----+ +-条件块--------+ +-循环块--------+ +-变量引用------+ '-字符串--------' 条件列表 |---(--+-(--条件列表--)----------+---)--------------------------| +-条件列表--&&--条件列表--+ +-条件列表--||--条件列表--+ +-!--条件列表-------------+ +-| 条件 |----------------+ '-| 条件项 |--------------' 条件 |---条件项--+-<--+---条件项-------------------------------------| +->--+ +-<=-+ +->=-+ +-!=-+ '-==-' 条件项 |---+-变量引用------+-------------------------------------------| +-"--字符串--"--+ +-变量名--------+ '-函数调用------'
值
如果两者有一个不为真,则执行一个一般的字符串比较。
上下文
可以在这些上下文中找到 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) %} %}