前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ABAP-逻辑表达式&字符串

ABAP-逻辑表达式&字符串

作者头像
古道无仙
发布2021-03-11 11:34:15
2.9K0
发布2021-03-11 11:34:15
举报
文章被收录于专栏:叕鰦座

一、编程逻辑表达式

<f1> <operator> <f2>.该表达式比较两个字段,可能为真,也可能为假。在带关键字 IF、CHECK和WHILE的条件语句中使用逻辑表达式。根据<f1>和<f2>的数据类型,可以使用不同的逻辑运算符。

1、比较所有的字段类型

<运算符> 含义 EQ 等于 = 等于 NE 不等于 <> 不等于 >< 不等于 LT 小于 < 小于 LE 小于等于 <= 小于等于 GT 大于 > 大于 GE 大于等于 >= 大于等于

操作数可以是数据库字段、内部字段、文字和常数。

2、比较字符串和数字串

<运算符> 含义 CO 仅包含 CN 不仅包含 CA 包含任何 NA 不包含任何 CS 包含字符串 NS 不包含字符串 CP 包含模式 NP 不包含模式

(1)CO(仅包含)

如果<f1>仅包含<f2>中的字符,则逻辑表达式 <f1> CO <f2> 为真,该比较区分大小写,并包含尾部空格。如果比较结果为真,则系统字段SY-FDPOS包括<f1>的长度,如果为假,则SY-FDPOS包含<f1>中第一个未在<f2>内出现的字符的偏移量。

(2)CN(不仅包含)

如果<f1>还包含<f2>之外的其它字符,则逻辑表达式<f1> CN <f2>为真,该比较区分大小写,并包含尾部空格。如果比较结果为真,则系统字段SY-FDPOS包含<f1>中第一个未同时在<f2>中出现的字符的偏移量。如果为假,则SY-FDPOS包含<f1>的长度。

(3)CA(包含任何)

如果<f1>至少包含<f2>的一个字符,则逻辑表达式<f1> CA <f2>为真,该比较区分大小写。如果比较结果为真,则系统字段SY-FDPOS包含<f1>中第一个也在<f2>中出现的字符的偏移量,如果为假,SY-FDPOS包含<f1>的长度。

(4)NA(不包含任何)

如果<f1>不包含<f2>的任何字符,则逻辑表达式<f1> NA <f2>为真,该比较区分大小写。如果比较结果为真,则系统字段SY-FDPOS包含<f1>的长度,如果为假,则SY-FDPOS包含<f1>中在<f2>内出现的第一个字符的偏移量。

(5)CS(包含字符串)

如果<f1>包含字符串<f2>,则逻辑表达式<f1> CS <f2>为真,忽略尾部空格且比较不区分大小写。如果比较结果为真,则系统字段SY-FDPOS包含<f2>在<f1>中的偏移量,如果为假,则SY-FDPOS包含<f1>的长度。

(6)NS(不包含字符串)

如果<f1>不包含字符串<f2>,则逻辑表达式<f1> NS <f2>为真,忽略尾部空格且比较不区分大小写。如果比较结果为真,则系统字段SY-FDPOS包含<f1>的长度,如果为假,则SY-FDPOS包含<f2>在<f1>中的偏移量。

(7)CP(包含模式)

如果<f1>包含模式<f2>,则逻辑表达式<f1> CP <f2>为真。如果<f2>属于类型C,则可以在<f2>中使用通配符“*”用于任何字符串,“+”用于任何单个字符。忽略尾部空格且比较不区分大小写。如果比较结果为真,则系统字段SY-FDPOS包含<f2>在<f1>中的偏移量,如果为假,则SY-FDPOS包含<f1>的长度。如果要对<f2>中的特殊字符进行比较,请将换码字符 # 放到其前面。可以使用换码字符 # 指定大小写字符、通配符 "*"(输 入 #*)、通配符 "+" (输入 #+)、换码符号本身(输入 ##)、字符串结尾的空格(输入 #___)。

(8)NP(不包含模式)

如果<f1>不包含模式<f2>,则逻辑表达式<f1> NP <f2>为真,忽略尾部空格且比较不区分大小写。如果比较结果为真,则系统字段 SY-FDPOS 包含<f1>的长度,如果为假,SY-FDPOS包含<f2>在<f1>中的偏移量。

3、二进制位结构的比较

<运算符> 含义 O 二进制位是1 Z 二进制位是0 M 混合二进制位

(1)O(二进制位是1)

如果<hex>中二进制位是1的位置,在<f>中是1,则逻辑表达式<f> O <hex>为真。

(2)Z(二进制位是0)

如果<hex>中二进制位是1的位置,在<f>中是0,则逻辑表达式<f> Z <hex>为真。

(3)M(混合二进制位)

如果<hex>中二进制位是1的位置起,在<f>中至少一个是1,一个是0,则逻辑表达式<f> M <hex>为真。

4、检查字段是否属于某一范围

语法:<f1> BETWEEN <f2> AND <f3>.如果<f1>在<f2>和<f3>之间的范围内发生,则表达式为真。

5、检查初始值

语法:<> IS INTIAL.如果<f>包含本身类型的初始值,则表达式为真。

6、检查选择条件

语法:<f> IN <seltab>.如果字段<f>的内容符合选择表<seltab>中的条件,则表达式为真。

7、组合几个逻辑表达式

通过使用逻辑连接运算符 AND、OR 和 NOT,可以将几个逻辑表达式组合为单个表达式:要将几个逻辑表达式组合为单个表达式,且该表达式仅当所有组件表达式为真时才为真,则表达式之间要用 AND 连接。要将几个逻辑表达式组合为单个表达式,且只要其中一个组件表达式为真时,该表达式即为真,则表达式之间要用 OR 连接。要转化逻辑表达式的结果,请在其前面指定 NOT。NOT 优先于 AND,AND 优先于 OR。

二、编程分支和循环

1、使用IF的条件分支

依据条件将程序流转到特定的语句块中。

语法:IF <condition1>. <statement block> ELSEIF <condition2>. <statement block> ELSEIF <condition3>. <statement block> ..... ELSE. <statement block> ENDIF.

注意:允许无限地嵌套 IF - ENDIF 语句块,但是必须在相同的处理块中终止。换句话说,就是 IF - ENDIF 块不能包含事件关键字 。

2、使用CASE的条件分支

根据特殊数据字段的内容执行不同的语句块。

语法:CASE <f>. WHEN <f1>. <statement block> WHEN <f2>. <statement block> WHEN <f3>. <statement block> WHEN ... ...... WHEN OTHERS. <statement block> ENDCASE.

注意:可以嵌套 CASE - ENDCASE 块,且可以与 IF - ENDIF 结合使用,但必须在同 一处理块中终止。

3、使用DO的无条件循环

语法:DO [<n> TIMES] [VARYING <f> FROM <f1> NEXT <f2>].

<statement block>

ENDDO.

在发现EXIT、STOP和REJEST语句之前,系统继续执行由DO引导,ENDDO结束的语句块。可以使用TIMES选项限制循环次数,<n>可以是文字或变量,如果<n>是0或负数,则系统不执行该循环。系统字段SY-INDEX中包含已处理过的循环次数。

注意:使用DO语句时要避免死循环,如果不使用TIMES选项,则在语句块中至少应包含一个EXIT、STOP和REJEST语句,以便系统能够退出循环。可以任意嵌套DO循环,也可以与其他循环组合使用。系统字段SY-INDEX记录每个循环各自的循环次数。应保证循环次数不超过涉及到的变量 <f1>、 <f2>、 <f3> 的数量。

4、使用WHILE的条件循环

只要条件为真,就不止一次执行语句。

语法:WHILE <condition> [VARY <f> FROM <f1> NEXT <f2>].

<statement block>

ENDWHILE.

只要 <condition> 是真,或系统未发现 EXIT、 STOP 或 REJECT 语句,系统将继续执行由 WHILE 语句引导、 ENDWHILE 结束的语句块。系统字段 SY-INDEX 中包含已执行的循环次数。可以任意嵌套 WHILE 循环,也可与其他循环结合使用。

注意:使用 WHILE 语句要避免死循环。请记住,在一段时间之后,WHILE 语句条件应变为假,或者系统能够找到 EXIT、 STOP 或 REJECT 语句退出循环。

5、终止循环

(1)CONTINUE 无条件终止循环过程

语法:CONTINUE.在CONTINUE语句之后,系统跳过当前语句块中所有剩余语句块,继续该语句后面的循环。

(2)CHECK 有条件终止循环过程

语法:CHECK <condition>.如果条件为假,系统跳过当前语句块中所有剩余语句块。继续该语句后面的循环。

(3)EXIT 完全终止循环

语法:EXIT.EXIT语句之后,系统立即退出循环,继续结束语句(ENDDO、ENDWHILE、ENDSELECT)后面的处理。在嵌套循环中,系统仅退出当前循环

字符串首字符索引为 0; Character Fields: C,N, D, T, string (CNDT=> CN Data Time)

1. 字符串连接 CONCATENATE dobj1 dobj2 ... INTO result [IN { BYTE | CHARACTER } MODE] [SEPARATED BY sep].

2.字符串分隔, split 一个string的部分到一个内表或一系列的变量 SPLIT dobj AT sep INTO { {result1 result2 ...} | {TABLE result_tab} } [IN {BYTE|CHARACTER} MODE].

3. 字符串查找, 在一个字符串中查找模式串(FIND or SEARCH) FIND sub_string IN SECTION [OFFSET off] [LENGTH len] OF dobj --> 灰色部分用来缩小目的串被查找的范围 [ IN { BYTE | CHARACTER } MODE ] [ { RESPECTING | IGNORING } CASE ] [ MATCH OFFSET moff ] [MATCH LENGTH mlen ].

FIND 'knows' IN SECTION OFFSET 5 OF 'Everybody knows this is nowhere' MATCH OFFSET moff " => moff = 10 MATCH LENGTH mlen. " => mlen= 5

在字符串dobj中查找pattern SEARCH dobj FOR pattern [IN { BYTE | CHARACTER } MODE] [STARTING AT p1] [ENDING AT p2] [ABBREVIATED] [AND MARK]. if sy-subrc = 0. then SY-FDPOS = 返回pattern在dobj中的位置 About pattern: 'pat' - 忽略尾部空格 '.pat.' -不忽略尾部空格 '*pat' - 以pat结尾 'pat*' - 以pat开始 单词是指: 用 空格 , ; : ? ! () / + =分隔的字串

4. 字符串替换 REPLACE SECTION [OFFSET off] [LENGTH len] OF dobj WITH new [IN { BYTE | CHARACTER } MODE].

REPLACE [{FIRST OCCURRENCE}|{ALL OCCURRENCES} OF] [SUBSTRING] sub_string IN [SECTION [OFFSET off] [LENGTH len] OF ] dobj WITH new [IN {BYTE|CHARACTER} MODE] [{RESPECTING|IGNORING} CASE] [REPLACEMENT COUNT rcnt] [REPLACEMENT OFFSET roff] [REPLACEMENT LENGTH rlen]. eg: DATA: text1 TYPE string VALUE 'xababx'. REPLACE 'ab' IN text1 WITH 'xx'. --> xxxabx

5. 去前导0 (Remove leading zero) SHIFT dobj LEFT DELETING LEADING '0'. FM : CONVERSION_EXIT_ALPHA_OUTPUT

增前导0 (Add leading zero) DATA v_s(5). UNPACK '123' to v_s. ==> v_s = '00123' FM: CONVERSION_EXIT_ALPHA_INPUT

SHIFT dobj [{BY num PLACES} | {UP TO sub_string}] [LEFT|RIGHT] [CIRCULAR] SHIFT dobj {LEFT DELETING LEADING} | {RIGHT DELETING TRAILING} pattern. [IN {BYTE|CHARACTER} MODE].

6. 字符串的长度, 内表的行数 STRLEN( dobj) 字符串的长度 LINES( itab ) 内表的行数

7. 删字符串中的空格: CONDENSE text [NO-GAPS].

8. 大小写转换,字符变换 TRANSLATE text {TO {UPPER|LOWER} CASE} | {USING pattern}. eg: text = `Barbcbdbarb`. TRANSLATE text USING 'ABBAabba'. =>'Abracadabra'

9. CONVERT CONVERT DATE dat [TIME tim [DAYLIGHT SAVING TIME dst]] INTO TIME STAMP time_stamp TIME ZONE tz.

CONVERT TIME STAMP time_stamp TIME ZONE tz INTO [DATE dat] [TIME tim] [DAYLIGHT SAVING TIME dst].

CONVERT TEXT text INTO SORTABLE CODE hex.

10. OVERLAY text1 WITH text2 [ONLY pattern]. 如果不指定后面的ONLY pattern, text1中的空格会被text2中的对应字符替代 如果指定只有匹配的字符才会被替代,注意大小写敏感

11. 模式匹配 CO / CN contains only or notCA / NA contains any or not anyCS / NS contain string or not CP / NP contains pattern or not

NOTE: a) . CO, NO, CA, NA比较时区分大小写, 并且尾部空格也在比较的范围之内 data: s1(10) value 'aabb'. if s1 co 'ab' ==> false if s1 co 'ab ' ==>true CS, NS, CP, NP不区分大小写和尾部空格

b) .对于CP, NP * = s? + = s # 换码字符, 用于匹配 *, +这样的字符 ## #* #+ #___ 比较结尾空格 #[a-z] 在CP, NP中强制区分大小写

c) . 比较结束后,如果结果为真,sy-fdpos将给出s2在s1中的偏移量信息

12. 特殊字符在字符串中加入回车换行或TAB字符,在其他语言可以使用1310这样的ASCII码进行插入.但在ABAP中要使用sap的类CL_ABAP_CHAR_UTILITIES. 里面有字符常量:CR_LF,HORIZONTAL_TAB,NEWLINE等等.

13. 字符串位操作 DATA: v_s(10) value 'abcd'. v_s+0(1) = 'b'. v_s+2(*) = '12'. => v_s = 'bb12'.

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叕鰦座 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档