ABAP 7.4 has many nice syntax improvements. These enhancements increase the efficiency of the code written, making it easier for developers to use and to read the code.
Key features:
- Inline Declarations
- Table Expressions
- Constructor Operator NEW
- Value Operator VALUE
- FOR operator
- Reduction operator REDUCE
- Conditional operators COND and SWITCH
- CORRESPONDING operator
- Strings
- Filter
Inline Declaration(DATA)
Inline declarations are a new concept of declaring variables and field symbols. This enables programmer to declare the variable at the time of they used. With this new format the compiler knows that the data store the value in the form of string variable. No need to explicitly declare the string variable. So, the line of code got reduced.
Before 7.4
DATA zlv_text TYPE string.
zlv_text = 'ABC’.
With 7.4
DATA(zlv_text) = 'ABC'.
Inline Declaration(Loop at into work area)
Every time we need to loop over an internal table we need work area . Many times this work area is not in use when loop processing is completed. Hence inline declaration make it easy to declare it and use it when it is required.
Before 7.40
Types: Begin of zlts_itab,
Matnr type matnr,
Sernr type gernr,
end of zlts_itab,
DATA : zlt_itab type table of zlts_itab,
zls_wa type zlts_itab.
LOOP AT zlt_itab INTO zls_wa.
......
ENDLOOP.
With 7.40
LOOP At zlt_ itab INTO DATA(zls_wa).
…………
ENDLOOP.
Inline Declaration(Field Symbol)
Like work area we can use inline declaration for Field symbol. Here we can use angular bracket and FIELD_SYMBOL keyword as before. Read a line of internal table and assign it to a field symbol.
Before 7.40
FIELD_SYMBOLS <zls_test> type zlts_itab.
LOOP AT zlt_itab assigning <zls_test>
.....
ENDLOOP.
Read table zlt_ itab assigning <zls_test>.
With 7.40
LOOP At zlt_ itab assigning FIELD_SYMBOL (<zls_test>).
…………
ENDLOOP.
Read table zlt_itab assigning FIELD-SYMBOL(<zls_test>).
Inline Declaration(Select into table)
We need to put @symbol in front of the variables using in the select statement while using new feature. That helps compiler to understand that we are not referring the field of the database but the variable in the program.
No need to declare the internal table separately.
Please note when we use new feature we need to put comma between field while retrieving data from DB table, and also put into statement at the end.
Before 7.40
DATA : zlv_fld1 type matnr value ‘number’,
zlt_itab TYPE TABLE OF mara.
SELECT * FROM mara
INTO TABLE zlt_itab
WHERE matnr = zlv_fld1.
With 7.40
SELECT * FROM mara
INTO TABLE @DATA(zlt_itab)
WHERE matnr = @zlv_fld1.
Inline Declaration(Call Method)
Inline ABAP DATA declarations are a new concept introduced in release 7.4 which allows you to declare your internal table variables or work areas within the code that uses them.
No need to declare the internal table separately.
Before 7.40
DATA zlv_a1 TYPE ...
DATA zlv_a2 TYPE ...
zlo_oref->meth( IMPORTING p1 = zlv_a1
IMPORTING p2 = zlv_a2 ).
With 7.40
zlo_oref->meth( IMPORTING p1 =DATA(zlv_a1)
IMPORTING p2 = DATA(zlv_a2) ).
Table Expression(Read Table Index)
Previously we saw we can read the internal table to work area without declaring work area before the read statement.
In new feature we can see we might never have to use Read statement at all.
If we want to read 3rd line from Internal table we need to pass 3 into the variable idx = 3.
Before 7.40
READ TABLE zlt_itab INDEX zlv_indx INTO zls_wa.
With 7.40
zls_wa =zlt_itab[ zlv_idx ].
Table Expression(Read Table using key and with key)
In this example we are reading internal table with key and if the passing parameter values and it satisfied then work area will be populated. If not then sy-subrc will not equal to 0.
But in new statement we can simply write work area equal to…it simple replace the read statement with direct assignment of table details to work area.
Before 7.40
1. READ TABLE zlt_itab INDEX zlv_idx
USING KEY key INTO zls_wa.
2. READ TABLE zlt_itab
WITH KEY col1 =
col2 = … INTO zls_wa.
3. READ TABLE zlt_itab WITH TABLE KEY key
COMPONENTS col1 = …
col2 = …INTO zls_wa.
With 7.40
zls_wa = zlt_itab[ KEY key INDEX zlv_idx ].
zls_wa = zlt_itab[ col1 = … col2 = … ].
zls_wa = zlt_itab[ KEY key col1 = …col2 = … ].
Table Expression (Does record exist?)
Whenever we have data in internal table it is very common practice to check the data which we require from table that is already exist or not?
We use here TRANSPORTING NO FIELDS statement as we are not interested about the data but it is exist or not in the table.
In new statement we use line_exist statement to do this. We use the statement then internal table and the parameters if it is successful then compiler go inside.
Before 7.40
READ TABLE zlt_itab ... TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
...
ENDIF.
With 7.40
IF line_exists( zlt_itab[ ... ] ).
...
ENDIF.
Table Expression(Get table index)
This example is used to read the index table index. We use line_index in the new statement.
Before 7.40
DATA zv_idx type sy-tabix.
READ TABLE ...
TRANSPORTING NO FIELDS.
zv_idx = sy-tabix.
With 7.40
DATA(zv_idx) = line_index(zlt _itab[ ... ] ).
String processing
This is frequently used in ABAP code. The data from the DB needs to be formatted before display and vice versa.
Concatenation of string: the changes are as followed:
- String template: Create character string out of literals texts, expressions and control character, The goal is to display data in more human readable format.
- We use pipe symbol and && operator to concatenate string.
- To replace the write to statement.
- A string template is defined by using the |(pipe) symbol at the beginning and end of a template.
- If we add some value with string template like {expression} and control character.
- Embedded expression are defined within the string template with curly brackets. Note a space between bracket and expression is obligatory.
- An expression can be variable, functional method, predefined function or calculation expression.
Before 7.4
Data zlv_qmnum type string.
Data zlv_string type string.
zlv_qmnum = zls_qmel-qmnum.
Concatenate ‘Your notification no:’
zlv_qmnum
into zlv_string
separated by space.
Write :/ zlv_string.
With 7.4
Data zlv_qmnum type string.
Data zlv_string type string.
zlv_qmnum = zls_qmel-qmnum.
zlv_string = |’Your Notification No:’|&& zlv_qmnum.
zlv_string = ’Your Notification No:’.
Same as (as soon as we add pipe symbol it became string template).
zlv_string = |’Your Notification No:’.|.
zlv_string = |{ a numeric variable }|.
zlv_string = |’The return code is: ({ sy-subrc }|.
zlv_string = |’The length of text : {( text-001 )} is { strlen(text-001) }.
Chaining Operator: The chaining operator && can be used to create one character string out of multiple other strings and string template.
In this example a number text , a space, an existing character string and a new string template are concatenated into new character string. The code convert the amount field in a display format as per user settings.
Character_string = ‘Text literal(002)’&& ‘ ’&& character_string && |{ amount_field NUMBER = USER }|.Conversion operator
Conversion operator is used to convert value into specified type. It is suitable to avoid the declaration of helper variable.
For example :let us assume that a method expects string but we have data in character. We would need to move the value to the string variable and then pass the helper variable to the method call. With CONV variable helper variable not required. The value can be converted directly during method call.
Before 7.40
Data zlv_cust_name type c length 20.
Data:zlv_helper type string.
zlv_helper = zlv_cust_name.
Cl_func->process_func(ziv_input = zlv_helper).
With 7.40
Data zlv_cust_name type c length 20.
Cl_func->process_func(ziv_input =CONV string( zlv_cust_name ).
Cl_func->process_func(ziv_input =CONV #(zlv_cust_name ).
Casting operator
The casting operator CAST is a constructor operator that performs a down cast or up cast for the object and create a reference variable as a result.
Syntax of casting operator is :
Cast #/type( [let_exp] dobj)
Type can be class or interface. The # character is a symbol for the operand type.
With 7.40
CLASS zcl1 DEFINITION.
ENDCLASS.
CLASS zcl2 DEFINITION INHERITING FROM zcl1.
ENDCLASS.
DATA: zlo_oref1 TYPE REF TO zcl1,
zlo_oref2 TYPE REF TO zcl2.
IF zlo_oref1 IS INSTANCE OF zcl2.
zlo_oref2 ?= zlo_oref1.
zlo_oref2 = CAST #( zlo_oref1 ).
ENDIF.
Value operator
The VALUE operator in SAP ABAP 7.4 is used to create and initialize data objects of a specified type. It is particularly useful for constructing values for structured types, table types, and controlling the type of results in table expressions.
Initial Value for All Types:
The VALUE operator can be used to create initial values for any non-generic data types
DATA zlv_initial TYPE i
zlv_initial = VALUE i( )
Structures
For structures, the VALUE operator allows you to specify values for individual fields
TYPES: BEGIN OF zlts_struct,
field1 TYPE string,
field2 TYPE string,
END OF zlts_struct
DATA zls_struct TYPE zlts_struct
zls_struct = VALUE zlts_struct( field1 = 'Value1' field2 = 'Value2' )
Internal Tables
The VALUE operator can also be used to construct internal tables
DATA zlt_table TYPE TABLE OF string
zlt_table = VALUE #( ( 'Row1' ) ( 'Row2' ) ( 'Row3' ) )
For operator
For operator is used to loop at an internal table. For each loop the row is read and assigned to a work area or field symbol. This is similar to the same FOR loop in C language.
Transfer data from one internal table to another internal table:
New Syntax:
Data: zlt_r_equipment TYPE RANGE OF equnr,
zlt_r_equipment = VALUE #( FOR zls_equipment IN zlt_r_equipment
( sign = zls_equipment-sign
option = zls_equipment-option
low = |{ zls_equipment-low ALPHA = IN }|
high = |{ zls_equipment-high ALPHA = IN }| ) ).
).
Reduction operator
Reduce operator creates a results of specified data type after going through iteration. In Classical ABAP if we had to evaluate the data in an internal table then we had to loop through the internal table, evaluate the condition, and then take appropriate action. This could be done much simpler way using REDUCE.
Data(zlv_lines) = REDUCE i ( init x = 0 for wa_sales in lt_sales where ( salesoffice = ‘IN’) Next x= x+1 ) .
Conditional operator
It is an accepted practice in ABAP to use CASE statement instead of IF statement. CASE statement made the code readable but had an issue that it was not able to evaluate multiple condition.so we use if else statement. In 7.40 we use COND operator for the same.
Data(zlv_text) = COND # ( when zlv_qmtxt = ‘X1’and zlv_artpr = ‘XX’ then ‘Customer’
when zlv_qmtxt = ‘01’and zlv_artpr = ‘XX’ then ‘test1’
when zlv_qmtxt = ‘02’and zlv_artpr = ‘XX’ then ‘test2’).
Write:/zlv_text
Switch operator
Switch operator is a conditional operator like CASE but more powerful and less code. It is used to switch from one value to another based on condition.
Old syntax:
data: zlv_indicator like scal-indicator, zlv_day(10) type c.
case zlv_indicator.
when 1.
zlv_day = 'Monday'.
when 2.
zlv_day = 'Tuesday'.
when 3.
zlv_day = 'Wednesday'.
when 4.
zlv_day = 'Thursday'.
when 5.
zlv_day = 'Friday'.
when 6.
zlv_day = 'Saturday'.
when 7.
zlv_day = 'Sunday'.
else.
Raise exception type zcx_day_problem.
endcase.
New Syntax:
DATA(zlv_day) = SWITCH char10( zlv_indicator
when 1 THEN 'Monday'
when 2 THEN 'Tuesday'
when 3 THEN 'Wednesday'
when 4 THEN 'Thursday'
when 5 THEN 'Friday'
when 6 THEN 'Saturday'
when 7 THEN 'Sunday'
ELSE THROW zcx_day_problem( ) ).
Corresponding operator
Corresponding operator allows the copy of data from one internal table to another internal table just like move corresponding but provides more options on which columns are copied.
TYPES : BEGIN OF zlts_demo1,
col1 TYPE c,
col2 TYPE c,
END OF zlts_demo1,
BEGIN OF zlts_demo2,
col1 TYPE c,
col3 TYPE c,
col4 TYPE c,
END OF zlts_demo2.
Data: zlt_itab1 TYPE STANDARD TABLE OF zlts_demo1,
zlt_itab2 TYPE STANDARD TABLE OF zlts_demo2.
zlt_itab1 = VALUE #( ( col1 = 'A' col2 = 'B' )
( col1 = 'P' col2 = 'Q' )
( col1 = 'N' col2 = 'P' ) ).
zlt_itab2 = CORRESPONDING #(zlt_itab1 ).
cl_demo_output=>write_data( zlt_itab1 ).
cl_demo_output=>write_data( zlt_itab2 ).
cl_demo_output=>display( ).
Filter
A new FILTER operator is available which can used on ABAP internal tables to filter the data (or) to retrieve subset of data into a new internal table. As of ABAP 7.4 this keyword is available to use in the system.
Old Syntax:
Data: zlt_qmel_all type standard table of qmel,
zlt_qmel_zz type standard table of qmel.
Select * from qmel into table @zlt_qmel_all.
If sy-subrc = 0.
Loop at zlt_qmel_all into data data(zls_qmel) where qmart = ‘00’.
Append zls_qmel to zlt_qmel_zz.
Clear : zls_qmel.
Endloop.
Endif.
New Syntax:
zlt_qmel_zz = FILTER #(zlt_qmel_all using key qmart where qmart = ‘00’)
