Use of new ABAP 7.4 syntax

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’)

ABAP training: Function Modules: Function Groups

Function modules are grouped together in Function Groups. This can be grouping around a similar business object. For example a module to create, update, read data of a business object.

Creation of a Function Group

To create a function group start transaction SE37, and select menu Goto / Function Groups / Create Group:

Fill out the name and description, and press Save.

The function group is not useful yet, since it is not active. To activate go to the Change Function Group in the same menu and select the Master Program button to jump to the master program:

Now you can activate the Function Group.

Function group content

Once you have created one or more function modules, the modules can be seen in the Mater program by double clicking on the function module include ending with XX.

ABAP training: Data Dictionary: Search Help

A search help can be created to speed up input data field for the end user. It can be used to quickly narrow down possible entries based on input criteria. Search helps can be assigned to data elements or database table fields.

Creation of search help

Start transaction SE11 and selection the option Search help and press Create:

In the selection screen choose Elementary search help:

The main search help screen opens:

Enter a description. And assign in the Selection method field your table. If you split the main table from the text table, you can assign the text table in the Text table field. In the dialog behavior the most common is to Display values immediately.

Always set a hotkey by assigning it a letter. When you create a Collective search help the search helps are sorted by this letter assignment.

In the parameters set your fields. IMP means it is input. EXP is there on the output. The LPos field determines the seqeuence on the output.

Now check and activate your search help.

Test the search help with the test button:

Assigning search help to table

The search help is not automatically used. You can assign it to the data element in SE11:

Or you can assign is specifically in SE11 in a table defintion:

Select the row, press the Srch Help button and assign the search help.

Most common is to assign it to a data element.

ABAP training: Data Dictionary: Database table

The database table is the object to store data in the database. It is built of data elements.

Database table creation

To create a database table start transaction and choose the option Database table, enter your name, and press create:

Set delivery class

On the delivery and maintenance tab you have to choose the type and maintenance mode:

For Delivery Class there are 2 main options:

  • A for application data (most used)
  • C for customizing data

Customizing data is meant for tables that are maintained by IT and are setup in the development system and transported to production. New entries in these tables will ask for a transport request. Maintenance on production is normally not possible, since production systems are closed for customizing changes.

For Data Browser/Table View Editing, you can set how the system should respond when your table is using in SE16 (table content display) and SM30 (table maintenance). Choose the option that meets your business needs.

Add the field list

In the table field list add the fields for your table:

Important here: the first field is always the key field MANDT with type MANDT. MANDT is the field for the client.

In the example above we have taken a second field and marked it as key field (in the Key column).

Per field you create, you have to gave a table name and a reference to a Data element. You can refer to a standard SAP data element or an own created data element.

Set technical settings

Finally you need to set the technical properties of the table by clicking the Technical Settings button:

The data class indicates the intended use of the table (master data, transactional data, configuration data, etc.).

The size category indicates the amount of anticipated records in a productive system.

Buffering can be set if needed (see this blog for details on table buffering). Only switch this on when you know what you are doing.

If the flag Log Changes is ticked, all table changes are stored in table logging. For all details on table logging, read this blog.

Only switch on when really needed and only for small configuration tables. If done on large application data tables, the basis administrator will be cross at you for blowing up the application logging table volume.

Assign authorization group

This is technically an optional step, but highly advisable to avoid security issues and rework.

Choose menu option Utilities/Assign Authorization Group to come to this screen:

Select the correct authorization group from the list in the field New Authorization Group. There is no execute button, but you have to press Save now to assign it.

Final activation

Now Save the table, check and Activate. Table is ready for use.

Table maintenance generator

If you want to maintain data in your table in SM30, you need to use the table maintenance generator. In SE11 go to change mode of your table and select the menu option Utilities and then Table Maintenance Generator to reach this screen:

Assign the function group in which the table maintenance is stored.

For simple tables assign one step simple procedure and for screen use screen number 9000.

If your table is a master data table, keep the no recording routine. For new Z customizing tables do choose the Standard recording routine (basically the system will now force the entry to be saved in a transport).

Then use the Create button to generate the maintenance objects.

SM30 can now be used to maintain the content of the table.

Expert part

Issues with table maintenance generator:

ABAP training: Data Dictionary: Data type

There are 3 types of Data Types:

  1. Data element
  2. Structure
  3. Table type

Data elements are used to be built tables with content. Structures are help structures with single data lines that can be used in ABAP programs. Table types are help tables with multiple lines that can be used in ABAP programs. Only tables store data in the database. Structures and table types not.

Date elements and types are mainly based on domains and are the building blocks for tables.

Creation of Data element

Start transaction SE11. Select Data type and enter the name of the data element you want to create:

On the next screen select Data element:

On the main screen enter the description:

For the types that the data element will use, you can choose from pointing it to a domain, or to a built in type. The data element will take over the characteristics from the domain or built in type.

The 3rd tab is for further characteristics:

Here a data element can be linked to a Search Help, a parameter ID can be set and the data element can be marked for functional Change Documents.

By default the SAP GUI will remember the user input. This normally helps the end user. If you select the No Input History tick box the GUI will not store the input history for those fields using this data element.

In the last tab, you set the field labels for the data element:

There are 3 labels with different length and a heading description.

Save the data element, check it and activate it.

Creation of a Structure

To create a Structure, start transaction SE11 and select Data type, enter your structure name and press create. In the popup screen now select Structure:

In the next screen give the Structure a name and fill out the fields of the structure:

The build up of the Structure is similar to building a table. Differences: structures are used in ABAP as helper structures and don’t store data in the database. Therefore also as structure will not have key fields as well.

For components you can use both your custom created data elements as well as standard SAP data elements. You can use the button “Built-In Type” to switch the entry to direct types.

If you are done, Save the Structure, check and activate it.

Creation of a Table Type

To create a Table Type, start transaction SE11 and select Data type, enter your structure name and press create. In the popup screen now select Table Type:

Enter the description of the table type:

The most used option is to refer the Table Type to a Structure.

In the initialization the table access can be set differently from Standard. In the Primary Key tab, you can define the keys for the table if wanted.

Re-use and transparency considerations

Both structures and table types can also be defined locally in ABAP programs. If a second program needs similar or the same structures and table types, it does already make sense to define these elements in SE11 data types. This will stimulate re-use and consistency. Also the where-used options of the data dictionary can be used to quickly find the uses of the data types.

ABAP training: Data Dictionary: Domains

In the SAP data dictionary the lowest level re-usable element is the Domain. The Domain is used to build a Data Element in a database table.

Create a domain

To create a domain start transaction SE11, and choose the option Domain, enter your name and press Create:

In the next screen give the Domain a proper name and set the Date Type:

In this case we have chosen for a CHAR data type with length 50:

Note here that for text you can choose to make it case sensitive or not.

If you are happy, press the Save button and store the Domain in the proper package.

Then press the Check button to see if all is ok, and Activate button to activate the domain.

Possible data domains

The characteristics of a domain depend on the chosen Data Type.

For example a number will show different options:

There are domains for date, time, currency, quantity, etc…

Domain with own defined value set

The nicest feature of a domain is that you can define a value set. This value set can be used to restrict field choices to a limited set.

Example: first define a Domain;

Now go to the tab Value Range to set the restrictions:

In this case only the values FUTURE, PAST and PRESENT are allowed for this domain (and the Data Elements using it in tables).

Expert information

Be careful updating a domain later on (this includes adding a value in the value range). Any domain change will trigger a recompilation of:

  • The domain itself
  • Every Data Type using it (data type can be data element, structure and/or table type)
  • Every table using the data type
  • Every program using the table

This can be a lot!

Use the Where-Used button to see which tables are impacted. When it is a lot, check with your basis team when to import your transport in subsequent systems. Choose a time if possible where no users are working.

Domain Field length reduction and extension

Reducing domain field length can lead to data loss. Check and double check twice before executing a domain field length reduction.

Domain field length extensions are possible, but will trigger database table adjustments for the tables in which the data elements are using the impacted domain.

Use the Where-Used button to see which tables are impacted. Check with your basis team when to import your transport in subsequent systems. Choose a time if possible where no users are working.