《SAP的ABAP4语言中文培训教材第一部分第七章 控制 ABAP4 程序流9754.docx》由会员分享,可在线阅读,更多相关《SAP的ABAP4语言中文培训教材第一部分第七章 控制 ABAP4 程序流9754.docx(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、8SAP AG第七章: 7: 1 1控制 ABAP/4 程序流概览内容ABAP/4中 流控制的概 念编程逻辑表 达式比较所有的 字段类型比较字符串 和数字串二进制位结 构的比较检查字段是 否属于某一 范围检查初始值检查选择条 件组合几个逻 辑表达式编程分支和 循环使用 IF 的条件分支使用 CASE 的条件分支使用 DO 的无条件循 环使用 WHILE 的条件循环终止循环要根据一定 条件执行程 序组件,或 要将重复语 句序列组合 在循环中, 可以使用 ABAP/4 提供的用于 控制程序流 的标准关键 字。ABAP/4 也包含重要 的附加特征 。ABAP/4 程序流可以 内部控制和 外部控制。
2、ABAP/4 程序流的内 部控制和外 部控制之间 的差别在ABAP/4中 流控制的概 念 (页 8) 中 解释。本节主要讨 论内部流控 制。为此, 可使用其他 编程语言( 例如,C、 FORTRAN、 PASCAL 等等)中熟 悉的标准控 制关键字。下列主题描 述1ABAP/4中 流控制的概 念与其他高级 编程语言一 样(如,C、 FORTRAN 和 PASCAL 等等),ABAP/4 提供也用于 控制程序流 的标准关键 字。这些关 键字用于_ 分支 (IF、CASE)_ 循环 (DO、WHILE)然而,ABAP/4 与其他编程 语言不同之 处在于其具 有程序流的 内部控制和 外部控制。_ 内
3、部控制 由上述标准 关键字引导 。在程序代 码中对其进 行定义。_ 外部控制 由事件引导 。事件由 ABAP/4 程序(系统 程序或用户 程序)或者 交互式用户 输入(例如 ,使用鼠标 在屏幕上单 击)生成。 系统不必按 ABAP/4 程序中列出 的顺序对进 行语句处理 。这使得 ABAP/4 成为事件驱 动编程语言 ,类似于 Microsoft 的Visual Basic。时间事件和 ABAP/4 程序的连接 由事件关键 字提供。ABAP/4 程序中的每 个语句都属 于特别的事 件关键字。 即使在程序 中没有指定 任何事件关 键字,所有 语句都自动 归属于标准 事件关键字 (START-OF
4、-SELECTION) ,与程序中 事件语句的 次序完全不 相干。所有属于某 一特定事件 关键字的语 句形成一个 处理块。处 理块是一个 在事件发生 时执行的模 块。处理块 内的程序流 依赖于内部 控制。系统 按顺序处理 语句,或按 照前面提到 的标准关键 字定义的顺 序处理。ABAP/4 程序常规结 构如下:假设当用户 选择一行后 ,生成列表 且提供一些 细分设备的 报表程序必 须作出反应 (详细信息 ,参见 交互列表)。需要为 该事件处理 的代码必须 插入事件关 键字 AT LINE-SELECTION 之后。AT LINE-SELECTION. MOVE X TO FLAG. .无论何时
5、用 户通过单击 鼠标或按 F2 键在列表中 选择一个项 目时,AT LINE-SELECTION 和下一个事 件关键字之 间的所有语 句将被处理关于外部控 制的详细信 息,如事件 及其如何与 ABAP/4 程序相互作 用的信息, 参见 C通过事件控制 ABAP/4 程序流。该节说明如 何使用外部 控制控制处 理块内的程 序流。要控制 ABAP/4 程序中的内 部流,请遵 循结构化编 程原则并将 程序模块划 分为单个逻 辑相关语句 块(这些组 成控制结构 )。其中的 每个语句块 都执行主任 务的一部分 。要使程序易 于阅读,应 该缩排控制 结构中的语 句块。出于 布局需要, 可以使用 ABAP/
6、4 编辑器功能 “编辑 - 插入语句.” 和“程序 - 整齐打印程 序”(详细 信息,参见 ABAP/4 程序布局 (页 26)。可以用 IF、CASE、 DO 和 WHILE 之类的关键 字控制处理 块中不同语 句之间的程 序流。这些 语句允许编 制条件和无 条件的分支 和循环。条 件使用逻辑 表达式,可 以是真,也 可以为假。2编程逻辑表 达式使用条件控 制程序中的 内部流。要 用公式指定 条件,请使 用比较数据 字段的逻辑 表达式,如 下所示:语法 . .该表达式比 较两个字段 。可能为真 ,也可能为 假。在带关 键字 IF、 CHECK 和 WHILE 的条件语句 中使用逻辑 表达式。
7、根据操作数 和 的数据类型 ,可以使用 不同的逻辑 运算符。允 许进行:除上述比较 之外,还可 以执行测试 以检查数据 字段是否完 全满足一定 条件。可以 使用这些测 试:另外,可以 将几个逻辑 表达式组合 为一个简单 逻辑表达式 。3比较所有的 字段类型要比较所有 的字段类型 ,可以在逻 辑表达式中 使用下列运 算符:含 义EQ等于 =等于NE不 等于不 等于不 等于LT小 于小于LE小 于等于大于GE大 于等于=大 于等于操作数可以 是数据库字 段、内部字 段、文字或 常数。除基本字段 外,还可以 将结构数据 类型和上表 中的运算符 结合起来作 为操作数。 字段串逐个 组件进行比 较,嵌套
8、的 结构分为基 本的字段。 关于比较内 表的详细信 息,参见 比较内表 (页 Error! Not a valid link.) 。如果有意义 ,可以对不 同数据类型 的字段进行 比较。如果 字段可转换 ,就可以进 行比较。在 比较之前, 系统将按照 下列层次规 则执行自动 类型转换( 参见 键入转换 (页 636) ):1.如果 操作数之一 是浮点数( 类型 F),则系 统将其它操 作数转换为 类型 F。2.如果 操作数之一 是压缩字段 (类型 P),则系 统将其它操 作数转换为 类型 P。3.如果 操作数之一 是日期字段 (类型 D)或时间 字段(类型 T),则系 统将其它操 作数转换为
9、类型 D 或 T。不支持 日期和时间 字段之间的 比较,这会 导致程序中 断。4.如果 操作数之一 是字符字段 (类型 C)且其它 操作数是十 六进制字段 (类型 X),则系 统将类型 X 的操作数转 换为类型 C。5.如果 操作数之一 是字符字段 (类型 C),其它 操作数为数 字字段(类 型 N),则系 统将这两种 操作数都转 换为类型 P。DATA: F TYPE F VALUE 100.00, P TYPE P VALUE 50.00 DECIMALS 2, I TYPE I VALUE 30.00.WRITE The following logical expressions are
10、 true:.IF F = P . WRITE: / F,=,P.ELSE. WRITE: / F,= 50.00 30 NE 50.00这里,在 IF 语句中使用 两个逻辑表 达式。如果 逻辑表达式 为真,则屏 幕上显示出 来。如果逻 辑表达式为 假,则将相 反表达式显 示在屏幕上 。4比较字符串 和数字串要比较字符 串(类型 C)和数字 文本(类型 N),可以 在逻辑表达 式中使用下 列运算符。含 义CO仅包 含CN不仅 包含CA包 含任何NA不 包含任何CS包 含字符串NS不 包含字符串 CP包含模 式NP不包 含模式因为除类型 N 和 C 外,系统不 能执行任何 其它类型转 换,所以,
11、 在进行包含 这些运算之 一的比较时 ,操作数应 该是类型 N 或 C。运算符的功 能如下:CO (仅包含)如果 仅包含 中的字符, 则逻辑表达 式 CO 为真。该比 较区分大小 写,并包括 尾部空格。 如果比较结 果为真,则 系统字段 SY-FDPOS 包括 的长度。如 果为假,则 SY-FDPOS 包含 中第一个未 在 内出现的字 符的偏移量 。CN (不仅包含 )如果 还包含 之外的其他 字符,则逻 辑表达式 CN 为真。该比 较区分大小 写,并包括 尾部空格。 如果比较结 果为真,则 系统字段 SY-FDPOS 包含 中第一个未 同时在 中出现的字 符的偏移量 。如果为假 ,SY-FD
12、POS 包含 的长度。CA (包含任何 )如果 至少包含 的一个字符 ,则逻辑表 达式 CA 为真。该比 较区分大小 写。如果比 较结果为真 ,则系统字 段 SY-FDPOS 包含 中第一个也 在 中出现的字 符的偏移量 。如果为假 ,SY-FDPOS 包含 的长度。NA (不包含任 何)如果 不包含 的任何字符 ,则逻辑表 达式 NA 为真。该比 较区分大小 写。如果比 较结果为真 ,则系统字 段 SY-FDPOS 包含 的 长度。如果 为假,则 SY-FDPOS 包含 中在 内出现的第 一个字符的 偏移量。CS (包含字符 串)如果 包含字符串 , 则逻辑表达 式 CS 为真。忽略 尾部空
13、格并 且比较不区 分大小写。 如果比较结 果为真,则 系统字段 SY-FDPOS 包含 在 中的偏移量 。如果为假 ,SY-FDPOS 包含 的长度。NS (不包含字 符串)如果 不包含字符 串 , 则逻辑表达 式 NS 为真。忽略 尾部空格且 比较不区分 大小写。如 果比较为真 ,系统字段 SY-FDPOS 包含 的长度。如 果为假,系 统字段 SY-FDPOS 包含 在 中的偏移量 。CP (包含模式 )如果 包含模式 , 则逻辑表达 式 CP 为真。如果 属于类型 C,则可以 在 中使用下列 通配符:_ * 用于任何字 符串_ + 用于任何单 个字符忽略尾部空 格且比较不 区分大小写 。
14、如果比较 结果为真, 系统字段 SY-FDPOS 包含 在 中的偏移量 。如果为假 ,SY-FDPOS 包含 的长度。如果要对 中的特殊字 符进行比较 ,请将换码 字符 # 放到其前面 。可以使用 换码字符 # 指定_ 大小写字 符_ 通配符 *(输 入 #*)_ 通配符 + (输入 #+)_ 换码符号 本身 (输入 #)_ 字符串结 尾的空格 (输入 #_)NP (不包含模 式)如果 不包含模式 , 则逻辑表达 式 NP 为真。在中 ,可以使用 与 CP 相同的通配 符和换码字 符。忽略尾部空 格且比较不 区分大小写 。如果比较 结果为真, 则系统字段 SY-FDPOS 包含 . 的长度,如
15、 果为假,SY-FDPOS 包含 在 中的偏移量 。DATA: F1(5) TYPE C VALUE , F2(5) TYPE C VALUE .IF F1 F2. WRITE: / Comparison true, SY-FDPOS=, SY-FDPOS.ELSE. WRITE: / Comparison false, SY-FDPOS=, SY-FDPOS.ENDIF.下表列出该 程序的执行 结果,取决 于所用的运 算符和 F1 / F2 字段。ResultSY-FDPOSBD COABCD 真5BD COABCDE假 2ABC12CNABCD 真3ABABCCNABCD 假5ABcdeC
16、ABd 真1ABcdeCAbD 假5ABAB NAAB 假0ababaNAAB 真5ABcdeCSbC 真1ABcdeCSce 假5ABcdeNSbC 假1ABcdeNSce 真5ABcdeCP*b*真 1ABcdeCP*#b*假 5ABcdeNP*b*假 1ABcdeNP*#b*真 56二进制位结 构的比较要将逻辑表 达式初始操 作数第一字 节的二进制 位结构与第 二操作数的 进行比较, 请使用下列 操作符。含 义O二进制 位是 1Z二进制 位是 0M混合二 进制位第二 操作数的长 度应为一个 字节。没有必要对 第二操作数 使用长度为 1 的十六进制 字段(类型 X),但却 较方便,因 为其
17、长度为 一个字节且 数字值直接 与二进制位 结构相关。操作符功能 如下:O (二进制位 是 1)如果 中二进制位 是 1 的位置,在 中是 1,则逻辑 表达式 O 为真。Z (二进制位 是0)如果 中二进制位 是 1 的位置,在 中是 0,则逻辑 表达式 Z 为真。M (混合二进 制位)如果从 中二进制位 是 1 的位置起, 中至少一个 是 1,一个是 0,则逻辑 表达式 M 为真。DATA: C VALUE C, HEXDEC TYPE X, I TYPE I.HEXDEC = 0.DO 256 TIMES. I = HEXDEC. IF C O HEXDEC. WRITE: / HEXDE
18、C, I. ENDIF. HEXDEC = HEXDEC + 1.ENDDO.产生下列输 出:00 001 102 203 340 6441 6542 6643 67这里,使用 运算符 O 将字符C 的二进制位 结构与所有 0与 FF(10 进制为 255)之 间的 16 进制数进行 比较。HEXDEC 的10 进制值 I ,在HEXDEC 分配到I 期间,通过 使用自动类 型转换确定 。如果比较 结果为真, 则在屏幕上 显式 16 进制数及其 10 进制值。下 表列出这些 数的二进制 位结构。16 进制10 进制二进制 位结构000000000000110000000102200000010
19、03300000011406401000000416501000001426601000010436701000011字 符C的 二进制位结 构由其 ASCII 码 67 为当前硬件 平台进行定 义。与用户 看到的一样 ,列表输出 中出现的数 字,填写 1 的二进制位 位置与 67 的二进制位 结构一样。8检查字段是 否属于某一 范围要检查值是 否属于特定 范围,请使 用下列带有 BETWEEN 参数的逻辑 表达式:语法. BETWEEN AND .如果 在 和 之间的范围 内发生,则 表达式为真 。它是下列 逻辑表达式 的短格式:IF GE AND LE .DATA: NUMBER TYPE
20、 I, FLAG.NUMBER = .IF NUMBER BETWEEN 3 AND 7. FLAG = X.ELSE. FLAG = .ENDIF.这里,如果 NUMBER 的内容在 3 和 7 之间出现, 字段 FLAG 设置为“X” 。9检查初始值要检查字段 是否设置为 初始值,请 如下使用带 有 IS INITIAL 参数的逻辑 表达式。语法. IS INITIAL .如果 包含本身类 型的初始值 ,则表达式 为真。通常 情况下,任 何字段,基 本的或结构 化的(字符 串和内表) ,在 CLEAR 语句执行后 ,都包含其 初始值(参 见 重置缺省值 (页 610) )。DATA FLA
21、G VALUE X. IF FLAG IS INITIAL. WRITE / Flag is initial.ELSE. WRITE / Flag is not initial.ENDIF.CLEAR FLAG.IF FLAG IS INITIAL. WRITE / Flag is initial.ELSE. WRITE / Flag is not initial.ENDIF.这产生如下 输出:Flag is not initialFlag is initial.这里,DATA 语句之后, 字符串 FLAG 不包含初始 值,因为用 VALUE 参数设置为 X。执 行 CLEAR 语句之后, 将
22、其重置为 初始值。10检查选择条 件要检查字段 内容是否与 选择表中的 选择条件匹 配,可以如 下使用带有 IN 参数的逻辑 表达式:语法. IN .如果字段 内容的符合 选择表 中的条件, 则表达式为 真。关于选择条 件的详细信 息,参见 使用选择标准。关于逻辑表 达式中检查 选择条件的 详细信息, 包括示例, 参见 使用逻辑表达式中的选择表。10组合几个逻 辑表达式通过使用逻 辑连接运算 符 AND、OR 和 NOT,可 以将几个逻 辑表达式组 合为单个表 达式: _ 要将几个 逻辑表达式 组合为单个 表达式,且 该表达式仅 当所有组件 表达式为真 时才为真, 则表达式之 间要用 AND
23、连接。_ 要将几个 逻辑表达式 组合为单个 表达式,且 只要其中一 个组件表达 式为真时, 该表达式即 为真,则表 达式之间要 用 OR 连接。_ 要转化逻 辑表达式的 结果,请在 其前面指定 NOT。NOT 优先于 AND,AND 优先于 OR。但是 ,可以用任 何括弧组合 指定处理顺 序。由于 ABAP/4 将括弧解释 为单字,前 面或后面必 须至少有一 个空格。ABAP/4 从左到右处 理逻辑表达 式。如果确 定组件表达 式之一是真 或假,就不 再执行该组 件中其余的 比较或检查 。这意味着 采取这种方 法组织逻辑 表达式可以 提高性能, 就是将经常 为假的比较 放置在 AND 链的开头
24、, 而将费时的 比较,如字 符串查找放 等到最后。DATA: F TYPE F VALUE 100.00, N(3) TYPE N VALUE 123, C(3) TYPE C VALUE 456.WRITE The following logical expression is true:.IF ( C LT N ) AND ( N GT F ). WRITE: / (,C,lt,N,) AND (,N,gt,F,).ELSE. WRITE: / (,C,ge,N,) OR (,N,le,F,).ENDIF.这产生如下 输出:下列逻辑表达式为真: ( 456 ge 123 ) OR ( 12
25、3 le 1.000000000000000E+02 )在本例中, 在 IF 语句中使用 逻辑表达式 。如果逻辑 表达式为真 ,则将其在 屏幕上显示 出来。如果 为假,则屏 幕上出现相 反的表达式 。10编程分支和 循环可以在程序 中定义条件 和无条件分 支和循环。 为此,ABAP/4 提供了几个 在下列主题 中描述的语 句。分支循环11使用 IF 的条件分支IF 语句允许依 据条件将程 序流转到特 定的语句块 中。该语句 块包括 IF 语句及其后 面的 ELSEIF、 ELSE 或 ENDIF 之间的所有 命令。语法IF . ELSEIF . ELSEIF . .ELSE. ENDIF.如果
26、第一个 条件是真, 系统将执行 所有语句直 到第一个语 句块结束, 然后继续处 理 ENDIF 语句之后的 程序。要采 用选择性条 件,可以使 用 ELSEIF 语句。如果 第一个条件 是假,系统 使用与 IF 语句一样的 方式处理后 面的 ELSEIF 语句。如果 IF 或 ELSEIF 条件都为假 ,则执行 ELSE 开始的语句 块。最后的 语句块必须 用 ENDIF 结束。要用公式表 达 IF 和 ELSEIF 语句中的条 件,可以使 用任何 编程逻辑表 达式 (页 8) 描述的逻辑 表达式。ABAP/4 允许无限地 嵌套 IF - ENDIF 语句块,但 是必须在相 同的处理块 中终止
27、。换 句话说,就 是 IF - ENDIF 块不能包含 事件关键字 。DATA: TEXT1(30) VALUE This is the first text, TEXT2(30) VALUE This is the second text, TEXT3(30) VALUE This is the third text, STRING(5) VALUE eco.IF TEXT1 CS STRING. WRITE / Condition 1 is fulfilled.ELSEIF TEXT2 CS STRING. WRITE / Condition 2 is fulfilled.ELSEIF T
28、EXT3 CS STRING. WRITE / Condition 3 is fulfilled.ELSE. WRITE / No condition is fulfilled.ENDIF.产生如下输 出:Condition 2 is fulfilled.这里,第二 个逻辑表达 式 TEXT2 CS STRING 是真,因为 字符串“eco” 存在于 TEXT2 中。12使用 CASE 的条件分支要根据特殊 数据字段的 内容执行不 同的语句块 ,可以如下 使用 CASE 语句:语法CASE . WHEN . WHEN . WHEN . WHEN . . WHEN OTHERS. ENDCASE
29、.系统执行 WHEN 语句之后的 语句块,如 果 内容等于 的内容,且 继续处理 ENDCASE 语句后面的 语句。如果 的内容不等 于 的内容,则 执行选项 WHEN OTHERS 后面的语句 块。最后的 语句块必须 用 ENDCASE 结束。使用 CASE 的条件分支 是带 IF 的类似处理 的短格式:IF = . ELSEIF = . ELSEIF = . ELSEIF = . .ELSE. ENDIF.在 ABAP/4 中,可以嵌 套 CASE - ENDCASE 块,且可以 与 IF - ENDIF 结合使用, 但必须在同 一处理块中 终止。DATA: TEXT1 VALUE X,
30、TEXT2 VALUE Y, TEXT3 VALUE Z, STRING VALUE A.CASE STRING. WHEN TEXT1. WRITE: / String is, TEXT1. WHEN TEXT2. WRITE: / String is, TEXT2. WHEN TEXT3. WRITE: / String is, TEXT3. WHEN OTHERS. WRITE: / String is not, TEXT1, TEXT2, TEXT3.ENDCASE.产生如下输 出:String is not X Y Z这里,执行 WHEN OTHERS 后面的语句 块,因为 STRI
31、NG 的内容“A” 不等于“X” 、“Y”或 “Z”,。13使用 DO 的无条件循 环如果想要多 次执行语句 块,则可以 如下使用 DO 语句编程循 环:语法DO TIMES VARYING FROM NEXT . ENDDO.在发现 EXIT、 STOP 或 REJECT 语句之前, 系统继续执 行由 DO 引导、ENDDO 结束的语句 块(参见 终止循环 (页 8) )。可以使用 TIMES 选项限制循 环次数。 可以是文字 或变量。如 果 是 0 或负数,系 统不执行该 循环。系统字段 SY-INDEX 中包含已处 理过的循环 次数。使用 DO 语句时要避 免死循环。 如果不使用 TIM
32、ES 选项,则在 语句块中至 少应包含一 个 EXIT、 STOP 或 REJECT 语句,以便 系统能够退 出循环。本例显示 DO 循环的基本 格式。DO.WRITE SY-INDEX. IF SY-INDEX = 3. EXIT. ENDIF.ENDDO.产生如下输 出: 1 2 3这里,处理 3 次循环,然 后在 EXIT 语句后退出 循环。可以任意嵌 套 DO 循环,也可 以与其他循 环组合使用 。本例显示 2 个嵌套循环 ,都使用 TIMES 选项。DO 2 TIMES. WRITE SY-INDEX. SKIP. DO 3 TIMES. WRITE SY-INDEX. ENDDO.
33、 SKIP.ENDDO.产生如下输 出: 1 1 2 3 2 1 2 3外部循环执 行 2 次。每次执 行外部循环 时,内部循 环都执行 3 次。注意系 统字段 SY-INDEX 记录每个循 环各自的循 环次数。可以使用 VARYING 选项在每次 循环中给变 量 重新赋值。 、 、 、 . 必需是内存 中类型相同 和长度相等 的一系列等 距字段。第 一次循环中 ,将 分配给 ,第 二次循环中 ,将 分配给 ,以 此类推。可 以在一个 DO 语句中使用 多个 VARYING 选项。如果在 DO 循环中改变 控制变量 ,则 系统将自动 改变相应的 字段 。应保证循环 次数不超过 涉及到的变 量
34、、 、 的数量。该示例说明 如何在 DO 循环中使用 VARYING 选项。DATA: BEGIN OF TEXT, WORD1(4) VALUE This, WORD2(4) VALUE is, WORD3(4) VALUE a, WORD4(4) VALUE loop, END OF TEXT.DATA: STRING1(4), STRING2(4).DO 4 TIMES VARYING STRING1 FROM TEXT-WORD1 NEXT TEXT-WORD2. WRITE STRING1. IF STRING1 = is. STRING1 = was. ENDIF.ENDDO.SK
35、IP.DO 2 TIMES VARYING STRING1 FROM TEXT-WORD1 NEXT TEXT-WORD3 VARYING STRING2 FROM TEXT-WORD2 NEXT TEXT-WORD4. WRITE: STRING1, STRING2.ENDDO.这产生如下 输出:This is a loopThis was a loop字段串 TEXT 代表内存中 四个等距字 段序列。每 次执行第一 个 DO 循环时,都 依次将其组 件分配到 STRING1 中。如果 STRING1 包含“is” ,则将其改 变为“was” ,而且自动 将 TEXT-WORD2 改变为“w
36、as” 。每次执行 第二个 DO 循环时,将 TEXT 的组件传递 给STRING1和 STRING2。15使用 WHILE 的条件循环如果只要条 件为真,就 不止一次执 行语句,可 以如下使用 WHILE 语句编程:语法WHILE VARY FROM NEXT . ENDWHILE.只要 是真,或系 统发现 EXIT、 STOP 或 REJECT 语句,系统 将继续执行 由 WHILE 语句引导、 ENDWHILE 结束的语句 块(参见 终止循环 (页 8) )。对于 , 可以使用 编程逻辑表 达式 (页 8) 中描述的任 何逻辑表达 式。系统字段 SY-INDEX 中包含已执 行的循环次
37、数。可以任意嵌 套 WHILE 循环,也可 与其他循环 结合使用。WHILE 语句的 VARY 选项与 DO 循环的 VARYING 选项工作方 式一样(参 见使用 DO 的无条件循 环 (页 8) )。允许 每次执行循 环时为变量 重新赋值。 、 、 、 . 必需是内存 中类型相同 和长度相等 的一系列等 距字段。第 一次循环时 ,将 分配给 ,第 二次循环时 ,将 分配给 ,以 此类推。可 以在一个 WHILE 语句中使用 多个 VARY 选项。使用 WHILE 语句要避免 死循环。请 记住,在一 段时间之后 ,WHILE 语句条件应 变为假,或 者系统能够 找到 EXIT、 STOP 或
38、 REJECT 语句退出循 环。DATA: LENGTH TYPE I VALUE 0, STRL TYPE I VALUE 0, STRING(30) TYPE C VALUE Test String.STRL = STRLEN( STRING ).WHILE STRING NE SPACE. WRITE STRING(1). LENGTH = SY-INDEX. SHIFT STRING.ENDWHILE.WRITE: / STRLEN: , STRL.WRITE: / Length of string:, LENGTH.产生如下输 出:T e s t S t r i n gSTRLEN: 11Length of string: 11此处使用 WHILE 循环确定字 符串的长度 。做法是: 每次执行循 环时,都将 字符串左移 一位,直到 仅包含空格 。选择本例 主要是为了 说明 WHILE 语句。但是 ,确定字符 串长度更简 便和有效的 办法是通过 使用内置的 函数 STRLEN, 这在示例中 也可看出。16终止循环要终止循环 过程,请使 用下列关键 字之一。关键 字用途无条 件终 止 循 环过 程 (页 8) CONTI