ABAP Keyword Documentation → ABAP − Reference → Processing Internal Data → Internal Tables → Expressions and Functions for Internal Tables → FOR - Table Iterations
FOR GROUPS ... OF
Other versions:
7.31 | 7.40 | 7.54
Syntax
... FOR GROUPS [group|<group>] OF wa|<fs> IN itab
[INDEX INTO idx] [cond]
GROUP BY group_key
[ASCENDING|DESCENDING [AS TEXT]]
[WITHOUT MEMBERS]
[let_exp] ...
Addition
Effect
This variant of an iteration expression for
table iterations with
FOR evaluates an internal table
itab in the same way as a
LOOP with the addition GROUP BY in two phases:
- Groups all rows that meet the condition in
condby the group key specified ingroup_key. The same applies togroup_keyas inLOOP AT ...GROUP BY. In this phase, each row read is either written to the local work areawaor assigned to the local field symbol<fs>. This can then be evaluated when the group key is constructed.
- Evaluates the groups. Specifying
groupor<group>(optional) applies the group key binding used to write the current group key to the local data objectgroupor assign it to the local field symbol<group>. Ifgroupor<group>is not specified, the representative binding applies, in which the first row of a group is written to the local work areawaor assigned to the local field symbol<fs>. In the group key binding,waor<fs>are initial after theFORexpression.
itab is a
functional operand position. The same applies to the additions ASCENDING,
DESCENDING, and WITHOUT MEMBERS as in
LOOP AT ... GROUP BY. In particular, WITHOUT MEMBERS
can be specified only if a group key binding is defined after GROUPS by specifying group or <group>.
Depending on the binding method, the work area wa or group
or the field symbol <fs> or <group> after the FOR expression can either be used in further subexpressions or to construct the result of a
table comprehension or
table reduction. In
particular, it can be specified in the expression FOR ... IN GROUP to evaluate the members of the current group.
Note
If a constructor expression contains a FOR expression with group key binding
and the group key is used as the result of the constructor expression, a suitable data type or a data
object with this type must be specified for this expression explicitly. It is not possible to derive
this type here using an inline declaration as in LOOP AT.
Example
Produces all values of the column carrid in spfli. The result of the
table comprehension
is a single-column internal table that contains all group key values. The FOR
loop works with a group key binding. Here, each group key is assigned to the local data object carrier.
SELECT * FROM spfli INTO TABLE @DATA(spfli).
TYPES group_keys TYPE STANDARD TABLE OF spfli-carrid WITH EMPTY KEY.
cl_demo_output=>display(
VALUE group_keys(
FOR GROUPS carrier OF wa IN spfli
GROUP BY wa-carrid
ASCENDING
WITHOUT MEMBERS
( carrier ) ) ).
Addition
... INDEX INTO idx
Effect
For each evaluated group, this addition sets the helper variable idx as follows:
- In the case of representative bindings,
to the value that would be set by the addition
INDEX INTOin evaluations usingFOR ... IN itabfor the representative row.
- In the case of group key bindings, the groups are counted from the value 1.
The same applies to the local data object idx as in the variant FOR ... IN itab.
idx cannot be addressed in group_key.
Example
Groups an internal table of random numbers by the numbers (and sorts it). The differences between the
group number in i and the random number demonstrate the deviation from the uniform distribution.
DATA itab TYPE TABLE OF i WITH NON-UNIQUE KEY table_line.
DATA(rnd) = cl_abap_random_int=>create( seed = + sy-uzeit
min = 1
max = 10 ).
itab = VALUE #( FOR i = 1 UNTIL i > 10 ( rnd->get_next( ) ) ).
DATA jtab LIKE itab.
jtab = VALUE #( FOR GROUPS <fs> OF wa IN itab
INDEX INTO i
GROUP BY wa
ASCENDING
( i - <fs> ) ).
cl_demo_output=>display( jtab ).