管理与编程指南


宏中的条件逻辑和循环

Net.Data 让您使用 IF 和 WHILE 块来在 Net.Data 宏中结合条件逻辑和循环。

IF 和 WHILE 块使用可以帮助您测试一个或多个条件的条件列表,然后根据条件测试的结果 执行一个语句块。条件列表包含逻辑运算符(例如 = 和 <=) 和项,项是由引用字符串、 变量、变量引用和函数调用组成的。引用字符串也可以包含变量引用和函数调用。可以嵌套条件列表。

以下章节描述条件逻辑和循环:

条件逻辑:IF 块

将 IF 块用于 Net.Data 宏中的条件处理。在大多数高级语言中 IF 块类似于 IF 语句,因 为 IF 块提供测试一个或多个条件的能力,然后基于条件测试的结果执行一个语句块。

您可以在宏中的几乎任何地方指定 IF 块并可以嵌套它们。Net.Data Reference 中的语言结构章中显示了 IF 块的语法。

IF 块的规则:IF 块的语法规则是由该块在宏中的位置确定的。IF 块中语句的可执行块允许的元 素取决于 IF 块自身的位置。

IF 块字符串比较

Net.Data 根据组成条件的项目的内容,用两种方式中的一种来处理 IF 块条 件列表。缺省操作是将所有项目作为字符串对待,并如条件中所指定的那样执行字符串比较。当然, 如果比较是在两个代表整数的字符串之间进行的,那么这个比较也是数字的。如果字符串中仅包含数字, 则 Net.Data 假定它是数字的,任选地前导以一个 '+' 或 '-' 字符。字符串不能包含任何非数字字符,'+' 或 '-' 除外。Net.Data 不支持非整数的数值比较。

有效整数字符串的示例:
+1234567890
-47
000812
92000

无效整数字符串的示例:
-  20     (包含空格字符)
234,000   (包含一个逗号)
57.987    (包含一个十进制小数点)
 

Net.Data 在执行 IF 块的时侯求解 IF 条件,此时间可能与 Net.Data 初始读块的时间不同。例如, 如果您在 REPORT 块中指定一个 IF 块,Net.Data 在读取包含 REPORT 块的 FUNCTION 块定义 时不估计与 IF 块相关联的条件列表,而是在调用和执行它时进行。对于 IF 块的条件列表部分和 要执行的语句块,都是这样的。

IF 块的示例: 一个在其他块中包含 IF 块的宏

%{ This macro is called from another macro, passing the operating system
   and version variables in the form data.
%}
 
%IF (platform == "AS400")
  %IF (version == "V3R2")
     %INCLUDE "as400v3r2_def.hti"
  %ELIF (version == "V3R7")
     %INCLUDE "as400v3r7_def.hti"
  %ELIF (version == "V4R1")
     %INCLUDE "as400v4r1_def.hti"
    %ENDIF
%ELSE
     %INCLUDE "default_def.hti"
%ENDIF 
 
%MACRO_FUNCTION numericCompare(IN term1, term2, OUT result) {
%IF (term1 < term2)
  @dtw_assign(result, "-1")
%ELIF (term1 > term2)
  @dtw_assign(result, "1")
%ELSE
  @dtw_assign(result, "0")
    %ENDIF
%}
  
%HTML(report){
  %WHILE (a < "10") {
    outer while loop #$(a)<br />
    %IF (@dtw_rdivrem(a,"2") == "0")
      this is an even number loop<br />
    %ENDIF
    @DTW_ADD(a, "1", a)
  %}
%}

循环结构:WHILE 块

在 Net.Data 宏中使用 WHILE 块来执行循环。类似于 IF 块,WHILE 块也 提供测试一个或多个条件的能力,然后基于条件测试的结果执行一个语句块。与 IF 不同的是, 基于条件测试的结果,语句块可被执行多次。

可以在 HTML 块、REPORT 块、ROW 块 MACRO_FUNCTION 块和 IF 块中指定 WHILE 块,并可以 嵌套它们。Net.Data Reference 中语言结构章节中显示了 WHILE 块的语法。

Net.Data 处理 WHILE 块的方式与处理 IF 块的方式精确相同,只是在每次执行该块之后重新计算条件。而且与任何条件循环结构相同,如果条件编码不正确的话,就有可能进入死循环。

示例: 具有 WHILE 块的宏


%DEFINE loopCounter = "1"

%HTML(build_table) {
%WHILE (loopCounter <= "100") {
%{ generate table tag and column headings %}
%IF (loopCounter == "1")
<table border>
<tr>
<th>Item #
<th>Description
%ENDIF

%{ generate individual rows %}
<tr>
<td>$(loopCounter)
<td>@getDescription(loopCounter)

%{ generate end table tag %}
%IF (loopCounter == "100")
%ENDIF

%{ increment loop counter %}
@DTW_ADD(loopCounter, "1", loopCounter)
%}
%}


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