在宏文件中可以使用以下变量引用类型:
如果您将字符串赋给变量,而变量由 Net.Data 定义为某种方式,例如 ENVVAR、LIST、 条件列表变量,则变量不再表现为定义的方式。换句话说,变量成为一个包含字符串的简单变量。
条件变量让您通过使用类似于 IF、THEN 结构的方法来为一个变量定义一个 条件值。在定义条件变量时,可以指定两个可能的变量值。如果引用的第一个变量存在,条件变量 将获取第一个值;否则获取第二个值。条件变量的语法是:
varA = varB ? "value_1" : "value_2"
如果 varB 已定义,则 varA="value_1",否则 varA="value_2"。这是等价于使用 IF 块, 如下例所示:
%IF $(varB) varA = "value_1" %ELSE varA = "value_2" %ENDIF
请参阅列表变量以获取使用条件变量与列表变量的例子。
您可以引用存在于运行 Net.Datav 的进程中的 Net.Data 环境变量。
定义环境变量的语法是:
%define var=%ENVVAR
其中 var 是定义的变量名。
例如,变量 SERVER_NAME 可被定义为环境变量:
%define SERVER_NAME=%ENVVAR
然后被引用:
The server is $(SERVER_NAME)
输出是这样的:
The server is www.software.ibm.com
请参阅Net.Data 参考以获取关于 ENVVAR 语句的更多信息。
您可以用可执行变量来从变量引用中调用其它函数。
使用 DEFINE 块中的 EXEC 语言结构来定义 Net.Data 宏中的可执行变量。关于 EXEC 语言元素的更多信息,请参阅Net.Data 参考中的语言结构章节。 在下 例中,定义了变量 runit 来执行可执行程序 testProg:
%DEFINE runit=%exec "testProg"runit 成为可执行变量。
Net.Data 在 Net.Data 宏中遇到一个有效变量时运行可执行程序。 例如,当 Net.Data 宏中有一个有效变量引用建立成变量 runit 时,即执行 testProg 程序。
一种简单的方法是从另一个变量定义中引用一个可执行变量。以下例子演示了这个方法。 变量 date 定义成一个可执行变量,dateRpt 定义成一个变量引用,它包含这个可执行变量。
%DEFINE date=%exec "date" %DEFINE dateRpt="Today is $(date)"
不管 $(dateRpt) 出现在 Net.Data 宏中的何处,Net.Data 都搜索可 执行程序 date,并在找出时返回:
Today is Tue 11-07-1999
当 Net.Data 在宏文件中遇到可执行变量时,它将使用下列方法寻找被引用的可执行程序:
限制:不要将可执行变量设置成它调用的可执行程序的输出值。在先前 的例子中,变量 date 的值是空的。如果在 DTW_ASSIGN 函数调用中使用此变量来把它的值 分配给另一个变量,则赋值后新变量的值也是空。 可执行变量的唯一目的是去调用它定义的程序。
也可以给要执行的程序,通过在变量定义上指定此程序名,将参数传送给它。在此例中,距离和 时间的值传送给程序 calcMPH。
%DEFINE mph=%exec "calcMPH $(distance) $(time)"
下一个例子将系统日期作为 HTML 报表的一部分返回:
%DEFINE database="celdial" %DEFINE tstamp=%exec "date" %FUNCTION(DTW_SQL) myQuery() { SELECT CUSTNO, CUSTNAME from dist1.customer %REPORT{ %ROW{ <A HREF="/cgi-bin/db2www/exmp.d2w/report?value1=$(V1)&value2=$(V2)"> $(V1) $(V2) </A> <BR> %} %} %} %HTML (report){ <H1>Report made: $(tstamp) </H1> @myQuery() %}
每个报表都显示日期以便于跟踪。此例还将用户号和名称放在另一个 Net.Data 宏的链接中。单 击报表中的任何用户将调用 exmp.d2w Net.Data 宏,即将用户号和名字传送给 Net.Data 宏。
您可以使用隐藏变量,对用他们的 Web 浏览器察看您的 HTML 源码的用户隐藏应用程序的实际 变量名。要定义隐藏变量:
%HTML(INPUT) { <FORM ...> <P>Select fields to view: shanghai<SELECT NAME="Field"> <OPTION VALUE="$$(name)"> Name <OPTION VALUE="$$(addr)"> Address . . . </FORM> %} %DEFINE{ name="customer.name" addr="customer.address" %} %FUNCTION(DTW_SQL) mySelect() { SELECT $(Field) FROM customer %} . . .
Web 浏览器显示 HTML 表时,$$(name) 和 $$(addr) 分别被替换以 $(name) 和 $(addr),所以实际的表格和列名肯定不出现在 HTML 表上。应用程序用户无法区分实际变量名是隐藏的。当用户提交这个表时,调用 HTML(REPORT) 块。 当 @mySelect() 调用 FUNCTION 块时,$(Field) 在 SQL 语句中用 SQL 查询的 customer.name 或 customer.addr 替换。
使用列表变量来构建一个定界的值字符串。 当要构建一个具有多个项目的 SQL 查询时 (象某些 WHERE 或 HAVING 语句一样),它们特别有用。 列表变量的语法是:
%LIST " value_separator " variable_name
建议:空格是必须的。在大多数情况下,在值分隔符之前和之后都插 一个空格。大部分查询都为值分隔符使用布尔或数学运算符(例如,AND、OR 或 >)。 下例说明条 件、隐藏和列表变量的使用:
%HTML(INPUT) { <FORM METHOD="POST" ACTION="/cgi-bin/db2www/example2.d2w/report"> <H2>Select one or more cities:</H2> <INPUT TYPE="checkbox" NAME="conditions" VALUE="$$(cond1)">Sao Paola<BR> <INPUT TYPE="checkbox" NAME="conditions" VALUE="$$(cond2)">Seattle<BR> <INPUT TYPE="checkbox" NAME="conditions" VALUE="$$(cond3)">Shanghai<BR> <INPUT TYPE="submit" VALUE="Submit Query"> </FORM> %} %DEFINE{ DATABASE="custcity" %LIST " OR " conditions cond1="cond1='Sao Paolo'" cond2="cond2='Seattle'" cond3="cond3='Shanghai'" whereClause= ? "WHERE $(conditions)" : "" %} %FUNCTION(DTW_SQL) mySelect() { SELECT name, city FROM citylist $(whereClause) %} %HTML(REPORT){ @mySelect() %}
在 HTML 表中,如果没有选择任何框,则条件为空,因此查询中 的 whereClause 也为空。 否则,whereClause 中包含了选定的 值,值之间用 OR 分隔。 例如,如果选择了所有这三个城市,则 SQL 查询为:
SELECT name, city FROM citylist WHERE cond1='Sao Paolo' OR cond2='Seattle' OR cond3='Shanghai'
此例显示已选择 Seattle,这出现在该 SQL 的结果中。
SELECT name, city FROM citylist WHERE cond1='Seattle'
表格变量定义相关数据的集合。它包含一个相同记录或列的数组,和一个在每 一行描述字段的列名的数组。 在 Net.Data 宏中如以下语句中所示地定义一个表格:
%DEFINE myTable=%TABLE(30)
TABLE 后面的数目是对此表格可包含行数的限制。要指定不具有行数限制的表格,可如下例所示 地使用缺省值或指定 ALL:
%DEFINE myTable2=%TABLE %DEFINE myTable3=%TABLE(ALL)
在定义表格时,它具有零行和零列,没有分配存储器。用值填充表格的唯一方式是将 它作为 OUT 或 INOUT 参数来传送给一个函数。DTW_SQL 语言环境自动将 SELECT 语句的结果放到 表格中。
对于其它所有语言环境,例如 DTW_REXX 或 DTW_PERL,语言环境都不自动设置表格值 。但是表格的单个元素可作为输出参数用于本机语言解释器,并且必须由正在执行的脚本或程序进 行设置。请参阅语言环境参考中的语言环境说明以获取详细信 息。
您可以通过引用表格变量名来传送一个表格。还可以在一个函数的 REPORT 块中引用表格中的个别元素。 请 参阅表格处理变量,以获取细节。 在 SQL 函数中表格变量通常是填充了值的,然后,表格变量在 SQL 函数或另一个函数中在作为参 数传送给该函数之后,被用作对报表的输入。您可以将表格变量作为 IN、OUT 或 INOUT 参数传送 给任何非 SQL 函数。表格只能作为 OUT 参数传递给 SQL 函数。
表格中的列名和字段值被编址为起始地址为 1 的数组元素,而不象标准 C 和 C++ 语言将起始 数组约定为 0。
这些变量是 Net.Data 定义的变量,可用来:
杂项变量即可以具有 Net.Data 确定的预定义值,又可具有您设置的值。例如, Net.Data 根据正在处理的当前文件来确定 DTW_CURRENT_FILENAME 变量值,您可以在该文件中指定 Net.Data 是否除去由制表机和新行字符产生的额外空白。
预定义变量在宏文件中用作变量引用,并提供关于一个函数调用的状态、日期或文件的正确状 态。例如,要检索当前文件的名称,可使用:
<p>This file is <i>$(DTW_CURRENT_FILENAME)</i>.</P>
通常使用 DEFINE 语句或 @DTW_ASSIGN() 函数来设置可修改变量值,可修改变量值可让您影响 Net.Data 如何处理宏文件。例如,要指定是否除去空白,可以使用以下 DEFINE 语句:
%DEFINE DTW_REMOVE_WS="YES"
请参阅 Net.Data 参考中的变量章节,以获取带语法和例子的有效杂 项变量列表。
Net.Data 定义表格处理变量供 REPORT 和 ROW 块使用。 使用这些变量从 SQL 查询和函数调用 引用值。
表格处理变量具有一个 Net.Data 确定的预定义值,并允许您引用由正在处理的行、列或字段所 调用的函数或者 SQL 查询的结果集中的值。您还可以访问关于正在处理的行数的信息或所有列名列表。
例如,在 Net.Data 处理来自 SQL 查询的结果集时,它为每个当前列名指定变量值,即 N1 赋给第一列,N2 赋给第二列等等。您可以为 HTML 输出引用列名。
在宏文件中使用处理变量作为变量引用。例如,要检索正在处理的当前列名,可使用:
<p>Column 1 is <i>$(N1)</i>.</P>
表格处理变量还提供关于查询结果的信息。如下例所示,您可以在宏中引 用变量 TOTAL_ROWS 来显示在 SQL 查询中返回多少行。
Names found: $(TOTAL_ROWS)
一些表格处理变量受其它变量或内部函数的影响。例如, TOTAL_ROWS 要求 DTW_SET_TOTAL_ROWS SQL 语言环境变量是激活的,因此在处理来自 SQL 查询或 函数调用的结果时,Net.Data 指定 TOTAL_ROWS 的值,这如下例所示:
%DEFINE DTW_SET_TOTAL_ROWS="YES" ... Names found: $(TOTAL_ROWS)
请参阅 Net.Data 参考中的变量章节,以获取带语法和例子的有效表 格处理变量列表。
Net.Data 以缺省报表格式显示宏文件生成的 HTML 输出。缺省报表格式使用 <PRE> </PRE> 标记以表格格式进行显示。通过用显示输出的说明来定义 REPORT 块,或通过 使用报表变量之一来防止生成缺省报表,可以覆盖缺省报表。
报表变量有助于您定制如何显示 HTML 输出以及如何与缺省报表和 Net.Data 表格一 起使用。必须先定义这些变量,然后才可以在 DEFINE 语句或 @DTW_ASSIGN() 函数中使用它们。
报表变量指定空格、覆盖缺省报表格式、指定相对于缺省报表输出的 HTML 表格以及其它功能。 例如,您可以使用 ALIGN 变量来控制表格处理变量的前导和尾随空格。下例使用 ALIGN 变量用一 个空格来分割列表中每个行名,这是由一个查询来返回的。
%DEFINE ALIGN="YES" ... <p>Your query was on these columns: $(NLIST)
START_ROW_NUM 报表变量让您确定从哪一行开始显示查询的结果。例如, 以下变量值指定了 Net.Data 将在第三行开始显示查询的结果。
%DEFINE START_ROW_NUM = "3"
您还可以确定 Net.Data 是否对缺省格式使用 HTML 标记。 当 DTW_HTML_TABLE 设置为 YES 时,将生成一个 HTML 表格而不是文本格式的表格。
%DEFINE DTW_HTML_TABLE="YES" %FUNCTION(DTW_SQL){ SELECT NAME, ADDRESS FROM $(qTable) %}
请参阅 Net.Data 参考中的变量章节,以获取带语法和例子的有效报 表变量列表。
这些变量与语言环境一起使用并影响语言环境处理请求的方式。必须使用 DEFINE 语 句或 @DTW_ASSIGN() 函数,在引用之前定义这些变量。 在适当的 Net.Data 宏块中设置或引用语言环境变量。
使用这些变量,您可以执行诸如这样的任务:建立与数据库的连接、 为 Java 小程序提 供替换文本和建立 NLS 支持。
例如,您可以使用 SQL_STATE 变量来访问或者显示从数据库返回的 SQL 状态值。
%FUNCTION (DTW_SQL) val1() { select * from customer %REPORT { ... %ROW { ... %} SQLSTATE=$(SQL_STATE) %}
下一个例子显示怎样定义要访问哪个数据库。
%DEFINE DATABASE="CELDIAL"
请参阅 Net.Data 参考中的变量章节,以获取带语法和例子的有效语 言环境变量列表。