If no explicit table key name is specified after USING KEY, the order in which the rows are read depends on the table category as follows:
Standard tables and sorted tables The rows are read by ascending row numbers in the
primary table index.
In each loop pass, the system field sy-tabix contains the row number of the current row in the primary table index.
Hashed tables The rows are processed in the order in which they were inserted
in the table, and by the sort order used after the statement SORT. In each loop pass, the system field sy-tabix contains the value 0.
The loop continues to run until all the table rows that meet the cond condition
have been read or until it is exited with a statement. If no appropriate rows are found or if the internal table is blank, the loop is not run at all.
This variant of the statement LOOP AT sets the value of the system field sy-tabix:
In each loop pass for index tables and when using a
sorted key on the row number of the current table row in the associated table index.
LOOP AT does not modify sy-subrc. After leaving
the loop using ENDLOOP, sy-tabix is set to the value that it had before entering the loop and that applies for sy-subrc:
The loop was run at least once.
The loop was not run at all.
The system fields sy-tfill and sy-tleng are also filled.
Changing Internal Tables in a Loop
If rows are inserted or deleted in the statement block of a LOOP, this has
the following effects: The position of inserted or deleted rows with respect to the current row is determined
by the row numbers in the corresponding table index in the case of loops on index tables or if using a sorted key. In the case of loops on hashed tables and if using a hash key, the position depends on the insert order.
If rows are inserted after the current row, these new rows are processed in the subsequent loop passes. An endless loop can result.
If rows are deleted after the current row, the deleted rows are no longer processed in the subsequent loop passes.
If rows are inserted before the current row, the internal loop counter is increased by one with each
inserted row. This affects sy-tabix, which is also increased (in the subsequent loop pass in the case of loops on index tables or when using a sorted key).
If the current row or rows before the current row are deleted, the internal loop counter is decreased
by one with each deleted row. In the case of loops on index tables or if using a sorted key, this affects sy-tabix in the subsequent loop pass, and sy-tabix is decreased accordingly.
The replacement of the entire table body in a LOOP using this table causes
the loop to be exited at the next loop pass in accordance with the rules described above. This is particularly
the case if new rows were added to the table afterwards. Since this usually produces unpredictable program
behavior, the entire table body cannot be accessed in change mode in a loop. If this is known statically,
a syntax error occurs in classes and for LOOPS with secondary keys known
statically. Otherwise, the syntax check simply returns a warning for compatibility reasons. However,
at runtime, a runtime error occurs in most cases when replacing the entire table body with statements
such as CLEAR, FREE, LOCAL,
REFRESH, SORT, DELETE ... WHERE, and with all types of assignments to itab.
If the internal table itab is specified using a
the loop is executed completely using the table referenced at entry. Any changes to the reference variable do not have an effect on the loop. The associated object cannot be deleted from the
until the loop has been completed. The same thing is true if the table is represented by a field symbol.
After the implementation of the field symbol in the loop, iteration still takes place using the table linked to the field symbol when LOOP is entered.
There is no implicit selection of a suitable key or index. The used table key or table index is always specified uniquely. The syntax check issues a warning if there is a suitable
secondary table key
but this table key is not used. This warning should be removed through using the key. However, in exceptional cases, it can be bypassed using a
It is generally better to read multiple rows in a LOOP than making multiple individual row reads using the statement READ TABLE or
Due to compatibility reasons, when a table body is replaced, the only situation where a runtime does
not occur in the loop is when a directly specified table is read without a specified secondary key and
when a work area wa is specified for output response result.
Nested LOOPs without an explicitly specified key. The contents of the current row for the outer loop are analyzed in the WHERE condition for the inner loop.
DATA name TYPE scarr-carrname VALUE '*'. cl_demo_input=>request( CHANGING field = name ).
DATA: scarr_tab TYPE SORTED TABLE OF scarr
WITH UNIQUE KEY carrname,
spfli_tab TYPE SORTED TABLE OF spfli
WITH NON-UNIQUE KEY carrid.
FROM scarr INTO TABLE @scarr_tab.
SELECT * FROM spfli INTO TABLE @spfli_tab.
LOOP AT scarr_tab ASSIGNING FIELD-SYMBOL(<scarr_line>) WHERE carrname CP name.
LOOP AT spfli_tab INTO DATA(spfli_line)
WHERE carrid = <scarr_line>-carrid.
cl_demo_output=>write_data( spfli_line ). ENDLOOP. ENDLOOP. cl_demo_output=>display( ).