Net.Data 提供了在应用程序中使用的内置函数,例如字处理函数、字符串处理函数或检索和设置表 变量函数的函数。还可以定义与应用程序一起使用的函数,例如调用外部程序或存储过程的函数。
这些章节将描述以下主题:
要在宏中定义自己的函数,可使用 FUNCTION 块或 MACRO_FUNCTION 块:
语法:使用以下语法来定义函数:
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] %}
其中:
可以用同一个名称定义多个 FUNCTION 或 MACRO_FUNCTION 块, 这样它们就可以被同时处理。每个 块都必须具有相同的参数列表。当 Net.Data 调用函数时,将以在 Net.Data 宏中定义的顺序执行具 有相同名称的所有 FUNCTION 块或有相同名称的所有 MACRO_FUNCTION 块。
对于 FUNCTION 块,在可执 行语句传送到语言环境之前,Net.Data 用变量值代替所有变量引用,执行所有函数调用并用结 果值代替函数调用。每个语言环境处理语句的方式是不同的。关于指定可执行语句或调用可执行程 序的详情,参见可执行变量。
对于 MACRO_FUNCTION 块, 可执行语句是文本和 Net.Data 宏语言结构的组合。在此情况下将不涉及语言环境, 因为 Net.Data 起语言处理器的作用并处理可执行语句。
在 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 块定 界符,可以用以下方式之一重写函数:
%FUNCTION(DTW_PERL) func() { %EXEC{ func.prl %} %}
%define percent_openbrace = "%{" %FUNCTION(DTW_PERL) func() { ... for $num_words (sort by number keys $(percent_openbrace) $Rtitles{$num} } { &make_links($Rtitles{$num}{$num_words}); } ... %}
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 变量的值:
下例显示 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 将以此 顺序处理错误:
当 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,... ])
作为变量的引用字符串可以包含变量引用和函数调用。
示例 1:用文本字符串参数进行函数调用
@myFunction("abc")
示例 2:用变量和函数调用参数进行函数调用
@myFunction(myvar, @DTW_rADD("2","3"))
示例 3:用包含变量引用和函数调用的文本字符串参数进行函数调用
@myFunction("abc$(myvar)def@DTW_rADD("2","3")ghi")
Net.Data 提供了大量的内置函数来简化 Web 页面的开发。这些函数已经由 Net.Data 定义好了, 因此不需要再对它们进行定义。您可以象调用其他函数一样调用这些函数。
图 23显示了 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 小应用程序”函数可对基于 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 表变量 myTable 的 mycol 列。
使用 Web 注册表函数来维护注册表及其包含的条目。Web 注册表是一个文件,由 Net.Data 维护 此文件的键,允许您方便地添加、检索和删除其中的条目。
例如,DTWR_ADDENTRY 添加条目,而 DTWR_DELENTRY 删除条目。DTWR_LISTSUB 在一个 OUT 表参数中返回有关注册表条目的信息,而 DTWR_UPDATEENTRY 用一个新值 替换指定注册表条目的现有值。