
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(<fs_ekpo>).
<fs_ekpo>-netwr = REDUCE netwr( INIT val TYPE netwr
FOR wa IN
FILTER #( it_komv
USING KEY key_kposn
WHERE kposn EQ CONV #( <fs_ekpo>-ebelp ) )
NEXT val = val + wa-kwert ).
ENDLOOP.
out->write_text( 'Using REDUCE:' ).
out->write_data( it_ekpo )->display( ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
demo=>main( ).
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
3 | |
2 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 | |
1 |