Sunday, November 14, 2021

REDUCE Operator

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
DATAlv_vbeln TYPE vbak-vbeln.

"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONSs_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_countREDUCE iINIT FOR ls_vbak IN lt_vbak
                             NEXT ).

ENDIF.







Example 2: REDUCE with WHERE condition:

"&... Local Variable declaration
DATAlv_vbeln TYPE vbak-vbeln.

"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONSs_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_countREDUCE iINIT FOR ls_vbak IN lt_vbak
                             WHERE auart 'ZSP' )
                             NEXT ).


ENDIF.











Example 3: Sum of Amount or Quantity

"&... Local Variable declaration
DATAlv_vbeln TYPE vbak-vbeln.

"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONSs_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_amtREDUCE netwrINIT TYPE netwr FOR ls_vbap IN lt_vbap
                         WHERE vbeln ls_vbak-vbeln )
                                 NEXT + ls_vbap-netpr ).

    "&... Quantity
    DATA(lv_qtyREDUCE kwmengINIT y TYPE kwmeng FOR ls_vbap IN lt_vbap
                          WHERE vbeln ls_vbak-vbeln )
                                  NEXT y + ls_vbap-kwmeng ).

  ENDLOOP.

ENDIF.




Example 4: Nester loop with multiple table

"&... Local Variable declaration
DATAlv_vbeln TYPE vbak-vbeln.

"&... Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK a1 WITH FRAME TITLE text-001.
SELECT-OPTIONSs_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_amtREDUCE netwrINIT 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 + ls_vbrp-netwr )"Sum of invoice Amount

  ENDLOOP.

ENDIF.


Example 5: REDUCE with READ_TEXT
Part 1: Reading Text

"&... Local Variable declaration
DATAlv_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-OPTIONSs_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_textREDUCE stringINIT TYPE string FOR ls_lines1 IN lt_lines
                                NEXT |{ } { ls_lines1-tdline }| ).


  ENDLOOP.

ENDIF.









Part 2: Reading Text with WHERE condition

"&... Local Variable declaration
DATAlv_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-OPTIONSs_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_textREDUCE stringINIT TYPE string FOR ls_lines2 IN lt_lines
                    NEXT COND #WHEN ls_lines2-tdformat '*'
                    THEN |{ } { ls_lines2-tdline }{ cl_abap_char_utilities=>newline }|
                    ELSE |{ } { ls_lines2-tdline }| ).


  ENDLOOP.

ENDIF.




SALV 8: Adding Custom PF STATUS in ALV

Note: First create Custom PF Status using below Link: https://sapabapc.blogspot.com/2022/08/create-custom-pf-status.html *&-------------...