SAP的ABAP4语言中文培训教材第一部分第七章 控制 ABAP4 程序流_第1页
SAP的ABAP4语言中文培训教材第一部分第七章 控制 ABAP4 程序流_第2页
SAP的ABAP4语言中文培训教材第一部分第七章 控制 ABAP4 程序流_第3页
SAP的ABAP4语言中文培训教材第一部分第七章 控制 ABAP4 程序流_第4页
SAP的ABAP4语言中文培训教材第一部分第七章 控制 ABAP4 程序流_第5页
已阅读5页,还剩43页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PAGE 8SAP AG第七章:STYLEREF Heading 1 PAGE8PAGE set Z_000page page 7 7 set Z_000page page 7 7控制 ABAP/4 程序流概览xe 程序, 流控制xe 程序流xe 流控制内容 TOC o 2-3 ABAP/4中 流控制的概 念 GOTOBUTTON _Toc395414630 ) 中 解释。本节主要讨 论内部流控 制。为此, 可使用其他 编程语言( 例如,C、 FORTRAN、 PASCAL 等等)中熟 悉的标准控 制关键字。下列主题描 述 set Z_026page page 7 7ABAP/4中 流控制的概

2、 念xe Control 语句xe 处理块xe 分支xe 流控制xe 流控制, 内部xe 流控制, 外部xe 循环与其他高级 编程语言一 样(如,C、 FORTRAN 和 PASCAL 等等),ABAP/4 提供也用于 控制程序流 的标准关键 字。这些关 键字用于_ 分支 (IF、CASE)_ 循环 (DO、WHILE)然而,ABAP/4 与其他编程 语言不同之 处在于其具 有程序流的 内部控制和 外部控制。_ 内部控制 由上述标准 关键字引导 。在程序代 码中对其进 行定义。_ 外部控制 由事件引导 。事件由 ABAP/4 程序(系统 程序或用户 程序)或者 交互式用户 输入(例如 ,使用鼠

3、标 在屏幕上单 击)生成。 系统不必按 ABAP/4 程序中列出 的顺序对进 行语句处理 。这使得 ABAP/4 成为事件驱 动编程语言 ,类似于 Microsoft 的Visual Basic。时间事件和 ABAP/4 程序的连接 由事件关键 字提供。ABAP/4 程序中的每 个语句都属 于特别的事 件关键字。 即使在程序 中没有指定 任何事件关 键字,所有 语句都自动 归属于标准 事件关键字 (START-OF-SELECTION) ,与程序中 事件语句的 次序完全不 相干。所有属于某 一特定事件 关键字的语 句形成一个 处理块。处 理块是一个 在事件发生 时执行的模 块。处理块 内的程序

4、流 依赖于内部 控制。系统 按顺序处理 语句,或按 照前面提到 的标准关键 字定义的顺 序处理。ABAP/4 程序常规结 构如下:假设当用户 选择一行后 ,生成列表 且提供一些 细分设备的 报表程序必 须作出反应 (详细信息 ,参见 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC23E.DOC z_001 a t * MERGEFORMAT 交互列表)。需要为 该事件处理 的代码必须 插入事件关 键字 AT LINE-SELECTION 之后。AT LINE-SELECTION. MOVE X TO FLAG. 无论何时用 户通过单

5、击 鼠标或按 F2 键在列表中 选择一个项 目时,AT LINE-SELECTION 和下一个事 件关键字之 间的所有语 句将被处理关于外部控 制的详细信 息,如事件 及其如何与 ABAP/4 程序相互作 用的信息, 参见 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC20E.DOC z_000 a t * MERGEFORMAT C通过事件控制 ABAP/4 程序流。该节说明如 何使用外部 控制控制处 理块内的程 序流。要控制 ABAP/4 程序中的内 部流,请遵 循结构化编 程原则并将 程序模块划 分为单个逻 辑相关语句 块(这

6、些组 成控制结构 )。其中的 每个语句块 都执行主任 务的一部分 。要使程序易 于阅读,应 该缩排控制 结构中的语 句块。出于 布局需要, 可以使用 ABAP/4 编辑器功能 “编辑 - 插入语句.” 和“程序 - 整齐打印程 序”(详细 信息,参见 ABAP/4 程序布局 (页 LINK Word.Document.6 D:LINBCAB4BC04E.DOP z_003page a t * MERGEFORMAT 26)。可以用 IF、CASE、 DO 和 WHILE 之类的关键 字控制处理 块中不同语 句之间的程 序流。这些 语句允许编 制条件和无 条件的分支 和循环。条 件使用逻辑 表达

7、式,可 以是真,也 可以为假。 set Z_028page page 7 7编程逻辑表 达式xe 比较数据字段xe 逻辑表达式xe 逻辑运算符xe 数据对象, 比较xe 条件xe 运算符, 逻辑使用条件控 制程序中的 内部流。要 用公式指定 条件,请使 用比较数据 字段的逻辑 表达式,如 下所示:语法 .该表达式比 较两个字段 。可能为真 ,也可能为 假。在带关 键字 IF、 CHECK 和 WHILE 的条件语句 中使用逻辑 表达式。根据操作数 和 的数据类型 ,可以使用 不同的逻辑 运算符。允 许进行:除上述比较 之外,还可 以执行测试 以检查数据 字段是否完 全满足一定 条件。可以 使用

8、这些测 试:另外,可以 将几个逻辑 表达式组合 为一个简单 逻辑表达式 。 set Z_012page page 7 7比较所有的 字段类型xe EQ, 等号xe GE, 大于等于运算符xe GT, 大于运算符xe LE, 小于等于运算符xe LT, 小于运算符xe NE, 不等于运算符xe 比较xe 比较, 全部数据类型要比较所有 的字段类型 ,可以在逻 辑表达式中 使用下列运 算符:含 义EQ等于 =等于NE不 等于不 等于不 等于LT小 于小于LE小 于等于大于GE大 于等于=大 于等于操作数可以 是数据库字 段、内部字 段、文字或 常数。除基本字段 外,还可以 将结构数据 类型和上表

9、中的运算符 结合起来作 为操作数。 字段串逐个 组件进行比 较,嵌套的 结构分为基 本的字段。 关于比较内 表的详细信 息,参见 比较内表 (页 Error! Not a valid link.) 。如果有意义 ,可以对不 同数据类型 的字段进行 比较。如果 字段可转换 ,就可以进 行比较。在 比较之前, 系统将按照 下列层次规 则执行自动 类型转换( 参见 键入转换 (页 LINK Word.Document.6 D:LINBCAB4BC08E.DOP z_012page a t * MERGEFORMAT 636) ):1.如果 操作数之一 是浮点数( 类型 F),则系 统将其它操 作数转

10、换为 类型 F。2.如果 操作数之一 是压缩字段 (类型 P),则系 统将其它操 作数转换为 类型 P。3.如果 操作数之一 是日期字段 (类型 D)或时间 字段(类型 T),则系 统将其它操 作数转换为 类型 D 或 T。不支持 日期和时间 字段之间的 比较,这会 导致程序中 断。4.如果 操作数之一 是字符字段 (类型 C)且其它 操作数是十 六进制字段 (类型 X),则系 统将类型 X 的操作数转 换为类型 C。5.如果 操作数之一 是字符字段 (类型 C),其它 操作数为数 字字段(类 型 N),则系 统将这两种 操作数都转 换为类型 P。DATA: F TYPE F VALUE 10

11、0.00, P TYPE P VALUE 50.00 DECIMALS 2, I TYPE I VALUE 30.00.WRITE The following logical expressions are true:.IF F = P . WRITE: / F,=,P.ELSE. WRITE: / F,= 50.00 30 NE 50.00这里,在 IF 语句中使用 两个逻辑表 达式。如果 逻辑表达式 为真,则屏 幕上显示出 来。如果逻 辑表达式为 假,则将相 反表达式显 示在屏幕上 。 set Z_013page page 7 7比较字符串 和数字串xe CA, 包含任意运算符xe CN,

12、 不只包含操作员xe CO, 只包含运算符xe CP, 包含模式运算符xe CS, 包含字符串运算符xe NA, 不包含运算符xe NP, 不包含模式运算符xe NS, 不包含字符串运算符xe SY-FDPOSxe 比较xe 比较, 字符串xe 字符串比较要比较字符 串(类型 C)和数字 文本(类型 N),可以 在逻辑表达 式中使用下 列运算符。含 义CO仅包 含CN不仅 包含CA包 含任何NA不 包含任何CS包 含字符串NS不 包含字符串 CP包含模 式NP不包 含模式因为除类型 N 和 C 外,系统不 能执行任何 其它类型转 换,所以, 在进行包含 这些运算之 一的比较时 ,操作数应 该是

13、类型 N 或 C。运算符的功 能如下:CO (仅包含)如果 仅包含 中的字符, 则逻辑表达 式 CO 为真。该比 较区分大小 写,并包括 尾部空格。 如果比较结 果为真,则 系统字段 SY-FDPOS 包括 的长度。如 果为假,则 SY-FDPOS 包含 中第一个未 在 内出现的字 符的偏移量 。CN (不仅包含 )如果 还包含 之外的其他 字符,则逻 辑表达式 CN 为真。该比 较区分大小 写,并包括 尾部空格。 如果比较结 果为真,则 系统字段 SY-FDPOS 包含 中第一个未 同时在 中出现的字 符的偏移量 。如果为假 ,SY-FDPOS 包含 的长度。CA (包含任何 )如果 至少包

14、含 的一个字符 ,则逻辑表 达式 CA 为真。该比 较区分大小 写。如果比 较结果为真 ,则系统字 段 SY-FDPOS 包含 中第一个也 在 中出现的字 符的偏移量 。如果为假 ,SY-FDPOS 包含 的长度。NA (不包含任 何)如果 不包含 的任何字符 ,则逻辑表 达式 NA 为真。该比 较区分大小 写。如果比 较结果为真 ,则系统字 段 SY-FDPOS 包含 的 长度。如果 为假,则 SY-FDPOS 包含 中在 内出现的第 一个字符的 偏移量。CS (包含字符 串)如果 包含字符串 , 则逻辑表达 式 CS 为真。忽略 尾部空格并 且比较不区 分大小写。 如果比较结 果为真,则

15、系统字段 SY-FDPOS 包含 在 中的偏移量 。如果为假 ,SY-FDPOS 包含 的长度。NS (不包含字 符串)如果 不包含字符 串 , 则逻辑表达 式 NS 为真。忽略 尾部空格且 比较不区分 大小写。如 果比较为真 ,系统字段 SY-FDPOS 包含 的长度。如 果为假,系 统字段 SY-FDPOS 包含 在 中的偏移量 。CP (包含模式 )如果 包含模式 , 则逻辑表达 式 CP 为真。如果 属于类型 C,则可以 在 中使用下列 通配符:_ * 用于任何字 符串_ + 用于任何单 个字符忽略尾部空 格且比较不 区分大小写 。如果比较 结果为真, 系统字段 SY-FDPOS 包含

16、 在 中的偏移量 。如果为假 ,SY-FDPOS 包含 的长度。如果要对 中的特殊字 符进行比较 ,请将换码 字符 # 放到其前面 。可以使用 换码字符 # 指定_ 大小写字 符_ 通配符 *(输 入 #*)_ 通配符 + (输入 #+)_ 换码符号 本身 (输入 #)_ 字符串结 尾的空格 (输入 #_)NP (不包含模 式)如果 不包含模式 , 则逻辑表达 式 NP 为真。在中 ,可以使用 与 CP 相同的通配 符和换码字 符。忽略尾部空 格且比较不 区分大小写 。如果比较 结果为真, 则系统字段 SY-FDPOS 包含 . 的长度,如 果为假,SY-FDPOS 包含 在 中的偏移量 。D

17、ATA: 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 假5ABcdeCABd 真1ABcdeCAbD 假5ABAB NAAB

18、 假0ababaNAAB 真5ABcdeCSbC 真1ABcdeCSce 假5ABcdeNSbC 假1ABcdeNSce 真5ABcdeCP*b*真 1ABcdeCP*#b*假 5ABcdeNP*b*假 1ABcdeNP*#b*真 5 set Z_014page page 7 7二进制位结 构的比较xe M, bits 是混合运算符xe O, bits 为一个运算符xe Z, bits 是零运算符xe 比较xe 比较, 位结构xe 位比较要将逻辑表 达式初始操 作数第一字 节的二进制 位结构与第 二操作数的 进行比较, 请使用下列 操作符。含 义O二进制 位是 1Z二进制 位是 0M混合二 进

19、制位第二 操作数的长 度应为一个 字节。没有必要对 第二操作数 使用长度为 1 的十六进制 字段(类型 X),但却 较方便,因 为其长度为 一个字节且 数字值直接 与二进制位 结构相关。操作符功能 如下: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.

20、HEXDEC = 0.DO 256 TIMES. I = HEXDEC. IF C O HEXDEC. WRITE: / HEXDEC, 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 进制值。下

21、表列出这些 数的二进制 位结构。16 进制10 进制二进制 位结构00000000000011000000010220000001003300000011406401000000416501000001426601000010436701000011字 符C的 二进制位结 构由其 ASCII 码 67 为当前硬件 平台进行定 义。与用户 看到的一样 ,列表输出 中出现的数 字,填写 1 的二进制位 位置与 67 的二进制位 结构一样。 set Z_015page page 7 7检查字段是 否属于某一 范围xe BETWEENxe 逻辑表达式xe 逻辑表达式, BETWEEN 参数xe 内部检

22、查要检查值是 否属于特定 范围,请使 用下列带有 BETWEEN 参数的逻辑 表达式:语法 BETWEEN AND 如果 在 和 之间的范围 内发生,则 表达式为真 。它是下列 逻辑表达式 的短格式:IF GE AND LE .DATA: NUMBER TYPE I, FLAG.NUMBER = .IF NUMBER BETWEEN 3 AND 7. FLAG = X.ELSE. FLAG = .ENDIF.这里,如果 NUMBER 的内容在 3 和 7 之间出现, 字段 FLAG 设置为“X” 。 set Z_016page page 7 7检查初始值xe IS INITIALxe 逻辑表达

23、式xe 逻辑表达式, INITIAL 参数要检查字段 是否设置为 初始值,请 如下使用带 有 IS INITIAL 参数的逻辑 表达式。语法 IS INITIAL 如果 包含本身类 型的初始值 ,则表达式 为真。通常 情况下,任 何字段,基 本的或结构 化的(字符 串和内表) ,在 CLEAR 语句执行后 ,都包含其 初始值(参 见 重置缺省值 (页 LINK Word.Document.6 D:LINBCAB4BC08E.DOP z_009page a t * MERGEFORMAT 610) )。DATA FLAG VALUE X. IF FLAG IS INITIAL. WRITE /

24、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 语句之后, 将其重置为 初始值。 set Z_018page page 7 7检查选择条 件

25、xe INxe 逻辑表达式xe 逻辑表达式, 选择标准要检查字段 内容是否与 选择表中的 选择条件匹 配,可以如 下使用带有 IN 参数的逻辑 表达式:语法. IN 如果字段 内容的符合 选择表 中的条件, 则表达式为 真。关于选择条 件的详细信 息,参见 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC18E.DOC z_002 a t * MERGEFORMAT 使用选择标准。关于逻辑表 达式中检查 选择条件的 详细信息, 包括示例, 参见 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLI

26、SHBCAB4BC18E.DOC z_033 a t * MERGEFORMAT 使用逻辑表达式中的选择表。 set Z_030page page 7 7组合几个逻 辑表达式xe ANDxe NOTxe ORxe 逻辑表达式xe 逻辑表达式, 合并通过使用逻 辑连接运算 符 AND、OR 和 NOT,可 以将几个逻 辑表达式组 合为单个表 达式: _ 要将几个 逻辑表达式 组合为单个 表达式,且 该表达式仅 当所有组件 表达式为真 时才为真, 则表达式之 间要用 AND 连接。_ 要将几个 逻辑表达式 组合为单个 表达式,且 只要其中一 个组件表达 式为真时, 该表达式即 为真,则表 达式之间

27、要 用 OR 连接。_ 要转化逻 辑表达式的 结果,请在 其前面指定 NOT。NOT 优先于 AND,AND 优先于 OR。但是 ,可以用任 何括弧组合 指定处理顺 序。由于 ABAP/4 将括弧解释 为单字,前 面或后面必 须至少有一 个空格。ABAP/4 从左到右处 理逻辑表达 式。如果确 定组件表达 式之一是真 或假,就不 再执行该组 件中其余的 比较或检查 。这意味着 采取这种方 法组织逻辑 表达式可以 提高性能, 就是将经常 为假的比较 放置在 AND 链的开头, 而将费时的 比较,如字 符串查找放 等到最后。DATA: F TYPE F VALUE 100.00, N(3) TYP

28、E 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 ( 123 le 1.000000000000000E+02 )在本例中, 在 IF 语句中使用 逻辑表达式 。如果逻辑 表达式为真

29、 ,则将其在 屏幕上显示 出来。如果 为假,则屏 幕上出现相 反的表达式 。 set Z_031page page 7 7编程分支和 循环xe 分支xe 流控制, 分支xe 流控制, 循环xe 循环可以在程序 中定义条件 和无条件分 支和循环。 为此,ABAP/4 提供了几个 在下列主题 中描述的语 句。分支循环 set Z_011page page 7 7使用 IF 的条件分支xe ELSExe ELSEIFxe ENDIFxe IFxe 分支, 条件IF 语句允许依 据条件将程 序流转到特 定的语句块 中。该语句 块包括 IF 语句及其后 面的 ELSEIF、 ELSE 或 ENDIF 之

30、间的所有 命令。语法IF . ELSEIF . ELSEIF . ELSE. ENDIF.如果第一个 条件是真, 系统将执行 所有语句直 到第一个语 句块结束, 然后继续处 理 ENDIF 语句之后的 程序。要采 用选择性条 件,可以使 用 ELSEIF 语句。如果 第一个条件 是假,系统 使用与 IF 语句一样的 方式处理后 面的 ELSEIF 语句。如果 IF 或 ELSEIF 条件都为假 ,则执行 ELSE 开始的语句 块。最后的 语句块必须 用 ENDIF 结束。要用公式表 达 IF 和 ELSEIF 语句中的条 件,可以使 用任何 编程逻辑表 达式 (页 REF z_028page

31、* MERGEFORMAT 7) 描述的逻辑 表达式。ABAP/4 允许无限地 嵌套 IF - ENDIF 语句块,但 是必须在相 同的处理块 中终止。换 句话说,就 是 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

32、fulfilled.ELSEIF TEXT2 CS STRING. WRITE / Condition 2 is fulfilled.ELSEIF TEXT3 CS STRING. WRITE / Condition 3 is fulfilled.ELSE. WRITE / No condition is fulfilled.ENDIF.产生如下输 出:Condition 2 is fulfilled.这里,第二 个逻辑表达 式 TEXT2 CS STRING 是真,因为 字符串“eco” 存在于 TEXT2 中。 set Z_019page page 7 7使用 CASE 的条件分支xe C

33、ASExe ENDCASExe WHENxe 分支, 条件要根据特殊 数据字段的 内容执行不 同的语句块 ,可以如下 使用 CASE 语句:语法CASE . WHEN . WHEN . WHEN . WHEN . WHEN OTHERS. ENDCASE.系统执行 WHEN 语句之后的 语句块,如 果 内容等于 的内容,且 继续处理 ENDCASE 语句后面的 语句。如果 的内容不等 于 的内容,则 执行选项 WHEN OTHERS 后面的语句 块。最后的 语句块必须 用 ENDCASE 结束。使用 CASE 的条件分支 是带 IF 的类似处理 的短格式:IF = . ELSEIF = . E

34、LSEIF = . ELSEIF = . .ELSE. ENDIF.在 ABAP/4 中,可以嵌 套 CASE - ENDCASE 块,且可以 与 IF - ENDIF 结合使用, 但必须在同 一处理块中 终止。DATA: TEXT1 VALUE X, 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

35、. WHEN OTHERS. WRITE: / String is not, TEXT1, TEXT2, TEXT3.ENDCASE.产生如下输 出:String is not X Y Z这里,执行 WHEN OTHERS 后面的语句 块,因为 STRING 的内容“A” 不等于“X” 、“Y”或 “Z”,。 set Z_021page page 7 7使用 DO 的无条件循 环xe DOxe DO 循环xe ENDDOxe SY-INDEXxe 循环, DOxe 循环, 无条件如果想要多 次执行语句 块,则可以 如下使用 DO 语句编程循 环:语法DO TIMES VARYING FROM

36、NEXT . ENDDO.在发现 EXIT、 STOP 或 REJECT 语句之前, 系统继续执 行由 DO 引导、ENDDO 结束的语句 块(参见 终止循环 (页 REF z_025page * MERGEFORMAT 8) )。可以使用 TIMES 选项限制循 环次数。 可以是文字 或变量。如 果 是 0 或负数,系 统不执行该 循环。系统字段 SY-INDEX 中包含已处 理过的循环 次数。使用 DO 语句时要避 免死循环。 如果不使用 TIMES 选项,则在 语句块中至 少应包含一 个 EXIT、 STOP 或 REJECT 语句,以便 系统能够退 出循环。本例显示 DO 循环的基本

37、格式。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. SKIP.ENDDO.产生如下输 出: 1 1 2 3 2 1 2 3外部循环执 行 2 次。每次执 行外部循环 时,内部循 环都执行 3 次。

38、注意系 统字段 SY-INDEX 记录每个循 环各自的循 环次数。可以使用 VARYING 选项在每次 循环中给变 量 重新赋值。 、 、 、 . 必需是内存 中类型相同 和长度相等 的一系列等 距字段。第 一次循环中 ,将 分配给 ,第 二次循环中 ,将 分配给 ,以 此类推。可 以在一个 DO 语句中使用 多个 VARYING 选项。如果在 DO 循环中改变 控制变量 ,则 系统将自动 改变相应的 字段 。应保证循环 次数不超过 涉及到的变 量 、 、 的数量。该示例说明 如何在 DO 循环中使用 VARYING 选项。DATA: BEGIN OF TEXT, WORD1(4) VALUE

39、 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.SKIP.DO 2 TIMES VARYING STRING1 FROM TEXT-WORD1 NEXT TEXT-WORD3 VARYING STR

40、ING2 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 改变为“was” 。每次执行 第二个 DO 循环时,将 TEXT 的组件传递 给STRING1和 STRING2。 set Z_022page page 7

41、 7使用 WHILE 的条件循环xe ENDWHILExe SY-INDEXxe WHILExe WHILE 循环xe 循环, WHILExe 循环, 有条件如果只要条 件为真,就 不止一次执 行语句,可 以如下使用 WHILE 语句编程:语法WHILE VARY FROM NEXT . ENDWHILE.只要 是真,或系 统发现 EXIT、 STOP 或 REJECT 语句,系统 将继续执行 由 WHILE 语句引导、 ENDWHILE 结束的语句 块(参见 终止循环 (页 REF z_025page * MERGEFORMAT 8) )。对于 , 可以使用 编程逻辑表 达式 (页 REF

42、z_028page * MERGEFORMAT 7) 中描述的任 何逻辑表达 式。系统字段 SY-INDEX 中包含已执 行的循环次 数。可以任意嵌 套 WHILE 循环,也可 与其他循环 结合使用。WHILE 语句的 VARY 选项与 DO 循环的 VARYING 选项工作方 式一样(参 见使用 DO 的无条件循 环 (页 REF z_021page * MERGEFORMAT 7) )。允许 每次执行循 环时为变量 重新赋值。 、 、 、 . 必需是内存 中类型相同 和长度相等 的一系列等 距字段。第 一次循环时 ,将 分配给 ,第 二次循环时 ,将 分配给 ,以 此类推。可 以在一个 W

43、HILE 语句中使用 多个 VARY 选项。使用 WHILE 语句要避免 死循环。请 记住,在一 段时间之后 ,WHILE 语句条件应 变为假,或 者系统能够 找到 EXIT、 STOP 或 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.ENDWHIL

44、E.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, 这在示例中 也可看出。 set Z_025page page 7 7终止循环xe 循环, 终止xe 终止循环要

45、终止循环 过程,请使 用下列关键 字之一。关键 字用途无条 件终 止 循 环过 程 (页 REF z_032page * MERGEFORMAT 8) CONTINUE 有条 件终 止 循 环过 程 (页 REF z_033page * MERGEFORMAT 8) CHECK 完全 终止 循 环 (页 REF z_034page * MERGEFORMAT 8) EXIT 在循环中只 能使用 CONTINUE, 但在循环外 还可使用关 键字 CHECK 和 EXIT, 分别完成不 同的功能。 例如,可以 终止子程序 或整个程序 块。关于 CHECK 和 EXIT 语句及其如 何在循环外 使用

46、的详细 信息,参见LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC11E.DOC z_009 a t * MERGEFORMAT 终止子系统 和 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC20E.DOC z_028 a t * MERGEFORMAT 终止处理块 。以下主题说 明如何在 DO 和WHILE 循环以及下 列循环中使 用 CONTINUE、 CHECK 和 EXIT:_ LOOP - ENDLOOP 循环,用于 处理内表( 参见 循环处理 (页 Error!

47、 Not a valid link.) )。_ SELECT - ENDSELECT 循环,用于 从数据表中 读取数据( 参见 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC13E.DOC z_025 a t * MERGEFORMAT 从几行选择所有数据)。 set Z_032page page 7 7无条件终止 循环过程xe CONTINUExe 循环, 终止循环传递xe 循环传递, 无条件终止要立即无条 件终止循环 ,请如下使 用 CONTINUE 语句:语法CONTINUE.在CONTINUE 语句之后, 系统跳过当 前语句

48、块中 所有剩余语 句块,继续 该语句后面 的循环。DO 4 TIMES. IF SY-INDEX = 2. CONTINUE. ENDIF. WRITE SY-INDEX.ENDDO.产生如下输 出: 1 3 4此处系统不 处理 WRITE 语句就终止 第二次循环 。 set Z_033page page 7 7有条件终止 循环过程xe 检查xe 循环, 终止循环传递xe 循环传递, 有条件终止要有条件终 止循环过程 ,请如下使 用 CHECK 语句:语法CHECK .如果条件是 假,系统跳 过当前语句 块中所有剩 余语句块, 继续后面的 循环过程。 对于, 可使用 编程逻辑表 达式 (页 R

49、EF z_028page * MERGEFORMAT 7) 中描述的任 何逻辑表达 式。DO 4 TIMES. CHECK SY-INDEX BETWEEN 2 and 3. WRITE SY-INDEX.ENDDO.产生如下输 出: 2 3此处系统不 处理 WRITE 语句就终止 第一个和第 四个循环, 因为 SY-INDEX 不在 2 和 3 之间。 set Z_034page page 7 7完全终止循 环xe EXITxe 循环, 退出循环xe 循环, 完全终止要无条件完 全终止循环 ,请如下使 用 EXIT 语句:语法EXIT.EXIT 语句之后, 系统立即退 出循环,继 续结束语句

50、 (ENDDO、 ENDWHILE、 ENDSELECT)后 面的处理。 在嵌套循环 中,系统仅 退出当前循 环。DO 4 TIMES. IF SY-INDEX = 3. EXIT. ENDIF.WRITE SY-INDEX.ENDDO.产生如下输 出: 1 2此处系统不 处理 WRITE 语句或第四 个循环过程 ,就在第三 个循环过程 中完全终止 循环。概览xe 程序, 流控制xe 程序流xe 流控制内容 TOC o 2-3 ABAP/4中 流控制的概 念 GOTOBUTTON _Toc395414630 ) 中 解释。本节主要讨 论内部流控 制。为此, 可使用其他 编程语言( 例如,C、

51、FORTRAN、 PASCAL 等等)中熟 悉的标准控 制关键字。下列主题描 述 set Z_026page page 8 8ABAP/4中 流控制的概 念xe Control 语句xe 处理块xe 分支xe 流控制xe 流控制, 内部xe 流控制, 外部xe 循环与其他高级 编程语言一 样(如,C、 FORTRAN 和 PASCAL 等等),ABAP/4 提供也用于 控制程序流 的标准关键 字。这些关 键字用于_ 分支 (IF、CASE)_ 循环 (DO、WHILE)然而,ABAP/4 与其他编程 语言不同之 处在于其具 有程序流的 内部控制和 外部控制。_ 内部控制 由上述标准 关键字引导

52、 。在程序代 码中对其进 行定义。_ 外部控制 由事件引导 。事件由 ABAP/4 程序(系统 程序或用户 程序)或者 交互式用户 输入(例如 ,使用鼠标 在屏幕上单 击)生成。 系统不必按 ABAP/4 程序中列出 的顺序对进 行语句处理 。这使得 ABAP/4 成为事件驱 动编程语言 ,类似于 Microsoft 的Visual Basic。时间事件和 ABAP/4 程序的连接 由事件关键 字提供。ABAP/4 程序中的每 个语句都属 于特别的事 件关键字。 即使在程序 中没有指定 任何事件关 键字,所有 语句都自动 归属于标准 事件关键字 (START-OF-SELECTION) ,与程

53、序中 事件语句的 次序完全不 相干。所有属于某 一特定事件 关键字的语 句形成一个 处理块。处 理块是一个 在事件发生 时执行的模 块。处理块 内的程序流 依赖于内部 控制。系统 按顺序处理 语句,或按 照前面提到 的标准关键 字定义的顺 序处理。ABAP/4 程序常规结 构如下:假设当用户 选择一行后 ,生成列表 且提供一些 细分设备的 报表程序必 须作出反应 (详细信息 ,参见 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC23E.DOC z_001 a t * MERGEFORMAT 交互列表)。需要为 该事件处理 的代码必须

54、 插入事件关 键字 AT LINE-SELECTION 之后。AT LINE-SELECTION. MOVE X TO FLAG. 无论何时用 户通过单击 鼠标或按 F2 键在列表中 选择一个项 目时,AT LINE-SELECTION 和下一个事 件关键字之 间的所有语 句将被处理关于外部控 制的详细信 息,如事件 及其如何与 ABAP/4 程序相互作 用的信息, 参见 LINK Word.Document.6 BOYSPUBLICDOKU30DBCENGLISHBCAB4BC20E.DOC z_000 a t * MERGEFORMAT C通过事件控制 ABAP/4 程序流。该节说明如 何

55、使用外部 控制控制处 理块内的程 序流。要控制 ABAP/4 程序中的内 部流,请遵 循结构化编 程原则并将 程序模块划 分为单个逻 辑相关语句 块(这些组 成控制结构 )。其中的 每个语句块 都执行主任 务的一部分 。要使程序易 于阅读,应 该缩排控制 结构中的语 句块。出于 布局需要, 可以使用 ABAP/4 编辑器功能 “编辑 - 插入语句.” 和“程序 - 整齐打印程 序”(详细 信息,参见 ABAP/4 程序布局 (页 LINK Word.Document.6 D:LINBCAB4BC04E.DOP z_003page a t * MERGEFORMAT 26)。可以用 IF、CAS

56、E、 DO 和 WHILE 之类的关键 字控制处理 块中不同语 句之间的程 序流。这些 语句允许编 制条件和无 条件的分支 和循环。条 件使用逻辑 表达式,可 以是真,也 可以为假。 set Z_028page page 8 8编程逻辑表 达式xe 比较数据字段xe 逻辑表达式xe 逻辑运算符xe 数据对象, 比较xe 条件xe 运算符, 逻辑使用条件控 制程序中的 内部流。要 用公式指定 条件,请使 用比较数据 字段的逻辑 表达式,如 下所示:语法 .该表达式比 较两个字段 。可能为真 ,也可能为 假。在带关 键字 IF、 CHECK 和 WHILE 的条件语句 中使用逻辑 表达式。根据操作

57、数 和 的数据类型 ,可以使用 不同的逻辑 运算符。允 许进行:除上述比较 之外,还可 以执行测试 以检查数据 字段是否完 全满足一定 条件。可以 使用这些测 试:另外,可以 将几个逻辑 表达式组合 为一个简单 逻辑表达式 。 set Z_012page page 8 8比较所有的 字段类型xe EQ, 等号xe GE, 大于等于运算符xe GT, 大于运算符xe LE, 小于等于运算符xe LT, 小于运算符xe NE, 不等于运算符xe 比较xe 比较, 全部数据类型要比较所有 的字段类型 ,可以在逻 辑表达式中 使用下列运 算符:含 义EQ等于 =等于NE不 等于不 等于不 等于LT小

58、于小于LE小 于等于大于GE大 于等于=大 于等于操作数可以 是数据库字 段、内部字 段、文字或 常数。除基本字段 外,还可以 将结构数据 类型和上表 中的运算符 结合起来作 为操作数。 字段串逐个 组件进行比 较,嵌套的 结构分为基 本的字段。 关于比较内 表的详细信 息,参见 比较内表 (页 Error! Not a valid link.) 。如果有意义 ,可以对不 同数据类型 的字段进行 比较。如果 字段可转换 ,就可以进 行比较。在 比较之前, 系统将按照 下列层次规 则执行自动 类型转换( 参见 键入转换 (页 LINK Word.Document.6 D:LINBCAB4BC08

59、E.DOP z_012page a t * MERGEFORMAT 636) ):1.如果 操作数之一 是浮点数( 类型 F),则系 统将其它操 作数转换为 类型 F。2.如果 操作数之一 是压缩字段 (类型 P),则系 统将其它操 作数转换为 类型 P。3.如果 操作数之一 是日期字段 (类型 D)或时间 字段(类型 T),则系 统将其它操 作数转换为 类型 D 或 T。不支持 日期和时间 字段之间的 比较,这会 导致程序中 断。4.如果 操作数之一 是字符字段 (类型 C)且其它 操作数是十 六进制字段 (类型 X),则系 统将类型 X 的操作数转 换为类型 C。5.如果 操作数之一 是字

60、符字段 (类型 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 true:.IF F = P . WRITE: / F,=,P.ELSE. WRITE: / F,= 50.00 30 NE 50.00这里,在 IF 语句中使用 两个逻辑表 达式。如果 逻辑表达式 为真,则屏 幕上显示出 来。如果逻 辑表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论