管理与编程指南


Net.Data 函数

Net.Data 提供了在应用程序中使用的内置函数,例如字处理函数、字符串处理函数或检索和设置表 变量函数的函数。还可以定义与应用程序一起使用的函数,例如调用外部程序或存储过程的函数。

用户定义函数
那些为与应用程序一起使用而定义的函数,例如,调用一个外部程序或存储过程。

Net.Data 内置函数
Net.Data 为您应用程序中的使用而提供的函数,例如用于处理文字和字符串的函数以及获取和 设置表变量的函数。

这些章节将描述以下主题:

定义函数

要在宏中定义自己的函数,可使用 FUNCTION 块或 MACRO_FUNCTION 块:

FUNCTION 块
定义一个子例程,它调用自一个 Net.Data 宏,由语言环境来处理。FUNCTION 块必须包含语言语句或对外部程序的调用。

MACRO_FUNCTION 块
定义一个子例程,它调用自一个 Net.Data 宏,由 Net.Data 而非语言环境来处理。MACRO_FUNCTION 块可包含 HTML 块或 XML 块所允许的任何语句。

语法:使用以下语法来定义函数:

FUNCTION 块:

%FUNCTION(type) function-name([usage] [datatype] parameter, ...)
                [RETURNS(return-var)] {
  executable-statements
  [report-block]
  ...
  [report-block]
  [message-block]
%}

MACRO_ FUNCTION 块:

%MACRO_FUNCTION function-name([usage] parameter, ...)  {
  executable-statements
  [report-block]
  ...
  [report-block]
%}

其中:

type
标识了初始化文件中配置的语言环境。语言环境调用一个专用语言处理器(处理可执行语 句)并提供 Net.Data 和语言处理器之间的标准接口。

function-name
指定 FUNCTION 或 MACRO_FUNCTION 块的名称。函数调用指定 function-name, 前导以 at (@) 符号。参见调用函数,以获取详细信息。

可以用同一个名称定义多个 FUNCTION 或 MACRO_FUNCTION 块, 这样它们就可以被同时处理。每个 块都必须具有相同的参数列表。当 Net.Data 调用函数时,将以在 Net.Data 宏中定义的顺序执行具 有相同名称的所有 FUNCTION 块或有相同名称的所有 MACRO_FUNCTION 块。

usage
指定参数是输入 (IN) 参数、输出 (OUT) 参数还是两种类型 (INOUT)。这个指定 指出了是将传送至或接收自 FUNCTION 块、MACRO_FUNCTION 块(或这两者)。在被改为另一种用法类型之前, 此用法类型适用于参数列表中的所有后继参数。缺省类型是 IN。

datatype
参数的数据类型。有些语言环境期望获得被传递参数的数据类型。例如 SQL 语言环境在调用存储过程 时期望了解这些数据类型。参见使用语言环境, 以进一步了解您正在使用的语言环境所支持的数据类型。

parameter
指具有局部作用域的变量名称,将用在函数调用上指定的相应变元的值来代替它。参数被传送至语言环境, 并可以用该语言的语法或作为环境变量来被可执行语句访问。 在 FUNCTION 或 MACRO_FUNCTION 块之外,参数变量引用无效。

return-var
在 RETURNS 关键字之后指定此参数来标识特殊的 OUT 参数。返回变量的值是在函数块中指定的, 该值被返回到宏中调用函数的地方。例如,在句子 <p>My name is @my_name(). 中,@my_name() 将由返回变量的值来替代。如果您没有指定 RETURNS 子句,则函数调用的值是:

executable-statements
语言语句的集合,在替换变量和处理函数之后,它们传送至特定语言环境进行处理。 executable-statements 可包含 Net.Data 变量引用和 Net.Data 函数调用。executable-statements 包含在 HTML 块中允许的那些可执行语句。

对于 FUNCTION 块,在可执 行语句传送到语言环境之前,Net.Data 用变量值代替所有变量引用,执行所有函数调用并用结 果值代替函数调用。每个语言环境处理语句的方式是不同的。关于指定可执行语句或调用可执行程 序的详情,参见可执行变量

对于 MACRO_FUNCTION 块, 可执行语句是文本和 Net.Data 宏语言结构的组合。在此情况下将不涉及语言环境, 因为 Net.Data 起语言处理器的作用并处理可执行语句。

report-block
定义一个或多个 REPORT 块,以便处理 FUNCTION 块或 MACRO_FUNCTION 块的输出。参见报告块

message-block
定义 MESSAGE 块,它处理 FUNCTION 块因错误状态返回的任何消息。有关如何捕捉错误状态的详情,参见信息块

在 Net.Data 宏调用函数之前,在其他所有块的外部定义函数。

在函数中使用特殊字符

当匹配 Net.Data 语言结构语法的字符在函数块的语言结构节中作为一部分语法上有效的嵌入程 序码(例如 REXX 或 Perl)使用时,它们可能被作为 Net.Data 语言结构而被误解释,因而导致 错误或宏中不可预测的结果。

例如,Perl 函数可能使用 COMMENT 块定界符 %{。运行宏时,%{ 被作为 COMMENT 快的开头来 解释。然后 Net.Data 查找 COMMENT 块的结尾,当它读到函数块结尾时就认为是找到了。Net.Data 然后继续查找函数块的结尾,但当找不到时,就发出一个错误。

使用以下方式之一来使用 COMMENT 块定界符字符,或使用任何其他 Net.Data 特殊字符作为嵌 入程序代码的一部分,而不让它们被 Net.Data 作为特殊字符来解释:

例如,以下 Perl 函数包含表示一个 COMMENT 块定界符 %{ 的字符作为 Perl 语言语句的一部 分:

%FUNCTION(DTW_PERL) func() {             
  ...           
  for $num_words (sort bynumber keys %{ $Rtitles{$num} }) {
  &make_links($Rtitles{$num}{$num_words});             
  }   
  ... 
%}   

要保证 Net.Data 将 %{ 字符作为 Perl 源码而不是作为 Net.Data COMMENT 块定 界符,可以用以下方式之一重写函数:

信息块

MESSAGE 块让您根据函数调用的成功或失败来确定在函数调用之后如何继续下去,并让您为函数 的调用程序显示信息。在处理消息时,Net.Data 为每一个对 FUNCTION 块的函数调用设置 语言环境变量 RETURN_CODE。在对 MACRO_FUNCTION 块的函数调用上不设置 RETURN_CODE。

一个 MESSAGE 块由一系列消息语句组成,每个消息语句指定一个返回码值、消息文本和一个 要进行的操作。Net.Data Reference 一书中语言结构章节中显示了 MESSAGE 块的语法。

MESSAGE 块可具有全局或局部作用域。如果它是在最外层指定的,则 MESSAGE 块是全局作用域,并且对于 Net.Data 宏中执行的所有函数 调用都是活动的。如果您定义多个全局 MESSAGE 块,则最后定义的块是活动的。然而, 如果 MESSAGE 块是在 FUNCTION 块中定义的,则它的 作用域局部在该 FUNCTION 块中(Net.Data 内置函数是一个例外,其错误由全局消息块处理)。

Net.Data 使用这些规则来处理来自一个函数调用的 RETURN_CODE 或 SQL_STATE 变量的值:

  1. 检查局部 MESSAGE 块中的 RETURN_CODE 或 SQL_STATE 值的精确匹配; 根据指定来退出或继续。
  2. 如果值不是 0,则检查局部 MESSAGE 块中的 +default-default;根据值的符号,根据指定来退出或继续。
  3. 如果值不是 0,则检查局部 MESSAGE 块中的 default; 根据指定来退出或继续。
  4. 检查全局 MESSAGE 块中的 RETURN_CODE 或 SQL_STATE 的精确匹配; 根据指定来退出或继续。
  5. 如果值不是 0,则检查全局 MESSAGE 块中的 +default-default;根据值的符号,根据指定来退出或继续。
  6. 如果值不是 0,则检查全局 MESSAGE 块中的 default; 根据指定来退出或继续。
  7. 如果值不是 0,则发出 Net.Data 内部缺省消息和出口。

下例显示 Net.Data 宏的一部分,其中具有一个全局 MESSAGE 块和一个函数的 MESSAGE 块:

%{ global message block %}
%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  
  %}

如果 my_function() 返回 RETURN_CODE 值为 50,Net.Data 将以此 顺序处理错误:

  1. 在局部 MESSAGE 块中检查精确匹配。
  2. 在局部 MESSAGE 块中检查 +default
  3. 在局部 MESSAGE 块中检查 default
  4. 在局部 MESSAGE 块中检查精确匹配。
  5. 在全局 MESSAGE 块中检查 +default

当 Net.Data 找到一个匹配时,它向 Web 浏览器发送消息文本,并检查请求的操作。

当您指定了 continue 之后,Net.Data 继续处理 Net.Data 宏,然后才打印消息文本。例如,一个宏调用 my_functions() 5 次并在用 MESSAGE 块处理期间发现错误 100,则程序的输出是这样的:

.
.
.
11 May 1997                  $245.45
13 May 1997                  $623.23
19 May 1997                  $ 83.02
return code 100 message
22 May 1997                  $ 42.67
 
Total:                       $994.37

调用函数

使用一个 Net.Data 函数调用语句来调用用户定义函数和内置函数。使用后面跟有函数名或 宏函数名的 at (@) 字符:

@function_name([ argument,... ])

function_name
这是要调用的函数或宏函数的名称。除非是内置函数,否则必须在 Net.Data 宏中已定义函数。

argument
这是变量、引用字符串、变量引用或函数调用的名称。函数调用上的变元与函数或宏函数 参数列表上的参数相匹配。在处理函数或宏函数时,每个参数都被赋予其相应变元的值。变元与对应的参数必须具有相同数目和类型。

作为变量的引用字符串可以包含变量引用和函数调用。

示例 1:用文本字符串参数进行函数调用

 @myFunction("abc")
 

示例 2:用变量和函数调用参数进行函数调用

 @myFunction(myvar, @DTW_rADD("2","3"))
 

示例 3:用包含变量引用和函数调用的文本字符串参数进行函数调用

@myFunction("abc$(myvar)def@DTW_rADD("2","3")ghi")
 

调用 Net.Data 内置函数

Net.Data 提供了大量的内置函数来简化 Web 页面的开发。这些函数已经由 Net.Data 定义好了, 因此不需要再对它们进行定义。您可以象调用其他函数一样调用这些函数。

图 23显示了 Net.Data 内置函数和宏是如何相互作用的。

图 23. Net.Data 内置函数


Net.Data 内置函数

根据前缀的不同,内置函数可以三种方式返回它们的结果:

有些内置函数并不具有每一类型。要确定某个特定内置函数具有的类型,参见 Net.Data Reference 中的 Net.Data 内置函数章节。

以下章节提供了 Net.Data 内置函数的一个高级概述。使用这些函数可以执行通用、数学、 字符串、字处理或表处理功能。这其中的某些函数需要变量在使用 之前先进行设置,或者必须在特定的上下文中使用。参见 Net.Data 参考以获取每个函数及其语法和示例的描述。

通用函数

这个函数集合通过改变数据或访问系统服务来帮助您开发 Web 页面。您可以用它们 来发送邮件、处理 HTTP cookie、生成 HTML 转换代码,并从系统中获取其他有用信息。

例如,要指定 Net.Data 在发生某个特定的情况时应退出宏,而不处理剩下的宏, 可以使用 DTW_EXIT 函数:

%HTML(sort_page) {
 
<html>
 <head>
 <title>This is the page title</title>
 </head>
 <body>
 <center>
 <h3>This is the Main Heading</h3>
 <!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>
 <! Joe Smith sees a very short page                   !>
 <!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>
 %IF (customer == "Joe Smith")
 </body>
</html>
 
@DTW_EXIT()
 
%ENDIF
 
...
 
 </body>
</html>
 %}

另一个有用的函数是 DTW_URLESCSEQ 函数,它用转换值替换 URL 中不允许的字符。例如,如果输入变量 string1 等 于 "Guys & Dolls",那么 DTW_URLESCSEQ 将为输出变量赋值 "Guys%20%26%20Dolls"

数学函数

这些函数执行数学运算,使您能够计算或改变数字数据。除了标准的数学运算以外, 您还可以执行按模除法、指定结果精度并使用科学记数法。

例如,函数 DTW_POWER 将它第一个参数的值提高为第二个参数的平方并返回结果, 如下面的示例中所示:

@DTW_POWER("2", "-3", result)

DTW_POWER 在变量 result 中 返回 ".125"

字符串函数

这些函数可以让您处理字符串中的字符。您可以更改字符串的大小写、插入或删除字符、 给另一个变量指定字符串值、增加其他有用的函数。

例如,可使用 DTW_ASSIGN 来指定值或更改变量的值。还可使用此函数来对变量指定值或更改变量的值。在下面的示例中, 变量 RC 被赋值为 0。

 @DTW_ASSIGN(RC, "0")

其他字符串函数包括 DTW_CONCAT (用于连接字符串)、DTW_INSERT (在特定的位置插入字符串)以及 许多其他字符串处理函数。

字处理函数

这些函数可以让您处理字符串中的单词。这些函数大部分和字符串函数以类似的方式作用, 但它们是对整个单词进行作用。例如,它们可以让您计数一个字符串中的单词个数、删除单词、 在字符串中搜索某个单词。

例如,使用 DTW_DELW0RD 来从一个字符串中删除指定数目的单词:

@DTW_DELWORD("Now is the time", "2", "2", result)

DTW_DELWORD 返回字符串 "Now time"

其他字处理函数包括 DTW_WORDLENGTH (返回单词中的字符个数)、DTW_WORDPOS (返回一个 单词在字符串中的位置)。

表函数

您可以使用这些函数来生成报告或表(这些报告或表使用 Net.Data 表变量中 的数据)。您还可以使用这些函数来创建 Net.Data 表,处理和检索那些表中的值。表变量中包含了 一系列值以及相关的列名。它们提供了一种便利的方式将一组值传递给 一个函数。

例如,DTW_TB_APPENDROW 在表后追加一行。在下面的示例中,Net.Data 在 表 myTable 后面追加了十行:

@DTW_TB_APPENDROW(myTable, "10")

另外,DTW_TB_DUMPH 返回一个宏表变量的内容(包括在 <pre></pre> 标记中), 表中的每一行显示在不同的行中。而 DTW_TB_CHECKBOX 从宏表变量返回一个多个 HTML 复选框输入标记。

平面文件函数

使用平面文件接口 (FFI) 可以打开、读取和处理平面文件源(文本文件)中的数据, 也可以将数据存储到平面文件中。

例如,DTWF_APPEND 将一个表变量的内容写入文件末尾,而 DTWF_DELETE 从文件中删除记录。

另外,FFI 函数允许使用 DTWF_CLOSE 和 DTWF_OPEN 来进行文件锁定。DTWF_OPEN 锁定一个文件, 这样其他请求就无法读取或更新该文件。DTWF_CLOSE 在 Net.Data 完成处理之后释放文件, 从而允许其他请求访问该文件。


Java 小应用程序函数

使用“Java 小应用程序”函数可对基于 Net.Data 变量的 web 页很容易地生成 <applet> 和 <parm> 标记。

例如,如果将小应用程序命名为 myApplet, 且您想要将某些参数传送至该小应用程序(包括表变量), 则可进行以下操作:

%define REMOTE_USER = %ENVVAR
 %define myTable = %TABLE(all)
 ...
%HTML (report){
 ...
 @DTWA_myApplet(REMOTE_USER, myTable)
 ...
 %}

这将让 Net.Data 生成 <applet> 标记, 并对表中的每个值和 REMOTE_USER 环境变量的值生成 <parm> 标记。

此外,可传送表的单列。例如:

@DTWA_myApplet(REMOTE_USER, DTW_COLUMN(mycol)myTable)

此示例传送 Net.Data 表变量 myTablemycol 列。

Web 注册表函数

使用 Web 注册表函数来维护注册表及其包含的条目。Web 注册表是一个文件,由 Net.Data 维护 此文件的键,允许您方便地添加、检索和删除其中的条目。

例如,DTWR_ADDENTRY 添加条目,而 DTWR_DELENTRY 删除条目。DTWR_LISTSUB 在一个 OUT 表参数中返回有关注册表条目的信息,而 DTWR_UPDATEENTRY 用一个新值 替换指定注册表条目的现有值。


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