在宏在可以使用以下类型的变量。
如果您将字符串赋给变量,而变量由 Net.Data 定义为某种方式,例如 ENVVAR、LIST、 条件列表变量,则变量不再表现为定义的方式。换句话说,变量成为一个包含字符串的简单变量。
参见 Net.Data 参考中每个变量的语法和示例。
条件变量让您通过使用类似于 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
参见列表变量以获取使用条件变量与列表变量的示例。
您可以引用那些 Web 服务器使之对正在处理您的 Net.Data 请求的进程或线程可用的环境变量。当引用 ENVVAR 变量时,Net.Data 返回同名的环境变量的当前值。
定义环境变量的语法是:
%DEFINE var=%ENVVAR
其中 var 是要定义的环境变量名。
例如,变量 SERVER_NAME 可被定义为环境变量:
%DEFINE SERVER_NAME=%ENVVAR
然后被引用:
The server is $(SERVER_NAME)
输出类似于:
The server is www.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 的值为空 (NULL)。如果在 DTW_ASSIGN 函数调用中使用此变量来把它的值 分配给另一个变量,则赋值后新变量的值也是空 (NULL)。 可执行变量的唯一目的是去调用它定义的程序。
也可以给要执行的程序,通过在变量定义上指定此程序名,将参数传送给它。在此例中,距离和 时间的值传送给程序 calcMPH。
%DEFINE mph=%EXEC "calcMPH $(distance) $(time)"
下一个示例将系统日期作为报告的一部分返回:
%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 浏览器查看您的 Web 页面源码的用户隐藏应用程序的实际 变量名。要定义隐藏变量:
%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 Paolo<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 表中,如果没有选择任何校验框,则 conditions 为 NULL, 因此查询中的 whereClause 也为 NULL。否则,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 参数来传送给一个函数,或者使用 Net.Data 提供 的内部表函数。DTW_SQL 语言环境自动将 SELECT 语句的结果放到表格中。
对于非数据库语言环境,例如 DTW_REXX 或 DTW_PERL,语言环境也负责设置表格值。当然, 语言环境脚本或程序将逐格定义表格值。参见使用语言环境以获取有关语言环境如何使用表格变量的更多信息。
您可以通过引用表格变量名来传送一个表格。可以在一个函数的 REPORT 块中引用表格中的各个 单独成份,也可以使用 Net.Data 表格函数来实现。参见表格处理变量以了解如何在 REPORT 块中访问表格内的单独成份, 参阅表格函数以了解如何使用表格函数来访问表格的单独成分。 在 SQL 函数中表格变量通常是填充了值的,然后,表格变量在 SQL 函数或另一个函数中在作为参 数传送给该函数之后,被用作对报告的输入。您可以将表格变量作为 IN、OUT 或 INOUT 参数传送 给任何非 SQL 函数。表格只能作为 OUT 参数传递给 SQL 函数。
如果引用了一个表格变量,则将显示表格的内容,并根据 DTW_HTML_TABLE 变量的设置对其进行格式化。在下面的示例中,将显示 myTable 的内容:
%HTML (output) { $(myTable) }
表格中的列名和字段值被编址为起始地址为 1 的数组元素。
这些变量是 Net.Data 定义的变量,可用来:
杂项变量即可以具有 Net.Data 确定的预定义值,又可具有您设置的值。例如, Net.Data 根据正在处理的当前文件来确定 DTW_CURRENT_FILENAME 变量值,您可以在该文件中指定 Net.Data 是否除去由制表机和新行字符产生的额外空白。
预定义变量在宏中用作变量引用,并提供关于一个函数调用的状态、日期或文件的正确状态。例如, 要检索当前文件的名称,可使用:
%REPORT { <p>This file is <i>$(DTW_CURRENT_FILENAME)</i>.</p> }
通常使用 DEFINE 语句或 @DTW_ASSIGN() 函数来设置可修改变量值,可修改变量值可让您 影响 Net.Data 如何处理宏。例如,要指定是否除去空白,可以使用以下 DEFINE 语句:
%DEFINE DTW_REMOVE_WS="YES"
Net.Data 定义表格处理变量供 REPORT 和 ROW 块使用。使用这些变量从 SQL 查询和函数调用 引用值。
表格处理变量具有 Net.Data 确定的预定义值。这些变量允许您引用由正在处理的行、列或字段所调用的函数或者 SQL 查询的结果集中的值。您还可以访问关于正在处理的行数的信息或所有列名列表。
例如,在 Net.Data 处理来自 SQL 查询的结果集时,它为每个当前列名指定变量值,即 N1 赋给第一列,N2 赋给第二列等等。您可以为 Web 页面输出引用当前列名。
在宏中使用处理变量作为变量引用。例如,要检索正在处理的当前列名,可使用:
%REPORT { <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 以缺省报告格式显示宏生成的 Web 页面输出。在 HTML 块中,缺省报告格式使用 <pre> </pre> 标记显示表,在 XML 块中,使用的是 <RowSet>、<Row> 和 <Column> 标记。通过用显示输出的说明来定义 REPORT 块,或通过使用报告变量之一来防止生成缺省报告,可以覆盖缺省报告。
报告变量有助于您定制如何显示 Web 页面输出以及如何与缺省报告 和 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) %}
这些变量与语言环境一起使用并影响语言环境处理请求的方式。
通过使用这些变量,您可以执行诸如这样的任务:建立与数据库的连接、为 Java 小应用程序提供替换文本、启用 NLS 支持以及确定 SQL 语句的执行是否成功。
例如,您可以使用 SQL_STATE 变量来访问或者显示从数据库返回的 SQL 状态值。
%FUNCTION (DTW_SQL) val1() { select * from customer %REPORT { ... %ROW { ... %} SQLSTATE=$(SQL_STATE) %}
下一个示例显示怎样定义要访问哪个数据库。
%DEFINE DATABASE="CELDIAL"