1. String Template
新語法引入了字符串模板,用于處理字符串連接以及格式轉換
字符串模板在 | … | 之間定義,主要分為兩部分,固定文本和變量
其中,變量只能在 { … } 內使用,大括號之外的所有字符均作為固定文本使用,空格始終不會被忽略,見例1
在使用變量時,可以通過控制語句來指定數據的顯示格式,如例2,將日期用系統格式輸出
在固定文本中,如果出現 | ,{ } 或 \ 等特殊字符時,需要使用轉義符 \
DATA: lv_str TYPE char5 VALUE '123'." 在豎線中間沒有被大括號包裹的部分將始終被視為固定文本,空格始終不被忽略lv_str = | { lv_str }|.WRITE: / lv_str.lv_str = '123'." 尾部被截斷lv_str = |567{ lv_str }|.WRITE: / lv_str.
2. Format Option
2.1 COUNTRY
根據指定國家 cty 格式化數據(數值/日期/時間),參考表 T005X 【 COUNTRY = cty 】
DATA lv_str TYPE string.DATA lv_num TYPE p DECIMALS 3." country可以根據t005x國家的配置表自動選擇合適的日期/時間/數值DATA(lv_date) = CONV d( '20230614' ).DATA(lv_time) = CONV t( '161810' ).lv_num = '123456.123'.WRITE: / '中國:'.lv_str = |{ lv_date COUNTRY = 'CN ' }|.WRITE: / lv_str.lv_str = |{ lv_time COUNTRY = 'CN ' }|.WRITE: / lv_str.lv_str = |{ lv_num COUNTRY = 'CN ' }|.WRITE: / lv_str.WRITE: / .WRITE: / '美國:'.lv_str = |{ lv_date COUNTRY = 'US ' }|.WRITE: / lv_str.lv_str = |{ lv_time COUNTRY = 'US ' }|.WRITE: / lv_str.lv_str = |{ lv_num COUNTRY = 'US ' }|.WRITE: / lv_str.
2.2 ALPHA
添加/移除前導零,返回值與字段類型一致,可使用CONV轉換成其他的類型進行處理。默認不做變更(RAW)【 ALPHA = [ IN | OUT | RAW ] 】
以物料號加前導0作為示例
DATA lv_matnr_in TYPE mara-matnr VALUE '123456'.DATA lv_matnr_out TYPE mara-matnr VALUE '012345'." 這種方式會直接按數據元素的長度補前導0" 物料號直接補齊40位前導0,不太對勁lv_matnr_in = |{ lv_matnr_in ALPHA = IN }|.lv_matnr_out = |{ lv_matnr_out ALPHA = OUT }|.lv_matnr_in = '123456'.lv_matnr_out = '012345'." 這個是專用于料號編碼轉換的函數" 刪前導0無所謂兩種方法都行,補前導0特殊字段特殊處理CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'EXPORTINGinput = lv_matnr_inIMPORTINGoutput = lv_matnr_in.CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'EXPORTINGinput = lv_matnr_outIMPORTINGoutput = lv_matnr_out.
2.3 CASE
將字符串進行大小寫轉換,默認為 RAW,該選項不會更改大小寫格式【 CASE = [ RAW | LOWER | UPPER ] 】
" CASE 在String Template當中可以轉換字母的大小寫DATA(lv_str) = 'AbCdEfG'.WRITE / |{ lv_str CASE = LOWER }|. " 小寫WRITE / |{ lv_str CASE = UPPER }|. " 大寫WRITE / |{ lv_str CASE = RAW }|. " 默認
2.4 ZERO
" ZERO 關鍵字的存在類似與一個if else語句,若為0則置空,否則保留源字符串DATA(lv_zero) = |{ 0 ZERO = NO }|.DATA(lv_str) = |{ 123 ZERO = NO }|.
3. String Functions
3.1 STRLEN
獲取字符串長度,當字符串類型為 CHAR 時,尾部空格會被忽略,當字符串類型為 STRING 時,尾部空格不會被忽略,仍會按字符被計入長度內
DATA(lv_strlen_c) = strlen( CONV char10( |1234567 | ) ). " 7
DATA(lv_strlen_s) = strlen( CONV string( |ACDEFGH | ) ). " 10
3.2 FIND
搜索指定字符串并計算偏移量,沒有遍歷到時返回 -1
可以使用 SUB ( 固定文本 ) 或者 REGEX ( 正則表達式 ) 作為指定條件進行搜索
CASE = [ abap_true | abap_false ]:大小寫檢查,默認為 abap_true,即區分大小寫
OCC = N:指定字符串在第 N 次出現,當 N 是負數時,從字符串右邊開始遍歷
OFF = N LEN = M:指定搜索區域,從第 N+1 為字符開始長度為 M 的范圍
DATA(lv_find_sub) = find( val = 'ABA123CAD' sub = 'a' case = ' ' occ = 3 ).
DATA(lv_find_reg) = find( val = 'ABA123CAD' regex = '\d' off = 0 len = 3 ).
3.3 COUNT
- COUNT
用法與 FIND 類似,但是返回值是指定字符串出現的次數,因此不能指定 OCC 參數 - COUNT_ANY_OF
計算指定字符串中的任一字符出現的總次數 - COUNT_ANY_NOT_OF
計算非指定字符串中任意字符出現的總次數
例:
DATA(lv_count) = count( val = 'ABA123CAD' sub = 'a' case = ' ' ).
DATA(lv_count_any) = count_any_of( val = 'ABA123CAD' sub = '1B' ).
DATA(lv_count_not) = count_any_not_of( val = 'ABA123CAD' sub = '1B' ).
3.4 REPLACE
替換字符串,可以指定位置進行替換,也可以查找指定字符串并替換
WITH = new 指定用于替換的字符串
OCC = N 指定字符串第 N 次出現時進行替換,N 為 0 時表示需要全部替換
其他參數可參照 FIND 表達式
例:
DATA(lv_replace) = replace( val = 'ABA123CAD' off = 0 len = 4 with = '@12@' ).
DATA(lv_replace_sub) = replace( val = 'ABA123CAD' sub = 'a' with = '@' case = ' ' ).
DATA(lv_replace_reg) = replace( val = 'ABA123CAD' regex = '\d' with = '#' occ = 0 ).
3.5 INSERT
插入字符串,可以使用 OFF 指定插入的位置,默認為 0
例:
DATA(lv_insert) = insert( val = 'ABCD' sub = '123' off = 2 ).
3.6 CONDENSE
壓縮字符串,默認會移除頭部/尾部的空格,其他部分的空格都會被壓縮至 1 位
DEL = del 指定需要刪除的字符,指定后,從字符串兩側開始遍歷并刪除字符,直到出現非指定字符
FROM = from TO = to 處理完 DEL 后,再遍歷字符串,將 from 中出現的字符,替換成 to 的第一位字符
在遍歷過程中,當同一個字符連續出現時,會被當成一個整體進行替換,所有字符均區分大小寫
例:
DATA(lv_condense_space) = condense( | This is test | ).DATA(lv_condense) = condense( val = ' XXThis ISSS X sTringXX'del = |X |from = 'TS' to = 'to' ).
3.7 CONCAT_LINES_OF
將內表中所有的記錄連接起來,通過 sep 指定分隔符
例:
DATA: lt_data TYPE TABLE OF char10.
lt_data = VALUE #( ( 'ABC' ) ( '123' ) ( 'DEF' ) ).
DATA(lv_concat_lines) = concat_lines_of( table = lt_data sep = '@' ).
3.8 REVERSE
字符串反轉
例:
DATA(lv_reverse) = reverse( 'DEMO' ).
3.9 TO_UPPER/TO_LOWER
將字符串轉換成大寫/小寫
例:
DATA(lv_to_mixed) = to_mixed( val = 'THIS is @A STRIN@G' sep = '@' case = 'X’ min = 10 ).
DATA(lv_from_mixed) = from_mixed( val = 'This IS a string' ).
DATA(lv_to_upper) = to_upper( val = 'this IS a string' ).
DATA(lv_to_lower) = to_lower( val = 'THIS IS A STRING' ).
4. Internal Table
4.1 Expressions
內表讀取不再需要使用 READ TABLE,直接使用類似于數組的方式去讀取
與READ TABLE讀表方式類似,可以通過 INDEX 去讀取指定位置的行,也可以根據條件去獲取行,但無法指定BINARY SEARCH
默認情況下如果沒有讀到記錄,會拋出異常 CX_SY_ITAB_LINE_NOT_FOUND
使用 OPTIONAL 語句時,沒有讀到記錄也不會拋異常,而是返回空的結構
使用 DEFAULT 語句,在沒有讀到記錄時,返回一個默認值,如果系統不支持這兩種,則需要使用 TRY 語句來捕獲異常
SELECT carrid, connid, countryfr, cityfromFROM spfli INTO TABLE @DATA(lt_table) UP TO 3 ROWS.DATA(lv_line_index) = lt_table[ 1 ]-carrid.DATA(lwa_line_field) = lt_table[ carrid = 'AZ'connid = '0555' ].DATA(lwa_line_optional) = VALUE #( lt_table[ 4 ] OPTIONAL ).DATA(lwa_line_default) = VALUE #( lt_table[ 4 ] DEFAULT VALUE #( carrid = 'ZZ'connid = '0239'countryfr = 'SU'cityfrom = 'CITY_NO' ) ).
4.2 Functions
LINES 計算內表總行數
LINE_EXISTS 判斷根據特定條件能否在內表中讀取到記錄,返回值為布爾型數據
LINE_INDEX 獲取內表中滿足特定條件的記錄所在的行數( INDEX )
例:
SELECT * FROM spfli INTO TABLE @DATA(lt_table) UP TO 3 ROWS.DATA(lv_lines) = lines( lt_table ).
DATA(lv_exist) = xsdbool( line_exists( lt_table[ carrid = 'AZ' ] ) ).
DATA(lv_index) = line_index( lt_table[ carrid = 'AZ' ] ).