本篇文章主要介紹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.