06-28-2016 2:15 PM
After posting a question on APPEND in ABAP 740, here I'm again on COLLECT statement.
Old Way:
METHOD meth_collect_old.
CLEAR gw_mard.
LOOP AT it_mard INTO DATA(lw_mard).
gw_mard-matnr = lw_mard-matnr.
gw_mard-labst = lw_mard-labst.
COLLECT gw_mard INTO rt_col1.
CLEAR gw_mard.
ENDLOOP.
ENDMETHOD.
New Way:
METHOD meth_collect_new.
DATA(lt_mard) = it_mard.
SORT lt_mard BY matnr.
DELETE ADJACENT DUPLICATES FROM lt_mard COMPARING matnr.
rt_col2 = VALUE #( FOR <lf_mard> IN lt_mard
( matnr = <lf_mard>-matnr
labst = REDUCE #(
INIT lv_sum = 0
FOR lw_mard IN it_mard
WHERE ( matnr = <lf_mard>-matnr )
NEXT lv_sum = lv_sum + lw_mard-labst
)
)
).
ENDMETHOD.
Got any better idea/solution for this? I feel the good old COLLECT statement is still better until something new is introduced.
06-28-2016 2:30 PM
06-28-2016 2:30 PM
06-28-2016 3:35 PM
Well, let me give a try to LOOP AT GROUP. But I feel, COLLECT still retains the essence here
If we have to optimize more per the new syntax, then how about the below code? In both cases, COLLECT rules!
LOOP AT it_mard INTO DATA(lw_mard).
DATA(gw_mard) = VALUE ty_mard( matnr = lw_mard-matnr
labst = lw_mard-labst ).
COLLECT gw_mard INTO rt_col1.
CLEAR gw_mard.
ENDLOOP.
Or this
LOOP AT it_mard INTO DATA(lw_mard).
DATA(gw_mard) = CORRESPONDING ty_mard( lw_mard ).
COLLECT gw_mard INTO rt_col1.
CLEAR gw_mard.
ENDLOOP.
06-28-2016 3:45 PM
I suggested LOOP AT GROUP as an elegant substitute for SORT & DAD (see your original post). You can use COLLECT in conjunction with it, if you want.
06-29-2016 11:00 AM
Yea, LOOP AT GROUP is another way! Below's the code... Not sure if it adheres the KISS principle, though.
LOOP AT it_mard INTO DATA(lw_mard)
GROUP BY lw_mard-matnr .
DATA(lt_member) = VALUE tt_mard( ).
LOOP AT GROUP lw_mard INTO DATA(ls_mard).
lt_member = VALUE #( BASE lt_member ( ls_mard ) ).
ENDLOOP.
CLEAR gw_mard.
LOOP AT lt_member INTO DATA(lw_member).
gw_mard-matnr = lw_member-matnr.
gw_mard-labst = gw_mard-labst + lw_member-labst.
ENDLOOP.
rt_col2 = VALUE #( BASE rt_col2 ( gw_mard ) ).
ENDLOOP.
06-29-2016 1:33 PM
I don't understand why you have to build the member table manually?
LOOP AT GROUP is the member loop, you can use COLLECT in conjunction with it!
What I find interesting with grouping of int. tables is that you can sort the groups locally. In my case the original table BOOKINGS is sorted ascending wrt FLDATE but the groups are sorted descending wrt FLDATE.
BR,
Suhas
PS: Copy-Paste is not working on my IE11, hence attaching the screenshot & text files
06-30-2016 7:26 AM