字元變量
字元變量是通過DATA語句後面跟上TYPE C進行定義的,且跟上LENGTH n來定義字元變量的長度。字元變量的長度定義後就不能再改變,它沒有象C語言用'/0'表示字元變量結束。在ABAP中所有在字元右邊的空格都将被忽略,也就是說将一個由空格字組成字元串指派給字元變量,系統仍然認為是個空字元串(empty/initial)。
DATA: cvar TYPE c LENGTH 20,
len TYPE i.
cvar = ' '.
len = STRLEN( cvar ).
WRITE:/ 'Charlen: ', len.
這段代碼将一個由空格組成的字元串指派給字元變量,系統得到變量長度是0.
注意:有一個特例,在concatenate語句中的separated by ' ',該語句中的 ' '将作為空格處理而非空字元串處理。
字元串變量
字元串變量在記憶體裡是由兩部分組成:資料管理頭和字元串資料。在資料管理頭裡有指向字元串資料指針域和字元串長度訓示域。字元串變量最大理論長度為2147483647個字元,它的長度常常受 ztta/max_memreq_MB 參數和并發處理程序限制。
DATA: svar TYPE string,
len TYPE i.
svar = ' '.
len = STRLEN( svar ).
WRITE:/ 'Stringlen: ', len.
運作該段代碼,字元串的長度也是0。這主要由于字元常量' '在ABAP裡當作字元變量處理,這樣空格就被忽略了(也就是認為是初始化的)。
我們可以使用字元串常量來避免該問題。字元串常量和字元常量的差別主要起始和結束的标記符号不同,字元串常量使用“`”,字元常量使用“'”。使用字元串常量` `,我們将可以得到包含空格的字元串變量,系統将不忽略尾部的空格。
expected result:
DATA: svar TYPE string,
len TYPE i.
svar = ` `.
len = STRLEN( svar ).
WRITE:/ 'Stringlen: ', len.
注意:ABAP将保留關鍵字SPACE定義為一個字元長度的字元常量,參見系統代碼單元:<SYSINI>。是以,将SPACE指派給字元串變量,字元串變量認為空,而非是一個空格。如果要将空格串指派給字元串變量,我們就需要用到字元串常量指派。請參見下面用空格替換分号的代碼:
DATA: cvar TYPE c LENGTH 20,
svar TYPE string,
len TYPE i.
cvar = 'A;B;C;D;E'.
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH ' '. " (1)
WRITE:/ cvar.
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH space. " (2)
WRITE:/ cvar.
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH ` ` . " (3)
WRITE:/ cvar.
svar = `A;B;C;D;E`.
REPLACE ALL OCCURRENCES OF ';' IN svar WITH ` `. " (4)
WRITE:/ svar.
運作該代碼我們看到 (1) 和 (2)沒有得到需要的結構,字元常量(space 和' ')都被系統當作空字元處理,而非空格字元處理。 代碼(3) 也不能得出正确的結果,主要由于` `将先轉換為字元變量,再參與計算,這樣空格又被忽略。隻有代碼(4) 才能得到我們需要的結果: A B C D E.
與其他類型變量混合使用
DATA: cvar TYPE c LENGTH 20,svar TYPE string,pvar TYPE p LENGTH 5,l TYPE i.
pvar = 5.
cvar = pvar.
l = STRLEN( cvar ).
WRITE:/ 'Content: |', cvar, '| (', l, ')'.
svar = pvar.
l = STRLEN( svar ).
WRITE:/ 'Content: |', svar, '| (', l, ')'.
pvar = - 5.
cvar = pvar.
l = STRLEN( cvar ).
WRITE:/ 'Content: |', cvar, '| (', l, ')'.
svar = pvar.
l = STRLEN( svar ).
WRITE:/ 'Content: |', svar, '| (', l, ')'.
使用字元變量将使用右對齊的轉換進行指派,其中最右邊一位為符号位,如果是正5符号将為空格将被忽略,字元長度将為19。如果負5的話符号将為"-"占用,那樣字元長度将為20.
使用字元串變量将使用左對齊的轉換進行指派,其中最左邊一位為符号位,,如果是正5符号将為空格,字元長度将為2。如果負5的話符号将為"-"占用,那樣字元長度仍然為2.
對于這個指派轉換差異,大家在代碼處理時一定要注意。
使用字元串變量的缺點
很多人都會認為使用字元串變量将會影響性能,其實這對于ABAP系統來說不是很大問題,ABAP程式的性能更多取決資料的處理性能。
子串處理
使用字元變量你可以使用下列方式進行字串指派。
DATA: cvar TYPE c LENGTH 20,svar TYPE stringi.
cvar = 'Hello World'.
cvar+5(1) = ','.
write:/ cvar.
但對于字元串變量,你就不能這麼操作,你就得需要使用REPLACE指令進行字串處理。
DATA: cvar TYPE c LENGTH 20,svar TYPE stringi.
svar = 'Hello World'."
svar+5(1) = ','. <= compiler error
REPLACE SECTION OFFSET 5 LENGTH 1 OF svar WITH ','.
WRITE:/ svar.
So, you have to write a little bit more code.
字元串翻譯
If you need to translate your report to different languages you can just add a nummer in brackets after the literal 'Error Message'(001) which is more readable as text-001. This is not working with string literals.
幾個常用字元串處理類
CL_ABAP_CHAR_UTILITIES
CL_ABAP_STRING_UTILITIES
Source URL:http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/15889