0% found this document useful (0 votes)
70 views20 pages

SAP ABAP New Syntax Guide

Uploaded by

porofsercan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
70 views20 pages

SAP ABAP New Syntax Guide

Uploaded by

porofsercan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

SAP ABAP

New Syntax

(Gaurav Singh)
Contents

1. Introduction
2. Inline Declarations
3. Table Expressions
4. Conversion Operations
5. Conditional Statements
6. Switch Cases
7. Concatenate
8. Value Operator
9. For Operator
10. Filter Operator
11. Reduce Operator
12. Corresponding Operator
13. Group By Operator
14. Object Oriented
Appendix
Introduction
After version 7.4, SAP introduced new ABAP syntax which helps developers increase the efficiency of
their code and makes it easy to write and handle the code, which includes Inline Declaration, Table
Expression, Data Operations, etc.

Here I have compiled them from multiple web sources to form a consolidated document on new syntax.

The examples presented have been compiled in the ABAP editor and mostly tested, though, taken from
different sources.

Inline Declarations
 Whenever data is to be moved to a variable, it can be declared at the same instance

Old Syntax:

DATA: lv_var(3) TYPE c.

lv_var = 'YES'.

New Syntax:

DATA(lv_var) = 'YES'.

 Select Single from Database Table into Work Area

Old Syntax:

TYPES: BEGIN OF ty_vbak,


vbeln TYPE vbeln_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
vbtyp TYPE vbtypl,
END OF ty_vbak.

DATA: wa TYPE ty_vbak.

SELECT SINGLE vbeln


erdat
erzet
ernam
vbtyp
FROM vbak
INTO wa
WHERE vbeln = lv_vbeln.
New Syntax:

SELECT SINGLE vbeln,


erdat,
erzet,
ernam,
vbtyp
FROM vbak
INTO @DATA(wa)
WHERE vbeln = @lv_vbeln.

 Selecting Data from Database Table into Internal Table

Old Syntax:

TYPES: BEGIN OF ty_vbak,


vbeln TYPE vbeln_va,
erdat TYPE erdat,
erzet TYPE erzet,
ernam TYPE ernam,
vbtyp TYPE vbtypl,
END OF ty_vbak.

DATA: wa TYPE ty_vbak.


DATA: itab TYPE TABLE OF ty_vbak.

SELECT vbeln
erdat
erzet
ernam
vbtyp
FROM vbak
INTO TABLE itab
WHERE vbeln = lv_vbeln.

New Syntax:

SELECT vbeln,
erdat,
erzet,
ernam,
vbtyp
FROM vbak
INTO TABLE @DATA(itab)
WHERE vbeln = @lv_vbeln.
 Declaration of the work area while operation on Internal Table

Old Syntax:

DATA: wa TYPE ty_vbak.

LOOP AT itab INTO wa.

ENDLOOP.

READ TABLE itab INTO wa WITH KEY vbeln = lv_vbeln.

New Syntax:

LOOP AT itab INTO DATA(wa).

ENDLOOP.

Or

READ TABLE itab INTO DATA(wa) WITH KEY vbeln = lv_vbeln.

 Moving Data from One Table to Other.

Old Syntax:

DATA lt_tab LIKE itab.

lt_tab[] = itab[].

New Syntax:

DATA(lt_tab) = itab[].

 Assigning Field Symbols.

Old Syntax:

FIELD-SYMBOLS: <fs_vbak> type ty_vbak.

LOOP AT itab ASSIGNING <fs_vbak>.

ENDLOOP.

READ TABLE itab ASSIGNING <fs_vbak> WITH KEY vbeln = lv_vbeln.

New Syntax:
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_vbak>).

ENDLOOP.

Or

READ TABLE itab ASSIGNING


FIELD-SYMBOL(<fs_vbak>) WITH KEY vbeln = lv_vbeln.

Table Expressions
If a table line is not found, the exception CX_SY_ITAB_LINE_NOT_FOUND is raised. No sy-subrc.

 Get line from table to Work Area.

Old Syntax:

READ TABLE itab INTO DATA(wa) WITH KEY vbeln = lv_vbeln.

New Syntax:

DATA(wa) = itab[ vbeln = lv_vbeln ].

 Read table with index 1.

Old Syntax:

READ TABLE itab INTO DATA(wa) INDEX 1.

New Syntax:

DATA(wa) = itab[ 1 ].

 Get a particular field from one table to another variable.

Old Syntax:

READ TABLE itab INTO DATA(wa) WITH KEY vbeln = lv_vbeln.


IF sy-subrc EQ 0.
lv_usernm = wa-ernam.
ENDIF.

New Syntax:

DATA(lv_usernm) = itab[ vbeln = lv_vbeln ]-ernam.


 Check particular value is in internal table.

Old Syntax:

READ TABLE itab TRANSPORTING NO FIELDS WITH KEY vbeln = lv_vbeln.


IF sy-subrc EQ 0.

ENDIF.

New Syntax:

IF line_exists( itab[ vbeln = lv_vbeln ] ).

ENDIF.

 Get Index Number of Particular Entry from Internal Table.

Old Syntax:

READ TABLE itab TRANSPORTING NO FIELDS WITH KEY vbeln = lv_vbeln.


IF sy-subrc EQ 0.
DATA(lv_tabix) = sy-tabix.
ENDIF.

New Syntax:

DATA(lv_tabix) = line_index( itab[ vbeln = lv_vbeln ] ).

 Modify entry in an internal table.

Old Syntax:

READ TABLE itab ASSIGNING FIELD-


SYMBOL(<lfs_tab>) WITH KEY vbeln = lv_vbeln.
IF sy-subrc EQ 0.
<lfs_tab>-ernam = 'SAPUSER'.
ENDIF.

New Syntax:

TRY.
itab[ vbeln = lv_vbeln ]-ernam = 'SAPUSER'.
CATCH cx_sy_itab_line_not_found.
ENDTRY.

Note: While Using these Syntaxes in case of Table Expression use with Try <> Catch with
cx_sy_itab_line_not_found EndTry block.
Conversion Operations

 Adding or removing leading zeroes to a variable.

Old Syntax:

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'


EXPORTING
input = lv_vbeln
IMPORTING
output = lv_vbeln.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'


EXPORTING
input = lv_vbeln
IMPORTING
OUTPUT = lv_vbeln
.

New Syntax:

lv_vbeln = |{ lv_vbeln ALPHA = IN }|.

lv_vbeln = |{ lv_vbeln ALPHA = OUT }|.

Conditional Statements

 Getting data into variable depending on condition.

Old Syntax:

IF 2 = 3.
lv_var = 'YES'.
ELSE.
lv_var = 'NO'.
ENDIF.

New Syntax:

lv_var = COND #( WHEN 2 = 3 THEN 'YES' ELSE 'NO' ).

Switch Cases
 Case Endcase.

Old Syntax:

DATA: var(10) TYPE c.

CASE sy-subrc.

WHEN 0.
var = 'SUCCESS'.
WHEN 1.
var = 'FAIL'.
ENDCASE.

New Syntax:

var = SWITCH #( sy-subrc WHEN 0 THEN 'SUCCESS'


WHEN 1 THEN 'FAIL' ).

Concatenate

 Concatenate using ‘{}’ operator.

DATA: lv_var(50) TYPE c.


CONSTANTS: lc_amount(10) TYPE c VALUE '10'.

Old Syntax:

CONCATENATE 'I have' lc_amount 'rupees.' INTO lv_var


SEPARATED BY SPACE.

New Syntax:

lv_var = |I have { lc_amount } rupees.|.

Note: Using old syntax, we can't concatenate variables with data type C, N, D, T, or STRING.
While the new syntax supports all types.

 Concatenate using ‘&’ operator.

Old Syntax:
DATA lv_output TYPE string.

CONCATENATE 'Hello' 'world' INTO lv_output SEPARATED BY space.

New Syntax:

DATA(lv_output) = |Hello| & | | & |world|.

 Concatenate using ‘&&’ operator.

Two strings can be concatenated using the && operator.

Old Syntax:

DATA tmp TYPE c LENGTH 100.

CONCATENATE `It is the year `


sy-datum(4) INTO tmp.

New Syntax:

DATA tmp TYPE c LENGTH 100.

tmp = `It is the year `


&& sy-datum(4).

Value Operator

 Creating an Internal Table and Filling Data into it.

Old Syntax:

TYPES: BEGIN OF ty_new,


sno TYPE i,
name(10) TYPE c,
END OF ty_new.

DATA: itab TYPE TABLE OF ty_new,


wa TYPE ty_new.

wa-sno = 1.
wa-name = 'AMAR'.
APPEND wa TO itab.
CLEAR wa.

wa-sno = 2.
wa-name = 'AKBAR'.
APPEND wa TO itab.
CLEAR wa.

wa-sno = 3.
wa-name = 'ANTHONY'.
APPEND wa TO itab.
CLEAR wa.

New Syntax:

TYPES: BEGIN OF ty_data,


sno TYPE i,
name(10) TYPE c,
END OF ty_data.

TYPES: tt_data TYPE STANDARD TABLE OF ty_data WITH DEFAULT KEY.

DATA(itab) = VALUE tt_data( ( sno = 1 name = 'AMAR' )


( sno = 2 name = 'AKBAR' )
( sno = 3 name = 'ANTHONY' ) ).

 Adding New entries to Internal Table already having entries.

Old Syntax:

DATA: itab TYPE TABLE OF ty_data,


wa TYPE ty_data.

wa-sno = 1.
wa-name = 'AMAR'.
APPEND wa TO itab.
CLEAR wa.

wa-sno = 2.
wa-name = 'AKBAR'.
APPEND wa TO itab.
CLEAR wa.

wa-sno = 3.
wa-name = 'ANTHONY'.
APPEND wa TO itab.
CLEAR wa.

New Syntax:

itab = VALUE #( BASE itab


( sno = 1 name = 'AMAR' )
( sno = 2 name = 'AKBAR' )
( sno = 2 name = 'ANTHONY' ) ).

Creating a range.

DATA itab1 TYPE RANGE OF i.

itab1 = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 10 )

( low = 21 high = 30 )

( low = 41 high = 50 )

option = 'GE' ( low = 61 ) ).

For Operator
 For creating range from an internal table

New Syntax:

DATA: lr_carrid TYPE RANGE OF s_carr_id.

SELECT * FROM
sflight
INTO TABLE @DATA(lt_sflight)
WHERE connid IN (17, 555).

IF sy-subrc = 0.
*Prepare a range table

lr_carrid = VALUE #( FOR ls_value IN lt_sflight ( sign = 'I'


option = 'EQ'
low = ls_value-
carrid ) ).
SORT lr_carrid BY low.
DELETE ADJACENT DUPLICATES FROM lr_carrid
COMPARING low.
ENDIF.

 For creating table from another table

TYPES: BEGIN OF ty_ship,


tknum TYPE tknum,
name TYPE ernam,
city TYPE ort01,
route TYPE route,
END OF ty_ship.

TYPES: ty_ships TYPE SORTED TABLE OF ty_ship WITH UNIQUE KEY tknum.
TYPES: ty_citys TYPE STANDARD TABLE OF ort01 WITH EMPTY KEY.
DATA(gt_ships) = VALUE ty_ships( ( tknum = '001' name = 'John' city
= 'Melbourne' route = 'R0001' )
( tknum = '002' name = 'Gavin' city = 'Sydney' r
oute = 'R0003' )
( tknum = '003' name = 'Lucy' city = 'Adelaide'
route = 'R0001' )
( tknum = '004' name = 'Elaine' city = 'Perth' r
oute = 'R0003' ) ).

Old Syntax:

DATA: gt_citys TYPE ty_citys,


gs_ship TYPE ty_ship,
gs_city TYPE ort01.

LOOP AT gt_ships INTO gs_ship.


gs_city = gs_ship-city.
APPEND gs_city TO gt_citys.
ENDLOOP.

New Syntax:

DATA(gt_citys) = VALUE ty_citys( FOR ls_ship IN gt_ships ( ls_ship-


city ) ).

Filter Operator
 Using filter operator to filter data between two tables.

TYPES: BEGIN OF ty_flt,


cntry_frm TYPE spfli-countryfr,
END OF ty_flt,

tt_flt TYPE HASHED TABLE OF ty_flt WITH UNIQUE KEY cntry_frm.

DATA: lt_spfli1 TYPE TABLE OF spfli,


lt_spfli2 TYPE TABLE OF spfli,
ls_spfli TYPE spfli,
lt_flt TYPE tt_flt.

SELECT * FROM spfli INTO TABLE lt_spfli1.

lt_flt = VALUE tt_flt( ( cntry_frm = 'US' )


( cntry_frm = 'DE' ) ).

Old Syntax:
LOOP AT lt_spfli1 INTO DATA(ls_spfli1).
READ TABLE lt_flt INTO DATA(ls_flt) WITH KEY
cntry_frm = ls_spfli1-countryfr .
IF sy-subrc EQ 0.
MOVE-CORRESPONDING ls_spfli1 TO ls_spfli.
APPEND ls_spfli TO lt_spfli2.
ENDIF.
ENDLOOP.

New Syntax:

lt_spfli2 = FILTER #( lt_spfli1 IN lt_flt


WHERE countryfr = cntry_frm ).

Reduce Operator

 Using reduce operator for performing mathematical operation.

Old Syntax:

DATA: lt_table1 TYPE STANDARD TABLE OF i WITH EMPTY KEY.


DATA: lt_table2 TYPE STANDARD TABLE OF i WITH EMPTY KEY.

lt_table1 = VALUE #( FOR i = 0 THEN i + 1 UNTIL i > 10 ( i ) ).

lt_table2 = VALUE #( ( 1 ) ( 1 ) ( 1 ) ( 2 ) ( 2 ) ( 8 ) ( 3 ) ( 4 )
( 5 ) ( 3 ) ( 3 ) ).

DATA: lvsum TYPE i.

LOOP AT lt_table1 INTO DATA(w1).


LOOP AT lt_table2 INTO DATA(w2) WHERE TABLE_LINE = w1.
lvsum = lvsum + w2.
ENDLOOP.
ENDLOOP.

New Syntax:

DATA: lt_table1 TYPE STANDARD TABLE OF i WITH EMPTY KEY.


DATA: lt_table2 TYPE STANDARD TABLE OF i WITH EMPTY KEY.

lt_table1 = VALUE #( FOR i = 0 THEN i + 1 UNTIL i > 10 ( i ) ).


lt_table2 = VALUE #( ( 1 ) ( 1 ) ( 1 ) ( 2 ) ( 2 ) ( 8 ) ( 3 ) ( 4 )
( 5 ) ( 3 ) ( 3 ) ).

DATA(lv_sum) = REDUCE i( INIT SUM = 0 "local variable


FOR war1 IN lt_table1
FOR war2 IN lt_table2
WHERE ( table_line = war1 )
NEXT sum = sum + war2 ).

Corresponding Operator

 Combining two tables into a single one.

TYPES: BEGIN OF ty_tab,


serial TYPE i,
name(10) TYPE c,
id(4) TYPE c,
END OF ty_tab.

TYPES: tt_tab TYPE STANDARD TABLE OF ty_tab WITH DEFAULT KEY.


DATA: lt_tab1 TYPE STANDARD TABLE OF ty_tab,
lt_tab2 TYPE STANDARD TABLE OF ty_tab,
lt_tab3 TYPE STANDARD TABLE OF ty_tab,
wa1 TYPE ty_tab,
wa2 TYPE ty_tab.

lt_tab1 = VALUE tt_tab(


( serial = 1 name = 'Aman' id = '1001' )
( serial = 2 name = 'Anshul' id = '1002' )
( serial = 3 name = 'Aman' id = '1003' )
).

lt_tab2 = VALUE tt_tab(


( serial = 4 name = 'Amritanshu' id = '1004'
)
( serial = 5 name = 'Sachin' id = '1005'
)
( serial = 6 name = 'Sushant' id = '1006'
)
).

Old Syntax:

LOOP AT lt_tab1 INTO wa1.


APPEND wa1 TO lt_tab3.
ENDLOOP.

LOOP AT lt_tab2 INTO wa2.


APPEND wa2 TO lt_tab3.
ENDLOOP.

New Syntax:
lt_tab3 = lt_tab1.

lt_tab3 = CORRESPONDING #( BASE ( lt_tab3 ) lt_tab2 ).

 Moving data from one container to another.

Old Syntax:

DATA: lt_tab4 TYPE STANDARD TABLE OF ty_tab.

MOVE-CORRESPONDING lt_tab2 to lt_tab4.

New Syntax:

lt_tab4 = CORRESPONDING #( lt_tab2 ).

Note: While using the above syntax only those fields are moved that are identical to each other.
To move data fields between non-identical fields in two separate tables, check below syntax.

TYPES: BEGIN of ty_new,


sno TYPE i,
enam(10) TYPE c,
END OF ty_new.

DATA: lt_tab5 TYPE STANDARD TABLE OF ty_new.

lt_tab5 = CORRESPONDING #( lt_tab1 MAPPING sno = serial


enam = name ).

Note: If some fields need to be excluded while moving corresponding fields, this syntax can be
used. The type of both the table must be same.

lt_tab3 = CORRESPONDING #( lt_tab2 EXCEPT id ).

Group By Operator
 Group By operations instead of multiple loops.

TYPES: BEGIN OF ty_employee,


emp_id TYPE char10,
emp_name TYPE char30,
emp_grade TYPE char2,
emp_role TYPE char25,
emp_sal TYPE bapicurr_d,
END OF ty_employee.

TYPES: tt_employee TYPE STANDARD TABLE OF ty_employee WITH KEY emp_id.

DATA(lt_employee) = VALUE tt_employee(


( emp_id = '1101' emp_name = 'Gaurav' emp_grade = 'E2'
emp_role = 'Associate Manager' emp_sal = '60000.0000' )
( emp_id = '1102' emp_name = 'Madhu' emp_grade = 'E2'
emp_role = 'Senior Consultant' emp_sal = '50000.0000' )
( emp_id = '1103' emp_name = 'Keshav' emp_grade = 'E1'
emp_role = 'Engineer Trainee' emp_sal = '30000.0000' )
( emp_id = '1104' emp_name = 'Raghav' emp_grade = 'E3'
emp_role = 'General Manager' emp_sal = '120000.0000' )
( emp_id = '1105' emp_name = 'Shyam' emp_grade = 'E4'
emp_role = 'Operations Head' emp_sal = '600000.0000' )
( emp_id = '1106' emp_name = 'Madan' emp_grade = 'E1'
emp_role = 'Engineer' emp_sal = '35000.0000' )
( emp_id = '1107' emp_name = 'Murali' emp_grade = 'E2'
emp_role = 'Consultant' emp_sal = '45000.0000' )
( emp_id = '11018' emp_name = 'Gopal' emp_grade = 'E3'
emp_role = 'Senior Manager' emp_sal = '100000.0000' )
( emp_id = '11019' emp_name = 'Mohan' emp_grade = 'E1'
emp_role = 'Trainee Engineer' emp_sal = '20000.0000' )
( emp_id = '11020' emp_name = 'Krishna' emp_grade = 'E2'
emp_role = 'Senior Engineer' emp_sal = '55000.0000' )
( emp_id = '11021' emp_name = 'Gopal' emp_grade = 'E4'
emp_role = 'Project Manager' emp_sal = '500000.0000' )
).

DATA: gv_avg_sal TYPE bapicurr_d,


gv_tot_sal TYPE bapicurr_d.

Old Syntax:

SORT lt_employee BY emp_grade.


DATA(lt_grade) = lt_employee[].

DELETE ADJACENT DUPLICATES FROM lt_grade COMPARING emp_grade.


DATA: lv_size TYPE i.

LOOP AT lt_grade INTO DATA(ls_grade).


CLEAR: gv_avg_sal, lv_size.

WRITE: / |Group: { sy-tabix } Grade: { ls_grade-


emp_grade WIDTH = 15 }|.

LOOP AT lt_employee INTO DATA(ls_emp) WHERE emp_grade = ls_grade-


emp_grade.
gv_tot_sal = gv_tot_sal + ls_emp-emp_sal.
lv_size = lv_size + 1.
WRITE: /13 ls_emp-emp_name.
ENDLOOP.
gv_avg_sal = gv_tot_sal / lv_size.

WRITE: / |Average Salary: { gv_avg_sal }|.

SKIP.
ENDLOOP.

Output:
New Syntax:

SORT lt_employee BY emp_grade.

LOOP AT lt_employee INTO DATA(ls_emp)


GROUP BY ( grade = ls_emp-emp_grade
size = GROUP SIZE
index = GROUP INDEX )
ASCENDING
ASSIGNING FIELD-SYMBOL(<group>).

CLEAR: gv_avg_sal.

WRITE: / |Group: { <group>-index } Grade: { <group>-


grade WIDTH = 15 }|
& | Number in this grade: { <group>-size }|.

"Loop at members of the group

LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).


gv_tot_sal = gv_tot_sal + <ls_member>-emp_sal.
WRITE: /13 <ls_member>-emp_name.
ENDLOOP.
"Average Salary
gv_avg_sal = gv_tot_sal / <group>-size.

WRITE: / |Average Salary: { gv_avg_sal }|.

SKIP.
ENDLOOP.

Output:

Object Oriented
 Calling a static class

DATA: lt_bin TYPE solix_tab.


DATA: xl_content TYPE xstring.

Old Syntax:

CALL METHOD cl_document_bcs=>xstring_to_solix


EXPORTING
ip_xstring = xl_content
RECEIVING
rt_solix = lt_bin.

New Syntax:

lt_bin = cl_document_bcs=>xstring_to_solix( ip_xstring = xl_content


).

 Creating an instance of a class.

Old Syntax:

DATA: lo_data TYPE REF TO lcl_data.


CREATE OBJECT lo_data.

New Syntax:

DATA(lo_data) = NEW lcl_data( ).

References:

[Link]

[Link]

[Link]

[Link]

You might also like