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.
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
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 ) ).
Thanks Mike!
This is a good use case for ABAP Unit. Tests would bring/restore trust in the implementation.
JNN
+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.
Thanks for the answer - my missing link was the use of grouping in a reduce expression. All the best.