REDUCE Operator is perform Iteration on Internal table and produce result in specified data type. We can used in many way.
1. Count number of records in internal table.
2. REDUCE with WHERE Condition
3. Sum of the Amount/ Quantity
4. Nester loop with multiple table
5. REDUCE with READ_TEXT
Example 1: Count the Number of records in Internal Table
"&... Local Variable declaration
DATA: lv_vbeln TYPE vbak-vbeln.
"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vbeln FOR lv_vbeln.
SELECTION-SCREEN END OF BLOCK a1.
"&... Fetch header data
SELECT vbeln,
audat,
netwr
FROM vbak INTO TABLE @DATA(lt_vbak)
WHERE vbeln IN @s_vbeln.
IF sy-subrc EQ 0.
DATA(lv_count) = REDUCE i( INIT x = 0 FOR ls_vbak IN lt_vbak
NEXT x = x + 1 ).
ENDIF.
Example 2: REDUCE with WHERE condition:
"&... Local Variable declaration
DATA: lv_vbeln TYPE vbak-vbeln.
"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vbeln FOR lv_vbeln.
SELECTION-SCREEN END OF BLOCK a1.
"&... Fetch header data
SELECT vbeln,
auart,
netwr
FROM vbak INTO TABLE @DATA(lt_vbak)
WHERE vbeln IN @s_vbeln.
IF sy-subrc EQ 0.
DATA(lv_count) = REDUCE i( INIT x = 0 FOR ls_vbak IN lt_vbak
WHERE ( auart = 'ZSP' )
NEXT x = x + 1 ).
ENDIF.
Example 3: Sum of Amount or Quantity
"&... Local Variable declaration
DATA: lv_vbeln TYPE vbak-vbeln.
"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vbeln FOR lv_vbeln.
SELECTION-SCREEN END OF BLOCK a1.
"&... Fetch header data
SELECT vbeln,
auart,
netwr
FROM vbak INTO TABLE @DATA(lt_vbak)
WHERE vbeln IN @s_vbeln.
IF sy-subrc EQ 0.
"&... Fetch Item data.
SELECT vbeln,
posnr,
matnr,
kwmeng,
netpr
FROM vbap INTO TABLE @DATA(lt_vbap)
FOR ALL ENTRIES IN @lt_vbak
WHERE vbeln EQ @lt_vbak-vbeln.
"&... Loop Header data and sum the Amount and Quantity
LOOP AT lt_vbak INTO DATA(ls_vbak).
"&... Amount
DATA(lv_amt) = REDUCE netwr( INIT x TYPE netwr FOR ls_vbap IN lt_vbap
WHERE ( vbeln = ls_vbak-vbeln )
NEXT x = x + ls_vbap-netpr ).
"&... Quantity
DATA(lv_qty) = REDUCE kwmeng( INIT y TYPE kwmeng FOR ls_vbap IN lt_vbap
WHERE ( vbeln = ls_vbak-vbeln )
NEXT y = y + ls_vbap-kwmeng ).
ENDLOOP.
ENDIF.
"&... Local Variable declaration
DATA: lv_vbeln TYPE vbak-vbeln.
"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vbeln FOR lv_vbeln.
SELECTION-SCREEN END OF BLOCK a1.
"&... Fetch header data
SELECT vbeln,
auart,
netwr
FROM vbak INTO TABLE @DATA(lt_vbak)
WHERE vbeln IN @s_vbeln.
IF sy-subrc EQ 0.
"&... Fetch Item data.
SELECT vbeln,
posnr,
kwmeng,
netpr,
vgbel,
vgpos
FROM vbap INTO TABLE @DATA(lt_vbap)
FOR ALL ENTRIES IN @lt_vbak
WHERE vbeln EQ @lt_vbak-vbeln.
IF sy-subrc EQ 0.
SELECT vbelv,
posnv,
vbeln,
posnn,
vbtyp_n
FROM vbfa INTO TABLE @DATA(lt_vbfa)
FOR ALL ENTRIES IN @lt_vbap
WHERE vbelv EQ @lt_vbap-vgbel
AND posnv EQ @lt_vbap-vgpos
AND vbtyp_n IN ( 'J','M' ). "M- Invoice , J - Delivery
IF sy-subrc EQ 0.
SELECT vbeln,
posnr,
netwr
FROM vbrp INTO TABLE @DATA(lt_vbrp)
FOR ALL ENTRIES IN @lt_vbfa
WHERE vbeln EQ @lt_vbfa-vbeln
AND posnr EQ @lt_vbfa-posnn.
ENDIF.
ENDIF.
"&... Loop Header data and sum the Amount and Quantity
LOOP AT lt_vbak INTO DATA(ls_vbak).
DATA(lv_inv_amt) = REDUCE netwr( INIT x TYPE netwr FOR ls_vbap IN lt_vbap "First Internal table
WHERE ( vbeln = ls_vbak-vbeln )
FOR ls_vbfa IN lt_vbfa "Secound Internal table
WHERE ( vbelv = ls_vbap-vgbel AND posnv = ls_vbap-vgpos AND vbtyp_n = 'M' )
FOR ls_vbrp IN lt_vbrp "Third Internal table
WHERE ( vbeln = ls_vbfa-vbeln AND posnr = ls_vbfa-posnn )
NEXT x = x + ls_vbrp-netwr ). "Sum of invoice Amount
ENDLOOP.
ENDIF.
Example 5: REDUCE with READ_TEXT
Part 1: Reading Text
"&... Local Variable declaration
DATA: lv_vbeln TYPE vbak-vbeln,
lv_id TYPE thead-tdid,
lv_name TYPE thead-tdname,
lv_object TYPE thead-tdobject,
lt_lines TYPE STANDARD TABLE OF tline.
"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vbeln FOR lv_vbeln.
SELECTION-SCREEN END OF BLOCK a1.
"&... Fetch header data
SELECT vbeln,
auart,
netwr
FROM vbak INTO TABLE @DATA(lt_vbak)
WHERE vbeln IN @s_vbeln.
IF sy-subrc EQ 0.
LOOP AT lt_vbak INTO DATA(ls_vbak).
lv_name = ls_vbak-vbeln.
lv_id = '0001'.
lv_object = 'VBBK'.
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = sy-mandt
id = lv_id
language = sy-langu
name = lv_name
object = lv_object
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7.
DATA(lv_text) = REDUCE string( INIT x TYPE string FOR ls_lines1 IN lt_lines
NEXT x = |{ x } { ls_lines1-tdline }| ).
ENDLOOP.
ENDIF.
Part 2: Reading Text with WHERE condition
"&... Local Variable declaration
DATA: lv_vbeln TYPE vbak-vbeln,
lv_id TYPE thead-tdid,
lv_name TYPE thead-tdname,
lv_object TYPE thead-tdobject,
lt_lines TYPE STANDARD TABLE OF tline.
"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_vbeln FOR lv_vbeln.
SELECTION-SCREEN END OF BLOCK a1.
"&... Fetch header data
SELECT vbeln,
auart,
netwr
FROM vbak INTO TABLE @DATA(lt_vbak)
WHERE vbeln IN @s_vbeln.
IF sy-subrc EQ 0.
LOOP AT lt_vbak INTO DATA(ls_vbak).
lv_name = ls_vbak-vbeln.
lv_id = '0001'.
lv_object = 'VBBK'.
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = sy-mandt
id = lv_id
language = sy-langu
name = lv_name
object = lv_object
TABLES
lines = lt_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7.
DATA(ls_text) = REDUCE string( INIT x TYPE string FOR ls_lines2 IN lt_lines
NEXT x = COND #( WHEN ls_lines2-tdformat = '*'
THEN |{ x } { ls_lines2-tdline }{ cl_abap_char_utilities=>newline }|
ELSE |{ x } { ls_lines2-tdline }| ) ).
ENDLOOP.
ENDIF.