Calm! Don’t hit me. I exaggerated in the title, but it isn’t at all a lie. I don’t want to stay repeating Horst Keller, but some ABAPers still come to me: “I never had to use REDUCE…”

An expression with the REDUCE reduction operator creates a result of a specified data type using the type of one or more condition expressions.
A new and more performative way to not use LOOP AT NEW, for example ( ok ok .. is very old ).
With REDUCE it is possible to do a mathematical operation grouping by the items of a certain table for example. That is, instead of making a LOOP inside LOOP between two tables, you can use REDUCE to directly access the items you need to read. The reading is based on a table, so you can use the FILTER operator, for example, to generate the internal table with only the desired items. See the example below:

REPORT ysamplelkp_reduce.

*------------------------------------------------*
* PURPOSE: For each order item, calculate
* the total value from the KOMV table
* (Conditions) where:
* Condition PBXX = value X
* Condition RA01 = value Y
*
* TOTAL / ITEM (NETWR) = Sum PBXX + Sum RA01
*------------------------------------------------*

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS main.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD main.

    TYPES:
      BEGIN OF y_ekpo,
        ebeln TYPE ekpo-ebeln,
        ebelp TYPE ekpo-ebelp,
        netwr TYPE ekpo-netwr,
      END OF y_ekpo,
      yt_ekpo TYPE SORTED TABLE OF y_ekpo
              WITH UNIQUE KEY ebeln ebelp,

      BEGIN OF y_komv,
        knumv TYPE komv-knumv,
        kposn TYPE komv-kposn,
        kschl TYPE komv-kschl,
        kwert TYPE komv-kwert,
      END OF y_komv,
      yt_komv TYPE SORTED TABLE OF y_komv
              WITH NON-UNIQUE KEY knumv kposn kschl
              WITH NON-UNIQUE SORTED KEY key_kposn COMPONENTS kposn kschl.

    DATA it_ekpo  TYPE yt_ekpo.
    DATA it_komv  TYPE yt_komv.

    it_ekpo =
      VALUE #(
        ( ebeln = '0040000000' ebelp = '10'	 )
        ( ebeln = '0040000000' ebelp = '20'	 )
        ( ebeln = '0040000000' ebelp = '30'	 )
              ).

    it_komv =
      VALUE #(
        ( knumv = '0000000001' kposn = '10'	kschl = 'RA01' kwert = '10.00'  )
        ( knumv = '0000000001' kposn = '10'	kschl = 'PBXX' kwert = '350.00' )
        ( knumv = '0000000001' kposn = '20'	kschl = 'RA01' kwert = '2.00'   )
        ( knumv = '0000000001' kposn = '20'	kschl = 'RA01' kwert = '3.50'   )
        ( knumv = '0000000001' kposn = '20'	kschl = 'PBXX' kwert = '400.00' )
        ( knumv = '0000000001' kposn = '10'	kschl = 'RA01' kwert = '5.00'   )
        ( knumv = '0000000001' kposn = '10'	kschl = 'PBXX' kwert = '200.00' )
              ).
    DATA(out) = cl_demo_output=>new( )->write_data( it_ekpo ).

    out->write_data( it_komv ).

*------------------------------------------------*
* Using LOOP and Work area (on purpose)
*------------------------------------------------*
    DATA st_ekpo     LIKE LINE OF it_ekpo.
    DATA st_ekpox    LIKE LINE OF it_ekpo.
    DATA st_komv     LIKE LINE OF it_komv.

    LOOP AT it_ekpo
      INTO st_ekpo.

      st_ekpox = st_ekpo.

      AT NEW ebelp.

        LOOP AT it_komv
           INTO st_komv
          USING KEY key_kposn
          WHERE kposn EQ st_ekpox-ebelp.

          st_ekpo-netwr = st_ekpo-netwr + st_komv-kwert.

        ENDLOOP.

        MODIFY it_ekpo FROM st_ekpo TRANSPORTING netwr.

      ENDAT.

    ENDLOOP.

    out->write_text( 'Using LOOP and Work area:' ).

    out->write_data( it_ekpo ).

*------------------------------------------------*
* Using REDUCE ( It's beautiful! )
*------------------------------------------------*
    LOOP AT it_ekpo
      ASSIGNING FIELD-SYMBOL().
      -netwr = REDUCE netwr( INIT val TYPE netwr
                                      FOR wa IN
                                      FILTER #( it_komv
                                                USING KEY key_kposn
                                                WHERE kposn EQ CONV #( -ebelp ) )
                                      NEXT val = val + wa-kwert ).
    ENDLOOP.

    out->write_text( 'Using REDUCE:' ).

    out->write_data( it_ekpo )->display( ).


  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.

Giving…

REDUCE:

This is a simple example. Probably I can get the same result without using LOOP in any way ( it’s for you to think ). For me, it’s a very clean code. For more details, I recommend a read on at Help SAP for Iteration Expressions.

Hugs!

Autor: Douglas Santos, ABAP Development.

 

Fonte: https://blogs.sap.com/2017/05/25/replace-the-loop-for-reduce-operator/