3.7. Manipulation : Loop with REDUCE

REDUCE


This is used to create a result of a data type specified using type from one or more iteration expressions.

As the name suggest , it is used generally to reduce sets of data objects to a single data object.

 
Please note that at least one iteration expression must be specified using FOR
 
although it is also possible to specify multiple consecutive iteration expressions.
  
 
We have LET, INIT, NEXT and FILTER  as most important operator we can use with REDUCE operators
  
 
INIT  : Mandatory to use - 
 
Used for any number of  declaration
   
 
NEXT : Mandatory to use  - 
 
Used to execute a expression for each iteration
 
  
LET : Optional to use    - 
 
Used to declare local helper variable

 

FILTER : Optional to use - 

Used to filter out the values
 

Firstly lets see a very simple example to sum the column values in a table

 TYPES : BEGIN OF ty_int1,
          name TYPE char10,
          value TYPE i,
          value1 TYPE i,
          END OF ty_int1,
          tt_int1 TYPE sorted TABLE OF ty_int1 WITH non-UNIQUE KEY name.

DATA(lt_int1) = VALUE tt_int1(
                              ( name = 'ENTRY1' value = '10' value1 = '20' )
                              ( name = 'ENTRY2' value = '30' value1 = '40' )
                              ( name = 'ENTRY1' value = '50' value1 = '60' )
                              ( name = 'ENTRY2' value = '70' value1 = '80' )
                              ( name = 'ENTRY2' value = '90' value1 = '100' )
                              ).

Created table :

 

3.7.1. Get sum of a column

*Get sum of column 'VALUE'
DATA(lv_value_sum) = REDUCE i( INIT lv1 = 0
                               FOR ls_int1 in lt_int1
                               NEXT lv1 = lv1 + ls_int1-value
                              ).



 *Get sum of column 'VALUE1'
DATA(lv_value1_sum) = REDUCE i( INIT lv2 = 0
                               FOR ls_int1 in lt_int1
                               NEXT lv2 = lv2 + ls_int1-value1
                              ).

 Resultant values :

 

3.7.2. Using WHERE 

*Get sum of rows having name = 'ENTRY1' .

DATA(ls_entry1_sum) = REDUCE ty_int1( 

                                                     INIT ls_temp TYPE ty_int1
                                                      FOR ls_int1 in lt_int1
                                                     WHERE ( name = 'ENTRY1' )
                                                      NEXT ls_temp-value =  ls_temp-value + ls_int1-value
                                                      ls_temp-value1 =  ls_temp-value1 + ls_int1-value1
                                                       ls_temp-name = ls_int1-name
                                                                       ).

Resultant sum :

 

* Achieving same as above using filter

 DATA : lv_name TYPE char10 VALUE 'ENTRY1'.
 DATA(ls_entry2_sum) = REDUCE ty_int1(

                                                    INIT ls_temp TYPE ty_int1
                                                    FOR ls_int1 in
                                                    FILTER #( lt_int1 WHERE name = lv_name )
                                                    NEXT ls_temp-value =  ls_temp-value + ls_int1-value
                                                    ls_temp-value1 =  ls_temp-value1 + ls_int1-value1
                                                     ls_temp-name = ls_int1-name
                                                                      ).

Resultant Sum :


3.7.3. Use of LET

This is to just show that LET can be used with REDUCE  ,  
in real project work you may try this in different manner.

 DATA(ls_using_let) = REDUCE i( 

                                                        INIT lv_let = 50
                                                        for i = 1 while i LE 10
                                                        let lv_let1 = 100
                                                        IN
                                                        NEXT lv_let =  ( i ) * lv_let1 
                                                        "final output will have 10 *100 = 1000      
                                                       
                                                        ).
 
Resultant value : 
 


Next - Meshes

 

No comments:

Post a Comment