Skip to Content
1

Collect with table expressions

Feb 10 at 12:23 PM

100

avatar image

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.

10 |10000 characters needed characters left characters exceeded
* Please Login or Register to Answer, Follow or Comment.

1 Answer

Best Answer
Jacques Nomssi Feb 10 at 02:27 PM
4

GROUP BY

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

Show 4 Share
10 |10000 characters needed characters left characters exceeded

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 ) ).
2

Thanks Mike!

This is a good use case for ABAP Unit. Tests would bring/restore trust in the implementation.

JNN

1

+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.

0

Thanks for the answer - my missing link was the use of grouping in a reduce expression. All the best.

0