Net.Data 让您使用 IF 和 WHILE 块来在 Net.Data 宏中结合条件逻辑和循环。
IF 和 WHILE 块使用可以帮助您测试一个或多个条件的条件列表,然后根据条件测试的结果 执行一个语句块。条件列表包含逻辑运算符(例如 = 和 <=) 和项,项是由引用字符串、 变量、变量引用和函数调用组成的。引用字符串也可以包含变量引用和函数调用。可以嵌套条件列表。
以下章节描述条件逻辑和循环:
将 IF 块用于 Net.Data 宏中的条件处理。在大多数高级语言中 IF 块类似于 IF 语句,因 为 IF 块提供测试一个或多个条件的能力,然后基于条件测试的结果执行一个语句块。
您可以在宏中的几乎任何地方指定 IF 块并可以嵌套它们。Net.Data Reference 中的语言结构章中显示了 IF 块的语法。
IF 块的规则:IF 块的语法规则是由该块在宏中的位置确定的。IF 块中语句的可执行块允许的元 素取决于 IF 块自身的位置。
%HTML 块 ... %IF 块 ... %INCLUDE ... %WHILE ... %ENDIF %}
%IF ... %DEFINE ... %FUNCTION ... %ENDIF
例如,一个嵌套的 IF 块必须遵循在它处于一个 HTML 块中时使用的规则。
%IF ... %HTML { ... %IF ... %ENDIF %} ... %ENDIF
例外:不要在 IF 块中指定 ROW 块。
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) %} %}
在 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)
%}
%}