02-10-2018 12:23 PM
I like the declarative ABAP style that the table expressions are offering. however, sometimes I have to switch to imperative style because I don't find a solution for the problem. Here's an example. Is this possible using a for expression?
Jörg
Loop at t into l.
Collect value #(
Key = l-key
Val = l-val )
Into sum.
Endloop.
02-10-2018 2:27 PM
You have to compute the aggregate yourself, something like
LOOP AT t INTO l GROUP BY l-key INTO g.
APPEND VALUE #( key = g
val = REDUCE #( INIT s = 0 FOR i IN GROUP g NEXT s = s + i-val ) ).
ENDLOOP.
or
sum_table = VALUE #( FOR GROUPS g OF l IN t GROUP BY l-key
LET total = REDUCE #( INIT s TYPE i FOR i IN GROUP g NEXT s = s + i )
IN key = g
val = total ).
JNN
02-10-2018 2:27 PM
You have to compute the aggregate yourself, something like
LOOP AT t INTO l GROUP BY l-key INTO g.
APPEND VALUE #( key = g
val = REDUCE #( INIT s = 0 FOR i IN GROUP g NEXT s = s + i-val ) ).
ENDLOOP.
or
sum_table = VALUE #( FOR GROUPS g OF l IN t GROUP BY l-key
LET total = REDUCE #( INIT s TYPE i FOR i IN GROUP g NEXT s = s + i )
IN key = g
val = total ).
JNN
02-10-2018 9:21 PM
I think your second version has a bug, it's counting the entire rows. I would go for:
DATA(totals) = VALUE t_total(
FOR GROUPS g OF l IN t
GROUP BY l-key
LET total = REDUCE #( INIT sum TYPE i
FOR row IN GROUP g
NEXT sum = sum + row-value )
IN ( key = g
val = total ) ).
02-11-2018 7:20 AM
Thanks Mike!
This is a good use case for ABAP Unit. Tests would bring/restore trust in the implementation.
JNN
02-11-2018 8:21 AM
Thanks for the answer - my missing link was the use of grouping in a reduce expression. All the best.
02-11-2018 1:24 PM
+1 to unit testing. It's tempting to think the code is so obvious why do I need to test it, but I know from my own experience these things creep in so easily.