本篇文章主要介紹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類型,所有的字元都會向前移動一位,最好一位删除。
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.:移除字元串右邊的子字元串。
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>.
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.:将一字元串參照另一字元串轉換。
按逐個字元判斷,若原字元串中的某一字元在參考字元串中存在,那麼取參考字元串中該字元首次出現位置的下一個字元串作為轉換對象。若參考字元串中不存在該字元或該字元首次出現位置在參考字元串的最後一位,則不進行轉換。
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中。
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-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.