本篇文章主要介绍ABAP编程中字符串的控制与操作,好了废活说多了也没用,开始吧。
1)CONCATENATE:实现字符串的合并。
基本语法:
CONCATENATE f1...fn INTO g [SEPARATED BY h]
FOR EXAMPLE:
DATA:one(10) VALUE 'Hello',
two(10) VALUE 'SAP',
result1(10),
result2(10),
l1 TYPE I,
l2 TYPE I.
CONCATENATE one two INTO result1 SEPARATED BY SPACE.
CONCATENATE one two INTO result2.
l1 = STRLEN( result1 ) + STRLEN( result2 ).
WRITE: / 'result1=',result1, "输出: result1=Hello SAP
/ 'result2=',result2. "输出:result2=HelloSAP
WRITE: / 'STRLEN=',l1. "输出:STRLEN=17
以上所示代码输出结果为result1等于Hello SAP,result2等于HelloSAP,SPARATED BY表示在连接字符串中加入分隔符号,不然合并字符串的前后空格会自动清除,上例所示中加入了空格。
2)SPLIT:实现字符串的拆分。
SPLIT f AT g INTO h1...hn:将字符串的值分配给具体变量。
SPLIT f AT g INTO TABLE itab:将字符串的值分配给一内表。
FOR EXAMPLE:
DATA:names(30) TYPE C VALUE 'HELLO,SAP',
names2 TYPE STRING,
sone(10) TYPE C,
stwo(10) TYPE C,
delimiter(1) VALUE ','.
TYPES:BEGIN OF itab_type,
word(20),
END OF itab_type.
DATA myitab TYPE STANDARD TABLE OF itab_type WITH HEADER LINE. "定义内表
SPLIT names AT delimiter INTO sone stwo.
SPLIT 'ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINTH,TEN,ELEVEN,TWELVE' AT delimiter INTO TABLE myitab.
WRITE: / 'sone=',sone, "输出:sone=HELLO
/ 'stwo=',stwo. "输出:stwo=SAP
LOOP AT myitab.
WRITE myitab. "循环输出ONE、TWO...ELEVEN。
ENDLOOP.
3)SHIFT:将字符串整体或者子串进行转移
SHIFT c <LEFT/RIGHT/CIRCULAR>.:指定字符移动方向,向左、向右或者循环移动一个字符,默认向左。
SHIFT c BY n PLACES.:指定移动字符位数。
如果操作对象是C类型,那么它的所有字符都会向前移动一位,最后一位用空格代替。倘若为STRING类型,所有的字符都会向前移动一位,最好一位删除。
FOR EXAMPLE:
DATA:str1(10) TYPE C VALUE 'ABCDEFGHIJ'.
str2 TYPE STRING,
str3(10) TYPE C,
str4(10) TYPE C,
str5(10) TYPE C,
str6(10) TYPE C.
str6 = str5 = str4 = str3 = str2 = str1.
SHIFT str1. "执行结果:'BCDEFGHIJ ',整体长度不变,左移一位,最后为空格
SHIFT str2. "执行结果:'BCDEFGHIJ',左移一位,最后一位删除
SHIFT str3 RIGHT. "执行结果:' ABCDEFGHI',整体长度不变,右移一位,首位为空格
SHIFT str4 CIRCULAR. "执行结果:'BCDEFGHIJA',整体长度不变,字符循环移动一位
SHIFT str5 BY 5 PLACES. "执行结果:'FGHIJ ',整体向左移动5位
SHIFT str6 RIGHT BY 2 PLACES. "执行结果:' ABCDEFGHIJ',整体向右移动2位
4)SHIFT语法二
SHIFT c UP TO c1.:该定义可指定某字符从某一具体子串进行位移,并将执行结果返回给系统变量SY-SUBRC,若执行成功时,返回值为"0",倘若子串与原字符串不匹配,返回值为"4"。
FOR EXAMPLE:
DATA:shift_str1(10) VALUE 'ABCDEFGHIJ',
shift_str2(10) VALUE 'ABCDEFGHIJ',
s_three(3) VALUE 'DEF',
s_four(4) VALUE 'DEF '.
SHIFT shift_str1 UP TO s_three.
WRITE: / 'shift_str1=',shift_str1,',SY-SUBRC=',SY-SUBRC. "输出:shift_str1='DEFGHIJ',SY-SUBRC=0
SHIFT shift_str2 UP TO s_four.
WRITE: /'shift_str2=',shift_str2,',SY-SUBRC=',SY-SUBRC. "输出:shift_str2='ABCDEFGHIJ',SY-SUBRC=0
5)SHIFT语法三
SHIFT c LEFT DELETING LEADING c1.:移除字符串左边的字符串。
SHIFT c RIGHT DELEING TRAILING c1.:移除字符串右边的子字符串。
FOR EXAMPLE:
DATA: shift_string1(15) VALUE ' ABCDEFGHIJ',
shift_string2(15) VALUE ' ABCDEFGHIJ',
shift_string3(15) VALUE ' ABCDEFGHIJ',
shift_string4 TYPE STRING,
m1(4) VALUE 'ABCD',
m2(6) VALUE 'HIJ'.
shift_string4 = shift_string1.
WRITE: / 'shift_string1=',shift_string1. "输出:shift_string1= ' ABCDEFGHIJ'。
SHIFT shift_string1 LEFT DELETING LEADING SPACE.
WRITE: / 'shift_string1=',shift_string1,'AA'. "输出:shift_string1= 'ABCDEFGHIJ AA',移除前面空格,后面补空格。
WRITE: / 'shift_string2=',shift_string2. "输出:shift_string2= ' ABCDEFGHIJ'。
SHIFT shift_string2 RIGHT DELETING TRAILING m1.
WRITE: / 'shift_string2=',shift_string2. "输出:shift_string2=' ABCDEFGHIJ',子字符不符合条件,未发生改变。
WRITE: / 'shift_string3=',shift_string3. "输出:shift_string3= ' ABCDEFGHIJ'。
SHIFT shift_string3 RIGHT DELETING TRAILING m2.
WRITE: / 'shift_string3=',shift_string3. "输出:shift_string3= ' ABCDEFG',移除字符串右边'HIJ',前面补空格。
WRITE: / 'shift_string4=',shift_string4. "输出:shift_string4= ' ABCDEFGHIJ'。
SHIFT shift_string4 LEFT DELETING LEADING SPACE.
WRITE: / 'shift_string4=',shift_string4,'AA'. "输出:shift_string4= 'ABCDEFGHIJ',直接删除前面的空格。
6)CONDENSE:重新整合分配字符串
CONDENSE c <NO-GAPS>.
FOR EXAMPLE:
DATA condense_name(30).
condense_name(10) = ' Dr.'.
condense_name+10(10) = 'Michael'.
condense_name+20(10) = 'Hofmann'.
CONDENSE condense_name.
WRITE: / 'condense_name=',condense_name. "输出:'Dr. Michael Hofmann'
变量被重新赋值,并以空格分开,字符串前置空格被删除。若在函数后加上关键字"NO-GAPS",那么输出结果将变化为:'Dr.MichaelHofmann'。该语法同样适用于结构体中,结构体中的不同字段内容将会按字段长度被重新分配。
DATA: BEGIN OF condense_name2,
title(8) VALUE ' Dr.',
first_name(10) VALUE 'Michael',
surname(10) VALUE 'Hofmann',
END OF condense_name2.
CONDENSE condense_name2.
WRITE: / 'condense_name2=',condense_name2. "输出:Dr. Michael Hofmann 按原值输出。
WRITE: / 'condense_name2-title=',condense_name2-title, "输出:Dr. Mich,title字段被重新按长度赋值,长度为8。
/ 'condense_name2-first_name=',condense_name2-first_name, "输出:ael Hofman,first_name字段被重新按长度赋值,长度为10。
/ 'condense_name2-surname=',condense_name2-surname. "输出:n,surname字段被重新按长度赋值,长度为10。故就剩下未尾字母n。
7)TRANSLATE:实现字符串转换
TRANSLATE c TO UPPER CASE.:将字符串转换为大写。
TRANSLATE c TO LOWER CASE.:将字符串转换为小写。
FOR EXAMPLE:
DATA:city(9) TYPE C VALUE 'dongguang',
country(5) TYPE C VALUE 'CHINA'.
TRANSLATE city TO UPPER CASE.
TRANSLATE country TO LOWER CASE.
WRITE: / 'city=',city,
/ 'country=',country.
执行结果:city=DONGGUANG country=china。
TRANSLATE c USING c1.:将一字符串参照另一字符串转换。
按逐个字符判断,若原字符串中的某一字符在参考字符串中存在,那么取参考字符串中该字符首次出现位置的下一个字符串作为转换对象。若参考字符串中不存在该字符或该字符首次出现位置在参考字符串的最后一位,则不进行转换。
FOR EXAMPLE:
DATA:translate_str1(20) TYPE C VALUE 'abcabcabcXabcf',
translate_str2(15) TYPE C VALUE 'aXbaYBzbZacZB'.
TRANSLATE translate_str1 USING translate_str2.
WRITE: / 'translate_str1=',translate_str1. "执行结果:'XaZXaZXaZXXaZf'.
TRANSLATE c...FROM CODE PAGE g1 ... TO CODE PAGE g2.
SAP可以应用于多种软硬件系统,不同系统间的信息传递和通信必然涉及代码转换问题。例如,HP-UX系统与IBM EBCDIC系统中的代码转换可通过下列语句实现,具体的代码保存在数据表TCP100中。
FOR EXAMPLE:
TRANSLATE c FROM CODE PAGE '1110' TO CODE PAGE '0100'.
8)OVERLAY:参考字符串对空白字符进行填充。
OVERLAY c1 WITH c2.
该函数对原字符串及参考字符串按字符逐一比较,若原字符串某位置字符值为空而参考字符串有值存在,则用参考字符串字符值进行取代。
FOR EXAMPLE:
DATA:overlay_str1(16) VALUE 'Th t h s ch ng d',
overlay_str2(20) VALUE 'Grab a pattern'.
OVERLAY overlay_str1 WITH overlay_str2.
WRITE: / 'overlay_str1=',overlay_str1. "输出:overlay_str1='That has changed'.
9)REPLACE:字符串按条件取代
REPLACE f ... WITH g ... INTO field.
FOR EXAMPLE:
DATA replace_str1(10) VALUE '12345ABCDE'.
REPLACE '12345' WITH '56789' INTO replace_str1.
WRITE: / 'replace_str1=',replace_str1. "输出:replace_str1='5678ABCDE'。
10)SEARCH:搜索指定字符串
A)SEARCH f FRO g:g表示被搜索的字符串。
...ABBREVIATED:从指定字符串中按顺序搜索相匹配字符串。
...STARTING AT n1:从字符串n1个字符开始搜索。
...ENDING AT n2:搜索到字符串第n2个字符止。
...AND MARK:从指定字符串是模糊搜索相匹配字符串。
B)SEARCH itab FOR g:g表示被搜索字符串。
...ABBREVIATED:从内表中按顺序逐行搜索相匹配字符串。
...STARTING AT line1:从内表中具体某行开始搜索匹配字符串。
...ENDING AT line2:搜索最大范围到内表中具体某行。
...AND MARK:从内表中模糊搜索相匹配字符串。
通过系统变量SY-SUBRC可以回执字符串查找的结果,若回执等于"0",则表示查找成功。某段字符在字符串中的具体位置保存在系统变量SY-FDPOS中。
DATA search_str(50).
MOVE 'Welcome to SAP world!' TO search_str.
SEARCH search_str FOR 'wld' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "执行结果:wld按顺序包含在子字符串'world'中,SY-SUBRC=0,SY-FDPOS=15
SEARCH search_str FOR 'SAP' STARTING AT 10.
WRITE: / '从第十位开始:',
/ 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "执行结果:从第10位开始查找,SY-SUBRC=0,SY-FDPOS=2
SEARCH search_str FOR 'SAP' ENDING AT 10.
WRITE: / '查找第十位结束:',
/ 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "执行结果:查找到第10位结束,SY-SUBRC=4,SY-FDPOS=0
SEARCH search_str FOR '*AP' AND MARK.
WRITE: / '查找包含AP的子字符串,SAP符合条件,默认为查找SAP:',
/ 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "查找包含'AP'子字符串,'SAP'符合条件,默认为查找'SAP',SY-SUBRC=0,SY-FDPOS=11
SEARCH search_str FOR '*A' AND MARK.
WRITE: / '匹配字符串必须是子字符串以空格分开的最后几位:',
/ 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "匹配字符串必须是子字符串以空格分开的最后几位,SY-SUBRC=4,SY-FDPOS=0
对于一些特殊符号,如"*"、"@"、"."等,需要在其两边加上顿号作为修饰。如某字符串为"AAA*BBB",查找符号"*"的位置。
DATA search_str2(50).
MOVE 'AAA*BBB' TO search_str2.
SEARCH search_str2 FOR '.*.' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS.
从内表中查找字符串方法与上面基本类似,若内表有多行,那么字符串查找位置默认为从某行数据第一位开始。
DATA:BEGIN OF T_INF OCCURS 0,
LINE(80),
END OF T_INF.
*定义类型后,添加两行数据
APPEND 'HELLO SAP ' TO T_INF.
APPEND 'I am come from china' TO T_INF.
SEARCH T_INF FOR 'SAP' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC,
/ 'SY-FDPOS=',SY-FDPOS. "从内表第一行中可查找到,SY-SUBRC=0,SY-FDPOS=6
SEARCH T_INF FOR 'am' ABBREVIATED.
WRITE: / 'SY-SUBRC=',SY-SUBRC, "从内表第二行中可查找到,SY-SUBRC=0,SY-FDPOS=2
/ 'SY-FDPOS=',SY-FDPOS.