1、数据定义
Before 7.40 | With 7.40 | |
DATA | DATA :lv_txt TYPE string. lv_txt = 'SAP北河'. | DATA(lv_txt) = 'SAP北河'. |
LOOP | DATA wa like LINE OF itab. LOOP AT itab INTO wa. ... ENDLOOP. | LOOP AT itab INTO DATA(wa). ... ENDLOOP. |
Loop at assigning | FIELD-SYMBOLS: <line> type … LOOP AT itab ASSIGNING <line>. | LOOP AT itab ASSIGNING FIELD-SYMBOL(<line>). ... ENDLOOP. |
Call method | DATA a1 TYPE ... oref->meth( | oref->meth( IMPORTING p1 = DATA(a1) IMPORTING p2 = DATA(a2) ). |
Read assigning | FIELD-SYMBOLS: <line> type … READ TABLE itab | READ TABLE itab ASSIGNING FIELD-SYMBOL(<line>). |
Select | DATA itab TYPE TABLE OF dbtab. SELECT * FROM dbtab | SELECT * FROM dbtab INTO TABLE @DATA(itab) WHERE fld1 = @lv_fld1. |
Select single | SELECT SINGLE f1 f2 WRITE: / lv_f1, lv_f2. | SELECT SINGLE f1 AS my_f1, WRITE: / ls_struct-my_f1, |
2、内表读取
Before 7.40 | With 7.40 | |
Read | READ TABLE itab INDEX idx INTO wa. | wa = itab[ idx ]. |
Read key | READ TABLE itab INDEX idx USING KEY key INTO wa. | wa = itab[ KEY key INDEX idx ]. |
Read with key | READ TABLE itab WITH KEY col1 = … col2 = … INTO wa. | wa = itab[ col1 = … col2 = … ]. |
Read with key components | READ TABLE itab WITH TABLE KEY key COMPONENTS col1 = … col2 = … INTO wa. | wa = itab[ KEY key col1 = … col2 = … ]. |
Does record | READ TABLE itab ... IF sy-subrc = 0. | IF line_exists( itab[ ... ] ). ... ENDIF. |
index | DATA idx type sy-tabix. READ TABLE ... idx = sy-tabix. | DATA(idx) = line_index( itab[ ... ] ). |
Before 7.40 | With 7.40 |
CLEAR ls_line2. MOVE-CORRESPONDING ls_line1 TO ls_line2. | ls_line2 = CORRESPONDING #( ls_line1 ). |
MOVE-CORRESPONDING ls_line1 TO ls_line2. | ls_line2 = CORRESPONDING # ( BASE ( ls_line2 ) ls_line1 ). |
DATA: ls_line3 like ls_line2. ls_line3 = ls_line2. | DATA(ls_line3) = CORRESPONDING line2 ( BASE ( ls_line2 ) ls_line1 ). |
3、转换
Method cl_abap_codepage=>convert_to expects a string
Before 7.40 |
DATA text TYPE c LENGTH 255. helper = text. xstr = cl_abap_codepage=>convert_to( source = helper ). |
With 7.40 |
DATA text TYPE c LENGTH 255. DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV string( text ) ). OR DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV #( text ) ). |
4、 运算符
Variables: VALUE dtype|#( )
Structures: VALUE dtype|#( comp1 = a1 comp2 = a2 … )
Tables: VALUE dtype|#( ( … ) ( … ) … ) …
TYPES: BEGIN OF ty_columns1, “Simple structure TYPES: BEGIN OF ty_columnns2, “Nested structure DATA: struc_simple TYPE ty_columns1, struct_nest = VALUE t_struct(coln1 = 1 |
struct_nest = VALUE t_struct(coln1 = 1 coln2 = VALUE #( cols1 = 1 cols2 = 2 ) ). |
TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY. itab = VALUE #( ( ) ( 1 ) ( 2 ) ). |
DATA itab TYPE RANGE OF i. itab = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 10 ) |
5、FOR
Before 7.40 |
DATA: gt_citys TYPE ty_citys, LOOP AT gt_ships INTO gs_ship. |
With 7.40 |
DATA(gt_citys) = VALUE ty_citys( FOR ls_ship IN gt_ships ( ls_ship-city ) ). |
Before 7.40 |
DATA: gt_citys TYPE ty_citys, LOOP AT gt_ships INTO gs_ship WHERE route = 'R0001'. |
With 7.40 |
DATA(gt_citys) = VALUE ty_citys( FOR ls_ship IN gt_ships WHERE ( route = 'R0001' ) ( ls_ship-city ) ). |
Before 7.40 |
DATA: gt_itab TYPE ty_tab, DO. |
With 7.40 |
DATA(gt_itab) = VALUE ty_tab( FOR j = 11 THEN j + 10 UNTIL j > 40 ( col1 = j col2 = j + 1 col3 = j + 2 ) ). |
6、运算
FOR for_exp1
Before 7.40 |
DATA: lv_lines TYPE i. LOOP AT gt_itab INTO ls_itab where F1 = ‘XYZ’. |
With 7.40 |
DATA(lv_lines) = REDUCE i( INIT x = 0 FOR wa IN gt_itab WHERE( F1 = ‘XYZ’ ) NEXT x = x + 1 ). |
Before 7.40 |
DATA: lv_line TYPE i, LOOP AT gt_itab INTO lv_line. |
With 7.40 |
DATA(lv_sum) = REDUCE i( INIT x = 0 FOR wa IN itab NEXT x = x + wa ). |
With 7.40 |
TYPES outref TYPE REF TO if_demo_output. DATA(output) = REDUCE outref( INIT out = cl_demo_output=>new( ) |
7、COND and SWITCH
COND |
DATA(time) = COND string( WHEN sy-timlo < '120000' THEN |{ sy-timlo TIME = ISO } AM| WHEN sy-timlo > '120000' THEN |{ CONV t( sy-timlo - 12 * 3600 ) TIME = ISO } PM| WHEN sy-timlo = '120000' THEN |High Noon| ELSE THROW cx_cant_be( ) ). |
SWITCH |
DATA(text) = NEW class( )->meth( SWITCH #( sy-langu WHEN 'D' THEN `DE` WHEN 'E' THEN `EN` ELSE THROW cx_langu_not_supported( ) ) ). |
8、操作
CORRESPONDING type( [BASE ( base )] struct|itab [mapping|except] )
TYPES: BEGIN OF line1, col1 TYPE i, col2 TYPE i, END OF line1.
TYPES: BEGIN OF line2, col1 TYPE i, col2 TYPE i, col3 TYPE i, END OF line2.
DATA(ls_line1) = VALUE line1( col1 = 1 col2 = 2 ).
WRITE: / 'ls_line1 =' ,15 ls_line1-col1, ls_line1-col2.
DATA(ls_line2) = VALUE line2( col1 = 4 col2 = 5 col3 = 6 ).
WRITE: / 'ls_line2 =' ,15 ls_line2-col1, ls_line2-col2, ls_line2-col3.
SKIP 2.
ls_line2 = CORRESPONDING #( ls_line1 ).
WRITE: / 'ls_line2 = CORRESPONDING #( ls_line1 )'
,70 'Result is ls_line2 = '
,ls_line2-col1, ls_line2-col2, ls_line2-col3.
SKIP.
ls_line2 = VALUE line2( col1 = 4 col2 = 5 col3 = 6 ). "Restore ls_line2
ls_line2 = CORRESPONDING #( BASE ( ls_line2 ) ls_line1 ).
WRITE: / 'ls_line2 = CORRESPONDING #( BASE ( ls_line2 ) ls_line1 )'
, 70 'Result is ls_line2 = ', ls_line2-col1
, ls_line2-col2, ls_line2-col3.
SKIP.
ls_line2 = VALUE line2( col1 = 4 col2 = 5 col3 = 6 ). "Restore ls_line2
DATA(ls_line3) = CORRESPONDING line2( BASE ( ls_line2 ) ls_line1 ).
WRITE: / 'DATA(ls_line3) = CORRESPONDING line2( BASE ( ls_line2 ) ls_line1 )'
, 70 'Result is ls_line3 = ' , ls_line3-col1
, ls_line3-col2, ls_line3-col3.
9、字符串操作
Before 7.40 |
---|
DATA itab TYPE TABLE OF scarr. DATA wa LIKE LINE OF itab. DATA output TYPE string. cl_demo_output=>display( output ). |
With 7.40 |
SELECT * FROM scarr INTO TABLE @DATA(lt_scarr). cl_demo_output=>display( |Carrier: { lt_scarr[ carrid = 'LH' ]-carrname }| ). |
Before 7.40 |
---|
DATA lv_output TYPE string. CONCATENATE 'Hello' 'world' INTO lv_output SEPARATED BY space |
With 7.40 |
DATA(lv_out) = |Hello| & | | & |world|. |
Width/Alignment/Padding |
WRITE / |{ 'Left' WIDTH = 20 ALIGN = LEFT PAD = '0' }|. WRITE / |{ 'Centre' WIDTH = 20 ALIGN = CENTER PAD = '0' }|. WRITE / |{ 'Right' WIDTH = 20 ALIGN = RIGHT PAD = '0' }|. |
Case |
WRITE / |{ 'Text' CASE = (cl_abap_format=>c_raw) }|. WRITE / |{ 'Text' CASE = (cl_abap_format=>c_upper) }|. WRITE / |{ 'Text' CASE = (cl_abap_format=>c_lower) }|. |
ALPHA conversion |
DATA(lv_vbeln) = '0000012345'. WRITE / |{ lv_vbeln ALPHA = OUT }|. “or ALPHA = IN to go in other direction |
Date conversion |
WRITE / |{ pa_date DATE = ISO }|. “Date Format YYYY-MM-DD WRITE / |{ pa_date DATE = User }|. “As per user settings WRITE / |{ pa_date DATE = Environment }|. “As per Environment |
10、LOOP AT GROUP By
TYPES: BEGIN OF ty_employee,
name TYPE char30,
role TYPE char30,
age TYPE i,
END OF ty_employee,
ty_employee_t TYPE STANDARD TABLE OF ty_employee WITH KEY name.
DATA(gt_employee) = VALUE ty_employee_t(
( name = 'John' role = 'ABAP guru' age = 34 )
( name = 'Alice' role = 'FI Consultant' age = 42 )
( name = 'Barry' role = 'ABAP guru' age = 54 )
( name = 'Mary' role = 'FI Consultant' age = 37 )
( name = 'Arthur' role = 'ABAP guru' age = 34 )
( name = 'Mandy' role = 'SD Consultant' age = 64 ) ).
DATA: gv_tot_age TYPE i,
gv_avg_age TYPE decfloat34.
"Loop with grouping on Role
LOOP AT gt_employee INTO DATA(ls_employee)
GROUP BY ( role = ls_employee-role
size = GROUP SIZE
index = GROUP INDEX )
ASCENDING
ASSIGNING FIELD-SYMBOL(<group>).
CLEAR: gv_tot_age.
"Output info at group level
WRITE: / |Group: { <group>-index } Role: { <group>-role WIDTH = 15 }|
& | Number in this role: { <group>-size }|.
"Loop at members of the group
LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).
gv_tot_age = gv_tot_age + <ls_member>-age.
WRITE: /13 <ls_member>-name.
ENDLOOP.
"Average age
gv_avg_age = gv_tot_age / <group>-size.
WRITE: / |Average age: { gv_avg_age }|.
SKIP.
ENDLOOP.
11、Classes/Methods
Before 7.40 |
ls_lfa1= My_Class=>get_lfa1( ). |
With 7.40 |
DATA(lv_name1) = My_Class=>get_lfa1( )-name1. |
BOOLEAN
Before 7.40 |
IF My_Class=>return_boolean( ) = abap_true. … ENDIF. |
With 7.40 |
IF My_Class=>return_boolean( ). … ENDIF. |
NEW operator
Before 7.40 |
DATA: lo_delivs TYPE REF TO zcl_sd_delivs, CREATE OBJECT lo_delivs. lo_deliv = lo_delivs->get_deliv( lv_vbeln ). |
With 7.40 |
DATA(lo_deliv) = new zcl_sd_delivs( )->get_deliv( lv_vbeln ). |
12. Meshes
TYPES: BEGIN OF t_manager, TYPES: BEGIN OF t_developer, |
TYPES: BEGIN OF MESH m_team,
managers TYPE tt_manager ASSOCIATION my_employee TO developers
ON manager = name,
developers TYPE tt_developer ASSOCIATION my_manager TO managers
ON name = manager,
END OF MESH m_team.
DATA: ls_team TYPE m_team.
ls_team-managers = lt_manager.
ls_team-developers = lt_developer.
*Get details of Jerry's manager *
"get line of dev table
ASSIGN lt_developer[ name = 'Jerry' ] TO FIELD-SYMBOL(<ls_jerry>).
DATA(ls_jmanager) = ls_team-developers\my_manager[ <ls_jerry> ].
WRITE: / |Jerry's manager: { ls_jmanager-name }|,30
|Salary: { ls_jmanager-salary }|.
"Get Thomas' developers
SKIP.
WRITE: / |Thomas' developers:|.
"line of manager table
ASSIGN lt_manager[ name = 'Thomas' ] TO FIELD-SYMBOL(<ls_thomas>).
LOOP AT ls_team-managers\my_employee[ <ls_thomas> ]
ASSIGNING FIELD-SYMBOL(<ls_emp>).
WRITE: / |Employee name: { <ls_emp>-name }|.
ENDLOOP.
13. Filter
TYPES: BEGIN OF ty_filter,
cityfrom TYPE spfli-cityfrom,
cityto TYPE spfli-cityto,
f3 TYPE i,
END OF ty_filter,
ty_filter_tab TYPE HASHED TABLE OF ty_filter
WITH UNIQUE KEY cityfrom cityto.
DATA: lt_splfi TYPE STANDARD TABLE OF spfli.
SELECT * FROM spfli APPENDING TABLE lt_splfi.
DATA(lt_filter) = VALUE ty_filter_tab( f3 = 2
( cityfrom = 'NEW YORK' cityto = 'SAN FRANCISCO' )
( cityfrom = 'FRANKFURT' cityto = 'NEW YORK' ) ).
DATA(lt_myrecs) = FILTER #( lt_splfi IN lt_filter
WHERE cityfrom = cityfrom
AND cityto = cityto ).
“Output filtered records
LOOP AT lt_myrecs ASSIGNING FIELD-SYMBOL(<ls_rec>).
WRITE: / <ls_rec>-carrid,8 <ls_rec>-cityfrom,30
<ls_rec>-cityto,45 <ls_rec>-deptime.
ENDLOOP.