Skip to content

ABAP Keyword Documentation →  ABAP - Reference →  Processing Internal Data →  Internal Tables →  Processing Statements for Internal Tables →  LOOP AT itab →  LOOP AT itab - GROUP BY →  Examples of Grouping with LOOP 

Internal Tables, Grouping with LOOP, Output Behavior

This example demonstrates the different output behavior in groupings of internal tables.

Other versions: 7.31 | 7.40 | 7.54

Source Code

    DATA(out) = cl_demo_output=>new( ).

    TYPES:
      BEGIN OF struct,
        key1 TYPE string,
        key2 TYPE string,
        col  TYPE i,
      END OF struct,
      itab TYPE STANDARD TABLE OF struct WITH EMPTY KEY.

    DATA(itab) = VALUE itab(
      ( key1 = `a` key2 = `a` col = 1 )
      ( key1 = `a` key2 = `b` col = 2 )
      ( key1 = `a` key2 = `a` col = 3 )
      ( key1 = `a` key2 = `a` col = 4 )
      ( key1 = `a` key2 = `b` col = 5 )
      ( key1 = `b` key2 = `a` col = 6 )
      ( key1 = `b` key2 = `a` col = 7 )  ).

    DATA members TYPE itab.

    out->begin_section( `Representative Binding`
      )->begin_section( `INTO wa` ).
    LOOP AT itab INTO DATA(wa)
                 GROUP BY ( key1 = wa-key1 key2 = wa-key2 ).
      DATA(idx) = sy-tabix.
      CLEAR members.
      out->begin_section( |Group { idx }| ).
      LOOP AT GROUP wa INTO DATA(member).
        members = VALUE #( BASE members ( member ) ).
      ENDLOOP.
      out->write( members )->end_section( ).
    ENDLOOP.
    out->next_section( `ASSIGNING <fs>` ).
    LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>)
                 GROUP BY ( key1 = <fs>-key1 key2 = <fs>-key2 ).
      idx = sy-tabix.
      CLEAR members.
      out->begin_section( |Group { idx }| ).
      LOOP AT GROUP <fs> INTO member.
        members = VALUE #( BASE members ( member ) ).
      ENDLOOP.
      out->write( members )->end_section( ).
    ENDLOOP.
    out->next_section( `REFERENCE INTO dref` ).
    LOOP AT itab REFERENCE INTO DATA(dref)
                 GROUP BY ( key1 = dref->key1 key2 = dref->key2 ).
      idx = sy-tabix.
      CLEAR members.
      out->begin_section( |Group { idx }| ).
      LOOP AT GROUP dref INTO member.
        members = VALUE #( BASE members ( member ) ).
      ENDLOOP.
      out->write( members )->end_section( ).
    ENDLOOP.
    out->end_section( )->end_section( ).

    out->begin_section( `Group Key Binding`
      )->begin_section( `INTO group` ).
    LOOP AT itab ASSIGNING <fs>
                 GROUP BY ( key1 = <fs>-key1 key2 = <fs>-key2 )
                 INTO DATA(group).
      idx = sy-tabix.
      CLEAR members.
      out->begin_section(
        |Group { idx }, Key { group-key1 } { group-key2 }| ).
      LOOP AT GROUP group INTO member.
        members = VALUE #( BASE members ( member ) ).
      ENDLOOP.
      out->write( members )->end_section( ).
    ENDLOOP.
    out->next_section( `ASSIGNING <group>` ).
    LOOP AT itab ASSIGNING <fs>
                 GROUP BY ( key1 = <fs>-key1 key2 = <fs>-key2 )
                 ASSIGNING FIELD-SYMBOL(<group>).
      idx = sy-tabix.
      CLEAR members.
      out->begin_section(
        |Group { idx }, Key { <group>-key1 } { <group>-key2 }| ).
      LOOP AT GROUP <group> INTO member.
        members = VALUE #( BASE members ( member ) ).
      ENDLOOP.
      out->write( members )->end_section( ).
    ENDLOOP.
    out->next_section( `REFERENCE INTO group_ref` ).
    LOOP AT itab ASSIGNING <fs>
                 GROUP BY ( key1 = <fs>-key1 key2 = <fs>-key2 )
                 REFERENCE INTO DATA(group_ref).
      idx = sy-tabix.
      CLEAR members.
      out->begin_section(
        |Group { idx }, Key { group_ref->key1 } { group_ref->key2 }| ).
      LOOP AT GROUP group_ref INTO member.
        members = VALUE #( BASE members ( member ) ).
      ENDLOOP.
      out->write( members )->end_section( ).
    ENDLOOP.

    out->display( ).

Description

In the grouping of an internal table itab, the six ways of combining the output behavior of the LOOP statement with the output behavior of the group loop are demonstrated. The three group loops with representative binding and the three group loops with group key binding are executed. Here, the three ways of defining the output behavior of the LOOP statement are used.

In each group loop a member loop is executed. Here, the group is specified after LOOP AT GROUP that is produced by the output behavior. In the member loop, the members are placed in an internal table members using the value operator with the addition BASE. This table is produced as output in the group loop. The result is the same in all cases.

In addition, the value of sy-tabix in the group loop is produced. This value is different in the representative binding and in the group key binding. In the group key binding, the group key can also be addressed and produced. This is not possible in the representative binding.