使用 REPORT 块语言结构来格式化并显示来自 FUNCTION 块的数据输出。这个输出通常是表格数据, 尽管可以指定文本、宏变量引用和函数调用的任何有效组合。通常可以任选地在 REPORT 块上指定表名。如果没有指定表格名称,Net.Data 将使用 FUNCTION 参数列表中第一个输出表格的表格数据。
REPORT 块具有三部分,每部分都是可选的:
例子:
%REPORT{
<H2>Query Results</H2>
<P>Select a name for details.
<TABLE BORDER=1>
<TR>
<TD>Name</TD>
<TD>Location</TD></TR>
%ROW{
<TR>
<TD>
<a href="/cgi-bin/db2www/name.d2w/details?name=$(V1)&location;=$(V2)">$(V1)</a>
</TD>
<TD>$(V2)</TD>
</TR>
%}
</TABLE>
%}
在创建 REPORT 块时,请使用以下准则:
SHIPDATE | RECDATE | SHIPNO | ------------------------------------- 25/05/1997 | 30/05/1997 | 1495194B | ------------------------------------- 25/05/1997 | 28/05/1997 | 2942821G | -------------------------------------
%REPORT{%}
下例显示如何使用特殊变量和 HTML 标记来定制报表格式。它显示来自表格 CustomerTbl 的姓名、电话号码和传真号码:
%DEFINE SET_TOTAL_ROWS="YES"
...
%FUNCTION(DTW_SQL) custlist() {
SELECT Name, Phone, Fax FROM CustomerTbl
%REPORT{
<I>Phone Query Results:</I>
<BR>
=====================
<BR>
%ROW{
Name: <B>$(V1)</B>
<BR>
Phone: $(V2)
<BR>
Fax: $(V3)
<BR>
------------------------------
<BR>
%}
Total records retrieved: $(TOTAL_ROWS)
%}
%}
Web 浏览器中的结果报表如下所示:
Phone Query Results: ==================== Name: Doen, David Phone: 422-245-1293 Fax: 422-245-7383 ------------------------------ Name: Ramirez, Paolo Phone: 955-768-3489 Fax: 955-768-3974 ------------------------------ Name: Wu, Jianli Phone: 525-472-1234 Fax: 525-472-1234 ------------------------------ Total records retrieved: 3
Net.Data生成报表是通过:
在一个 FUNCTION 或 MACRO FUNCTION 块中可以指定多个 REPORT 块,从而用一次函数调用生成多个报表。
通常,您将一起使用具有 DTW_SQL 语言环境的多个 REPORT 块和调用存储过程的函数, 该存储过程返回多个结果集(请参阅存储过程)。当然,多个 REPORT 块可以与任何语言环境一起使用来生成多个报表。
要使用多个 REPORT 块,可以在 FUNCTION 参数列表中放置 一个 Net.Data 表格变量。如果存储过程返回的结果集比指定的 REPORT 块的个数多, 并且 Net.Data 内部函数 DTW_DEFAULT_REPORT = "MULTIPLE",则将为每个 不与报表块关联的表格生成缺省报表。如果没有指定报表块,并且 DTW_DEFAULT_REPORT = "YES", 则仅生成一个缺省报表。请注意对于 SQL 语言环境来说,DTW_DEFAULT_REPORT 值为 "YES" 等价于值 "MULTIPLE"。
以下例子演示了使用多个报表块的方式。
要使用缺省的报表格式来显示多个报表:
例 1: DTW_SQL 语言环境
%DEFINE DTW_DEFAULT_REPORT = "MULTIPLE"
%FUNCTION (dtw_sql) myStoredProc (OUT table1, table2) {
CALL myproc %}
在此例中,存储过程 myproc 返回两个结果集, 分别放在 table1 和 table2 中。 因为没有指定 REPORT 块, 因此对于这两个表显示缺省报表,首先显示 table1,然后显示 table2。
例 2: MACRO_FUNCTION 块。在此例中, 两个表格被传送到 MACRO_FUNCTION 块中。在指定 DTW_DEFAULT_REPORT="MULTIPLE" 的情况下,Net.Data 将对 这两个表格生成报表。
%DEFINE DTW_DEFAULT_REPORT = "MULTIPLE"
%MACRO_FUNCTION multReport (INOUT tablename1, tablename2) {
%}
在此例中,两个表格被传送到 MACRO_FUNCTION multReport。 再一次,Net.Data 根据 两个表格出现在 MACRO FUNCTION 块参数列表中的顺序来显示它们的缺省报表,先是 table1, 然后是 table2。
例 3: DTW_REXX 语言环境
%DEFINE DTW_DEFAULT_REPORT = "YES"
%FUNCTION (dtw_rexx) multReport (INOUT table1, table2) {
SAY 'Generating multiple default reports...<BR>'
%}
在此例中,两个表格被传送到 REXX 函数 multReport。 由于 指定了 DTW_DEFAULT_REPORT="YES",Net.Data 仅对第一个表格显示缺省报表。
要通过对显示处理指定 REPORT 块来显示多个报表:
例 1: 已命名的 REPORT 块
%FUNCTION(dtw_sql) myStoredProc (OUT table1, table2) {
CALL myproc (table1, table2)
%REPORT(table2) {
...
%ROW { .... %}
...
%}
%REPORT(table1) {
...
%row { .... %}
...
%}
%}
在此例中,对于在 FUNCTION 块参数列表中传递的两个表格都指定了 REPORT 块。 这些表格是以它们 在 REPORT 块中指定的顺序显示的,先是 table2,然后是 table1。通过 在 REPORT 块中指定表格名,您可以控制报表显示的顺序。
例 2: 未命名的 REPORT 块
%FUNCTION(dtw_sql) myStoredProc (OUT table1, table2) {
CALL myproc
%REPORT {
...
%ROW { .... %}
...
%}
%REPORT {
...
%ROW { .... %}
...
%}
%}
在此例中,对于在 FUNCTION 块参数列表中传递的两个表格都指定了 REPORT 块。因为 REPORT 块 中没有指定表格名称,因此将根据这两个表格从存储过程返回的顺序显示它们的报表。
要使用缺省报表和 REPORT 块的组合来显示多个报表:
例子: 缺省报表和 REPORT 块的组合
%DEFINE DTW_DEFAULT_REPORT = "MULTIPLE"
%FUNCTION(dtw_system) editTables (INOUT table1, table2, table3) {
%EXEC{ /qsys.lib/mylib.lib/mypgm.pgm %}
%REPORT(table2) {
...
%ROW { .... %}
...
%}
%}
在此例中,只有指定了一个 REPORT 块,并且因为它指定了表格名 table2, 因此使用这个表格来显示报表。因为指定的 REPORT 块比从存储过程返回的结果集个数少, 因此对剩余的结果集显示缺省的报表:先是 table1 的缺省报表; 然后是 table3 的缺省报表。
在 FUNCTION 或 MACRO_FUNCTION块中指定多个 REPORT 块时,请使用以下准则和限制。
准则:
限制: