ABAP新语法(1)
(2022-09-03 13:58:43)
标签:
abapalvf4liumengsap |
我自己多多少少有点怀旧,不太使用新语法。
但是这个项目,周边小孩都比我小十来岁,人家还是很喜欢研究新东西的,而且项目里很多代码,确实都是用的新语法。
不用也得能看懂吧。索性也鼓捣鼓捣。
比较简单的,不用提前定义声明的情况
* old
DATA LT_DATA TYPE TABLE OF SPFLI.
SELECT * FROM SPFLI INTO TABLE LT_DATA.
*
new SELECT * FROM SPFLI INTO TABLE @DATA(LT_DATA).
-----------------------------------------------
* old
DATA LT_DATA TYPE TABLE OF SPFLI.
DATA LS_DATA LIKE LINE OF LT_DATA. LOOP AT LT_DATA INTO LS_DATA.
ENDLOOP.
READ TABLE LT_DATA INTO LS_DATA INDEX 1. *
new LOOP AT LT_DATA INTO DATA(LS_DATA).
ENDLOOP.
READ TABLE LT_DATA INTO DATA(LS_DATA) INDEX 1.
READ TABLE LT_DATA ASSIGNING FIELD-SYMBOL() INDEX 1.
内表赋值:
RANGES RT_BUKRS FOR T001-BUKRS.
RT_BUKRS[] = VALUE #(
( SIGN = 'I' OPTION = 'BT' LOW = '1001' HIGH = '1099' )
( SIGN = 'I' OPTION = 'EQ' LOW = '2001' )
).
CL_DEMO_OUTPUT=>DISPLAY( RT_BUKRS[] ).
base:内表基础上附加额外数据
RANGES RT_BUKRS FOR T001-BUKRS.
RT_BUKRS[] = VALUE #(
( SIGN = 'I' OPTION = 'BT' LOW = '1001' HIGH = '1099' )
( SIGN = 'I' OPTION = 'EQ' LOW = '2001' )
).
"内表基础上附加额外数据
RT_BUKRS[] = VALUE #( BASE RT_BUKRS[]
( SIGN = 'I' OPTION = 'EQ' LOW = '3001' )
).
CL_DEMO_OUTPUT=>DISPLAY( RT_BUKRS[] ).
关于 CORRESPONDING
DATA:LS_TMP1 TYPE SBOOK.
DATA:LS_TMP2 TYPE SBOOK.
DATA:LS_TMP3
TYPE SBOOK. SELECT SINGLE * FROM SFLIGHT INTO @DATA(LS_DATA) WHERE CARRID = 'AA'.
LS_TMP1-BOOKID = '99999999'.
LS_TMP1-CUSTOMID = '88888888'.
LS_TMP1-FLDATE = '20210101'.
LS_TMP2-BOOKID = '99999999'.
LS_TMP2-CUSTOMID = '88888888'.
LS_TMP2-FLDATE = '20210101'.
LS_TMP3-BOOKID = '99999999'.
LS_TMP3-CUSTOMID = '88888888'.
LS_TMP3-FLDATE = '20210101'.
LS_TMP1
= CORRESPONDING #( BASE ( LS_TMP1 ) LS_DATA ). "不指定BASE 初始值会丢失 LS_TMP2
= CORRESPONDING #( LS_DATA ). "不指定BASE 初始值会丢失 MOVE-CORRESPONDING LS_DATA TO LS_TMP3.
CL_DEMO_OUTPUT=>WRITE(
LS_TMP1 ). CL_DEMO_OUTPUT=>WRITE(
LS_TMP2 ). CL_DEMO_OUTPUT=>WRITE(
LS_TMP3 ). CL_DEMO_OUTPUT=>DISPLAY( ).
CORRESPONDING
Width/Alignment/Padding
DATA:LV_MANTR1
TYPE MATNR VALUE '11'. DATA:LV_MATNR2 TYPE MATNR .
DATA:LV_MATNR3 TYPE MATNR .
DATA:LV_MATNR4
TYPE MATNR .
* Width/Alignment/Padding 宽度/对齐/填充
LV_MATNR2 = |{ LV_MANTR1 WIDTH = 18 ALIGN = RIGHT PAD = '0' }|.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = LV_MANTR1
IMPORTING
OUTPUT = LV_MATNR3
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LV_MATNR4 = |{ LV_MATNR3 ALPHA = OUT }|.
CL_DEMO_OUTPUT=>WRITE( 'LV_MANTR1:' && LV_MANTR1 ).
CL_DEMO_OUTPUT=>WRITE( 'LV_MATNR2:' && LV_MATNR2 ).
CL_DEMO_OUTPUT=>WRITE( 'LV_MATNR3:' && LV_MATNR3 ).
CL_DEMO_OUTPUT=>WRITE( 'LV_MATNR4:' && LV_MATNR4 ).
CL_DEMO_OUTPUT=>DISPLAY( ).
日期格式
DATA(P_DATE) = SY-DATUM.
WRITE / |{ P_DATE DATE = ISO }|. "Date Format YYYY-MM-DD
WRITE / |{ P_DATE DATE = USER }|. "As per user settings
WRITE / |{ P_DATE DATE = ENVIRONMENT }|. "Formatting setting of language environment
字符串内表拼接
SELECT WERKS FROM t001w INTO TABLE @DATA(gt_data).
DATA(lv_concat_lines) = concat_lines_of( table = gt_data sep = '/' ).
DATA:lt_tmp like gt_data.
SPLIT lv_concat_lines AT '/' INTO TABLE lt_tmp.
CL_DEMO_OUTPUT=>WRITE( lv_concat_lines ).
CL_DEMO_OUTPUT=>WRITE( lt_tmp[] ).
CL_DEMO_OUTPUT=>DISPLAY( ).
关于内表的几个操作
SELECT * FROM SPFLI INTO TABLE @DATA(GT_DATA) WHERE carrid = 'AZ'.
"输出查询结果
CL_DEMO_OUTPUT=>WRITE( GT_DATA ).
"找到数据
DATA(LV_INDEX) = LINE_INDEX( GT_DATA[ CARRID = 'AZ' CONNID = '0788' ] ).
IF LV_INDEX NE 0 AND LINE_EXISTS( GT_DATA[ LV_INDEX ] ) .
DATA(LS_DATA) = GT_DATA[ LV_INDEX ]. "取该行数据
ENDIF.
CL_DEMO_OUTPUT=>WRITE( LS_DATA ).
"看看多条记录的时候,找到的第几条
SORT GT_DATA by CITYFROM.
DATA(LV_INDEX_tmp) = LINE_INDEX( GT_DATA[ CITYFROM = 'ROME' ] ).
CL_DEMO_OUTPUT=>WRITE( LV_INDEX_tmp ).
CL_DEMO_OUTPUT=>DISPLAY( ).
另外一个demo,里面有个大括号{}的使用。跟直接&& 拼接有空格的差别。
SELECT
* FROM SPFLI INTO TABLE @DATA(GT_DATA) WHERE CARRID = 'AZ'.
CL_DEMO_OUTPUT=>WRITE( GT_DATA ).
CL_DEMO_OUTPUT=>WRITE( GT_DATA[ CONNID = '0788' ] ).
CL_DEMO_OUTPUT=>WRITE( GT_DATA[ CONNID = '0788' ]-CONNID ).
CL_DEMO_OUTPUT=>WRITE( |CONNID: { GT_DATA[ CONNID = '0788' ]-CONNID }| ).
CL_DEMO_OUTPUT=>WRITE( 'CONNID:'&& GT_DATA[ CONNID = '0788' ]-CONNID ).
CL_DEMO_OUTPUT=>DISPLAY( ).
前一篇:ALV相关文章清单
后一篇:ABAP新语法(2)