1

# Collect with table expressions

Feb 10 at 12:23 PM

100

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.

```

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

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 ) ).```
Mike Pokraka

Thanks Mike!

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

JNN

Jacques Nomssi

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