管理与编程指南


生成文档标记

Net.Data 动态生成要由客户机应用程序(如 Web 浏览器)使用的 HTML 或 XML 文档。下列各节描述了各种结构,您可用来通过 Net.Data 宏对文档进行格式化。有关每种结构的特定语法信息, 参见 Net.Data Reference 中的语言结构章节。

HTML 和 XML 块

客户机应用程序通过指定宏名和其中一个宏的入口点的名称来调用 Net.Data。宏的入口点可以任意为 HTML 块或 XML 块。这些块包含生成结果页的 Net.Data 语言语句和文本表示语句。

因为入口点块驱动宏的执行,所以宏中必须至少存在一个入口点。可以有多个 HTML 块或 XML 块,但每个客户机请求只执行一个入口点块。并且,对于每个请求,将单一文档返回至客户机。要创建由许多客户机文档组成的应用程序, 可以使用标准导航技术(如链接和表单)多次调用 Net.Data 来处理各种宏中的各种 HTML 或 XML 块。

HTML 或 XML 块中可以出现任何文本表示语句, 只要这些语句对客户机有效。例如,HTML 块可以包含 HTML 或 JavaScript。Net.Data 不执行 JavaScript, 但与输出的其余部分一起被发送至客户机,以便执行和显示。在 HTML 或 XML 块中,还可包括函数调用、变量引用和 INCLUDE 语句。下例显示 Net.Data 宏中的 HTML 块的常见用法:

%HTML(input){         
<h1>Hardware Query Form</h1>
<hr/>
<form method="post" action="report">
<dl>
</dt>What hardware do you want to list?
<dd><input type="radio" name="hdware" value="MON" checked />Monitors</ddl>
<dd><input type="radio" name="hdware" value="PNT" />Pointing devices</ddl>
<dd><input type="radio" name="hdware" value="PRT" />Printers</ddl>
<dd><input type="radio" name="hdware" value="SCN" />Scanners</ddl>
</dl>
<hr />
<input type="submit" value="Submit" />
</form>
%}
 
%FUNCTION(DTW_SQL) myQuery() {
SELECT MODNO, COST, DESCRIP FROM EQPTABLE WHERE TYPE='$(hardware)'
%REPORT{
<b>Here is the list you requested:</b><br />
%ROW{
<hr />
$(N1): $(V1)    $(N2): $(V2)
</p>
$(V3)
%}
%}
%}
 
%HTML(report){
  @myQuery()
%}

可以从 HTML 链接调用 Net.Data 宏。

<a href="http://www.ibm.com/cgi-bin/db2www/equiplst.dtw/input">
  List of hardware</a>

当应用程序用户单击此链接时,Web 浏览器调用 Net.Data,Net.Data 语法 分析宏。当 Net.Data 开始处理在调用上指定的 HTML 块时,在此情况下是输入, 它开始处理其中的文本。Net.Data 对于不能识别为 Net.Data 宏语言结构的任何东西, 都发送到浏览器显示。

在用户作出选择并按了“提交”按钮后, 客户机请求在 HTML 表单的操作属性中指定的操作。此操作指定调用宏的输出 HTML 块。然后,Net.Data 象处理输入 HTML 块那样处理输出 HTML 块。

Net.Data 然后处理 myQuery() 函数调用,该函数调用又调用“SQL 语言环境”FUNCTION 块。用在输入表中返回的值代替 SQL 语句中引用的 $(hdware) 变量之后,Net.Data 运行查询。在此点,Net.Data 继续处理报告,根据 REPORT 块中指定的 文本显示语句来显示查询的结果。

Net.Data 完成 REPORT 块处理后, 它返回至输出 HTML 块并完成处理。

报告块

使用 REPORT 块语言结构来格式化并显示来自 FUNCTION 块的数据输出。这个输出通常是表数据, 尽管可以指定文本、宏变量引用和函数调用的任何有效组合。通常可以任选地在 REPORT 块上指定表名。除了 SQL 和 ODBC 语言环境以外,如果没有指定表名称,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.dtw/details?name=$(V1)&loc=$(V2)">$(V1)</a>
    </td>
    <td>$(V2)</td>
  </tr>
  %}
</table>
%}

REPORT 块准则

在创建 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生成报告是通过:

  1. 在报告的开头打印一次 Phone Query Results:。此文本和分隔线 是 REPORT 块的页眉部分。
  2. 对于检索到的每一行,分别用 Name、Phone 和 Fax 的值替换变量 V1V2V3
  3. 在报告结尾打印一次字符串 Total records retrieved: 以及 TOTAL_ROWS 的值。(此文本是 REPORT 块的注脚部分。)

多个 REPORT 块

在一个 FUNCTION 或 MACRO FUNCTION 块中可以指定多个 REPORT 块,从而用一次函数调用生成多个报告。

通常,您将一起使用具有 DTW_SQL 语言环境的多个 REPORT 块和调用存储过程的函数, 该存储过程返回多个结果集(参见存储过程)。当然,多个 REPORT 块可以与任何语言环境一起使用来生成多个报告。

要使用多个 REPORT 块,可以在对每个结果集的存储过程 CALL 中放置一个 结果集名称。如果存储过程返回的结果集比指定的 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  () {
     CALL myproc (table1, table2)  %}

在此例中,存储过程 myproc 返回两个结果集, 分别放在 table1table2 中。因为没有指定 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  () {
   CALL myproc (table1, table2)
 
  %REPORT(table2) { 
     ...    
    %ROW {  ....   %}   
     ...
   %}
   
   %REPORT(table1) {     
     ...
  %row {  ....   %} 
     ...
   %}
%}

在此例中,对于在 FUNCTION 块参数列表中传递的两个表都指定了 REPORT 块。这些表是以它们 在 REPORT 块中指定的顺序显示的,先是 table2,然后是 table1。通过在 REPORT 块中指定表名,您可以控制报告显示的顺序。

示例 2: 未命名的 REPORT 块

%FUNCTION(dtw_sql) myStoredProc  () {
    CALL myproc   
   
       %REPORT {
     ...    
    %ROW {  ....   %}  
     ...
   %} 
       %REPORT {    
     ...    
    %ROW {  ....   %}     
     ...  
   %}  
%}

在此示例中,对从 myproc 返回的两个结果集指定了 REPORT 块。因为 REPORT 块上未指定任何表名, 所以将根据从存储过程返回结果集的次序对头两个结果集执行 REPORT 块。

要使用缺省报告和 REPORT 块的组合来显示多个报告:

示例: 缺省报告和 REPORT 块的组合

%DEFINE DTW_DEFAULT_REPORT = "MULTIPLE"
%FUNCTION(dtw_system) editTables (INOUT table1, table2, table3) {  
  %REPORT(table2) {    
    ...      
    %ROW {  ....   %}    
    ...   
  %}    
%}

在此例中,仅指定了一个 REPORT 块。因为该块指定 table2,而 table2 是 CALL 语句上所列出的第二个结果集, 因此第二个结果集将被用于显示报告。因为指定的 REPORT 块比存储过程返回的结果集个数少, 因此对剩余的表显示缺省报告:先是第一个结果集 table1 的缺省报告, 然后是第三个结果集 table3 的缺省报告。指定了一个输出表 table1, 它可以被用于今后在宏中进行处理。

多个 REPORT 块的准则和限制

在 FUNCTION 或 MACRO_FUNCTION块中指定多个 REPORT 块时,请使用以下准则和限制。

准则:

限制:


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]