ABAP on HANA - New Syntaxes

Join with StRightRoad professional courses for Online / Recorded sessions to upskill.

Sat Feb 10, 2024

***********************************************************************
** 01 - @Data using escape host variable with comma separated - with work area
***********************************************************************
SELECT SINGLE
 matnr,
 matkl,
 meins,
 mtart
 FROM mara
 INTO @DATA(wa_mara)
 WHERE matnr <> ''.
***********************************************************************
** 02 - @Data using escape host variable with comma separated - with internal table
***********************************************************************
SELECT matnr,
matkl,
meins,
mtart
FROM mara
INTO TABLE @DATA(it_mara)
UP TO 20 ROWS.
**********************************************************************
* 03 - value expression using work are
**********************************************************************
TYPES : BEGIN OF ty_mara,
matnr TYPE mara-matnr,
matkl TYPE mara-matkl,
meins TYPE mara-meins,
mtart TYPE mara-mtart,
END OF ty_mara,

tt_mara TYPE STANDARD TABLE OF ty_mara WITH DEFAULT KEY.

DATA : lwa_mara TYPE ty_mara,
lit_mara TYPE TABLE OF ty_mara.

*classical ABAP
* Record - 1
lwa_mara-matnr = '100'.
lwa_mara-matkl = 'AB'.
lwa_mara-meins = 'KG'.
lwa_mara-mtart = 'HELB'.
APPEND lwa_mara TO lit_mara.
CLEAR lwa_mara.
* Record - 2
lwa_mara-matnr = '100'.
lwa_mara-matkl = 'AB'.
lwa_mara-meins = 'KG'.
lwa_mara-mtart = 'HELB'.
APPEND lwa_mara TO lit_mara.
CLEAR lwa_mara.

lit_mara = VALUE #( " Record - 1
( matnr = '200' matkl = 'AB' meins = 'KG' mtart = 'HALB')
" Record - 2
( matnr = '200' matkl = 'AB' meins = 'PC' mtart = 'HALB') ).

DATA(llit_mara) = VALUE tt_mara(
" Record - 1
( matnr = '200' matkl = 'AB' meins = 'KG' mtart = 'HALB')
" Record - 2
( matnr = '200' matkl = 'AB' meins = 'PC' mtart = 'HALB') ).
" Note : the table type must be - type standard table of with default key


**********************************************************************
*04 - Corresponding
**********************************************************************
TYPES : BEGIN OF ty_material,
material TYPE mara-matnr,
mat_group TYPE mara-matkl,
mat_uom TYPE mara-meins,
mat_Type TYPE mara-mtart,
mat_created TYPE mara-ersda,
END OF ty_material,

tt_material TYPE STANDARD TABLE OF ty_material WITH DEFAULT KEY.

DATA : lwa_material TYPE ty_material,
lit_material TYPE TABLE OF ty_material.

* Classical process is loop one internal table, add record by record by
* mapping field by field right to left.

MOVE-CORRESPONDING it_mara TO lit_material. "Will work only if field is same.

* New process with new syntax is .

lit_material = CORRESPONDING #( it_mara MAPPING
"Target field = Source field
material = matnr
mat_group = matkl
mat_uom = meins
mat_type = mtart
).

*LOOP AT lit_material ASSIGNING FIELD-SYMBOL(<fs_material>).
* WRITE : / <fs_material>-material,
* <fs_material>-mat_group,
* <fs_material>-mat_type,
* <fs_material>-mat_uom.
*ENDLOOP.


* Append value to additional field with fixed / dynamic value using for loop

lit_material = VALUE #(
FOR line IN it_mara (
material = line-matnr
mat_group = line-matkl
mat_uom = line-meins
mat_type = line-mtart
mat_created = sy-datum
) ).

LOOP AT lit_material ASSIGNING FIELD-SYMBOL(<fs_material>).
WRITE : / <fs_material>-material,
<fs_material>-mat_group,
<fs_material>-mat_type,
<fs_material>-mat_uom,
<fs_material>-mat_created.
ENDLOOP.

* Addtional complext logic
lit_material = VALUE #(
FOR line IN it_mara (
material = line-matnr
mat_group = line-matkl
mat_uom = line-meins
mat_type = line-mtart
mat_created = cond #( let data = 'BAG' in
when line-meins eq data then '20240210'
else '20240211')
) ).

LOOP AT lit_material ASSIGNING FIELD-SYMBOL(<fs_material>).
WRITE : / <fs_material>-material,
<fs_material>-mat_group,
<fs_material>-mat_type,
<fs_material>-mat_uom,
<fs_material>-mat_created.
ENDLOOP.

**********************************************************************
*05 - String operations
**********************************************************************
Data : lv_country type c LENGTH 20 VALUE 'India',
lv_String type string.

* Classical process
CONCATENATE 'I Love ' lv_country into lv_String RESPECTING BLANKS.
Write : lv_String.

* New syntax using Pipe line symbol
lv_string = |I Love '{ lv_country }'|.
Write : / lv_String.

*********************************************************************
*06 - Read table / Table expression
*********************************************************************
SELECT matnr,
matkl,
meins,
mtart
FROM mara
INTO TABLE @DATA(it_mara)
UP TO 20 ROWS.
IF sy-subrc = 0.
* Classical approach
* READ TABLE it_mara ASSIGNING FIELD-SYMBOL(<fs_mara>) WITH KEY meins = 'PC'.
* IF sy-subrc = 0.
* ENDIF.

* New syntax - 1
DATA(wa_mara) = VALUE #( it_mara[ meins ='PC' ] OPTIONAL ).

* New syntax - 2
IF ( line_exists( it_mara[ meins ='PC' ] ) ).
" Returns Boolean value - True (Execute block)/ False(Skip block)
DATA(wa_mara1) = VALUE #( it_mara[ meins ='PC' ] OPTIONAL ).
WRITE : wa_mara1-matnr.
ENDIF.

ENDIF.

*********************************************************************
* 07 - New Constructor expression
*********************************************************************
Classical approach
CLASS cl_test DEFINITION.
PUBLIC SECTION.
DATA : lv_test TYPE i.
ENDCLASS.

DATA lo_alv1 TYPE REF TO cl_test.
CREATE OBJECT lo_alv1.

* New syntax
DATA(lo_obj2) = NEW cl_test( ).

*********************************************************************
* 08 - Internal table as a object
*********************************************************************
SELECT matnr,
matkl,
meins,
mtart
FROM mara
INTO TABLE @DATA(it_mara)
UP TO 20 ROWS.
IF sy-subrc = 0.
LOOP AT it_mara REFERENCE INTO DATA(lo_line).
Write :/ lo_line->matnr,
lo_line->matkl,
lo_line->meins,
lo_line->mtart.
ENDLOOP.
ENDIF.

SURYA
SAP Techno Functional Consultant, Trainer & Mentor