Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
ABAP Training
Page 1 of 9
Internal Tables
Filling Table
Appending Lines:
APPEND [{<wa>|INITIAL LINE} TO] <itab>.
Appends a new line to table. For tables with a header line the source area can be
omitted. After statement, the SY-TABIX contains the index of the appended line.
APPEND LINES OF <itab1> [FROM <idx1>] [TO <idx2>] TO <itab2>.
Appends lines from one table to another table. Default appends entire table. After
statement, the SY-TABIX contains the index of the last appended line. About 3 to
4 times faster than appending lines line by line in a loop.
APPEND [<wa> TO] <itab> SORTED BY <f>.
Inserts the new line so that the internal table <itab> is sorted in descending order
by the field <f>. If you use the SORTED BY option, the table can contain only the
number of lines specified in the OCCURS parameter. If you add more lines than
specified, the last line is discarded. This is useful for creating ranked lists of
limited length (e.g. "Top Ten"). For ranked lists containing more than 100 entries,
use instead the SORT for performance reasons.
Inserting Lines:
INSERT [{<wa>|INITIAL LINE} INTO] <itab> [INDEX <idx>].
Inserts a new line into table. For tables with a header line the source area can be
omitted. With INDEX option, the new line is inserted before the line which has
the index <idx>. After the insertion, the new entry has the index <idx> and the
index of the following lines is incremented by 1.
If the table consists of <idx> - 1 entries, the system appends the new entry after
the last existing table line. If the table has less than <idx> - 1 entries, the system
cannot insert the entry: SY-SUBRC = 4. If success, SY-SUBRC = 0.
Use INSERT without the INDEX option is allowed only within a LOOP ENDLOOP loop by inserting the new entry before the current line (i.e. the line
which has the index returned by SY-TABIX).
INSERT LINES OF <itab1> [FROM <idx1>] [TO <idx2>] INTO <itab2>
[INDEX <idx>].
Inserts lines from one table into another table. Default inserts entire table. Can be
up to 20 times faster than inserting lines line by line in a loop.
Collecting Lines:
COLLECT [<wa> INTO] <itab>.
If a table entry with the same standard key does not exists (all non-numeric
fields), the COLLECT has the same effect as the APPEND. If exists, the
COLLECT adds the contents of the numeric fields in the work area to the contents
of the numeric fields in the existing entry. SY-TABIX contains the index of the
processed line.
ABAP Training
Page 2 of 9
Internal Tables
Reading Table
Reading Single Lines:
READ TABLE <itab> [INTO <wa>] INDEX <idx>.
Reads the single line with index <idx> into <wa> (or into header line, if omitted).
This is the fastest method.
<idx> <= 0 : runtime error;
<idx> > table size : SY-SUBRC = 4;
<idx> found : SY-SUBRC = 0, SY-TABIX = <idx>.
READ TABLE <itab> [INTO <wa>] [BINARY SEARCH].
Reads the first line with a particular standard key, which should be placed in the
table work area (works only for internal tables with header line).
entry found : SY-SUBRC = 0, SY-TABIX = <idx>;
entry not found : SY-SUBRC <> 0;.
READ TABLE <itab> [INTO <wa>] WITH KEY <key>[BINARY
SEARCH].
Reads the first line with <key>.
entry found : SY-SUBRC = 0, SY-TABIX = <idx>;
entry not found : SY-SUBRC <> 0;.
Key definition for internal tables:
....WITH KEY <k1> = <f1> ... <kn> = <fn> ...
The self-defined key consists of the table components <k1>...<kn>. If the data
type of <fi> is not compatible to the data type of <ki>, then <fi> is converted to
the type of <ki>. You can specify an offset and length for any component you use
in the key. You can set key fields at runtime by replacing <ki> with (<ni>). The
key field is the contents of the field <ni>. If <ni> is blank at runtime, the system
ignores this key field. If <ni> contains an invalid component name, a runtime
error occurs.
....WITH KEY = <value> ...
Defines entire line as key (will be converted if necessary).
....WITH KEY <value> ...
The system compares the (left-justified) beginning of a line with <value>.
<value> cannot contain an internal table or a structure containing an internal
table. In contrast to the above two options, the comparison is processed using the
data type of <value>.
Additions:
BINARY SEARCH - performs a binary search instead of the standard
sequential search (much faster). Table must be sorted.
o SY-SUBRC = 0 : entry found, SY-TABIX = index of the found
entry;
o SY-SUBRC = 4 : entry not found, SY-TABIX = index of the next
largest entry, output area remains unchanged;
ABAP Training
Page 3 of 9
Internal Tables
SY-SUBRC = 8 : entry not found, the key is greater than last table
entry, SY-TABIX = (number of all entries + 1), output area
remains unchanged.
TRANSPORTING {<f1> ... <fn>|NO FIELDS} - only transports
selected fields to the target area.
COMPARING {<f1> ... <fn>|ALL FIELDS} - reads single line with key
or index into the target area. After reading the line, the components
specified in fields list are compared to the corresponding components of
the target area:
o SY-SUBRC = 0 : line is read and the contents of the compared
fields are the same;
o SY-SUBRC = 2 : line is read, but the contents of the compared
fields are not the same;
o SY-SUBRC = 4 : no line was read.
o
LOOP Processing:
LOOP AT <itab> [INTO <wa>] [FROM <n1>] [TO <n2>] [WHERE
<condition>].
...
ENDLOOP.
<itab> is read line by line into <wa> or into the table work area. For each line
read, processed the statement block between LOOP and ENDLOOP. Within the
statement block, SY-TABIX contains the index of the current line. The loop ends
as soon as all lines of the table have been processed. After the ENDLOOP
statement:
SY-SUBRC = 0 : at least one line was read;
SY-SUBRC = 4 : otherwise it is set to 4.
Restriction the number of lines to be processed:
FROM <n1> - the index of the first line to be read.
TO <n2> - the index of the last line to be read.
WHERE <condition> - the first operand of the logical expression must be
a component of <itab>. Cannot be used together with the control keyword
AT inside the loop.
Note. The FROM and TO options restrict the number of lines which the system
has to read. The WHERE option only prevents unnecessary filling of the work
area. With the WHERE option, the system must read all lines. To improve
performance, you should use the FROM and TO options as much as possible. It
can be also beneficial to leave the loop with the EXIT statement instead of using
the WHERE option.
Calculating Totals:
SUM.
Can be used only in LOOP - ENDLOOP block. A component of an internal table
line may not be another table. In an AT - ENDAT block, calculates totals for the
numeric fields (I, F, P) of all lines in the current line group and writes them to the
ABAP Training
Page 4 of 9
Internal Tables
corresponding fields in the work area. Outside an AT - ENDAT block - do it for
lines of the internal table in each loop pass. Therefore, SUM should be used only
in AT - ENDAT blocks.
Using Control Levels for Groups of Lines (AT ... ENDAT Events):
AT <line>.
...
ENDAT.
The <line> condition:
<line>
Meaning
FIRST
LAST
NEW <f>
Beginning of a group of lines with the same contents in the field <f>
and in the fields left of <f>
END OF End of a group of lines with the same contents in the field <f> and in
<f>
the fields left of <f>
<f> can be:
table field name;
table field name with Offset/Length specification;
field symbol. If it does not point to a valid component, a runtime error
occurs;
(<name>) instead of <f> (See also). The <name> contains the name of the
field <f>. If <name> is empty at runtime, the system ignores the control
break criterion. If it contains an invalid component name, a runtime error
occurs.
Cannot be used together with the WHERE restriction of a LOOP.
Immediately after AT:
All default key fields [on the right of <f>] are filled with '*';
All other fields [on the right of <f>] are cleared;
If SUM used then appropriate control totals are inserted in numeric fields;
After AT the old contents of LOOP output area are restored.
ABAP Training
Page 5 of 9
Internal Tables
Modifying Table
MODIFY <itab> [FROM <wa>] [INDEX <idx>] [TRANSPORTING <f1> ... <fn>
[WHERE <condition>]].
Modifies the line in the table. For tables with a header line the source area can be
omitted. With INDEX option, will be modified the line which has the index
<idx>. In this case: SY-SUBRC = 4 if no line with <idx> exists; SY-SUBRC = 0
- success.
Use MODIFY without the INDEX option is allowed only within a LOOP ENDLOOP loop by modifying the current line (i.e. the line which has the index
returned by SY-TABIX).
With the TRANSPORTING option, the system transports only the components
<f1> ... <fn> from the work area into the internal table. Strongly recommended
suppress unnecessary transports of fields which are internal tables itself. You can
specify a component dynamically by writing (<name>). In this case, the system
reads the name of the component from field <name> at runtime. An invalid
component name leads to a runtime error.
WHERE <condition> with the TRANSPORTING option determines all the lines
of the table into which the components <f1> ... <fn> are to be transported. First
operand should be a component of the internal table's line structure. WHERE
cannot be used together with the INDEX option.
WRITE <f>[+<o1>][(<l1>)] TO <itab>[+<o2>][(<l2>)] INDEX <idx>.
Variant of WRITE TO. Overwrites the section of the line of the <itab> that has
index <idx>. Does not affect header line. Does not recognize the structure of table
lines. Return codes: SY-SUBRC = 4 - no line with <idx> exists; SY-SUBRC = 0
- success. If <idx> <= 0 - runtime error.
Deleting lines:
DELETE <itab>.
Deletes current line in LOOP - ENDLOOP (that is line which have index SYTABIX). After the first line has been deleted, the current line and its assignment
to the contents of SY-TABIX can be undefined. To process further lines within
this loop, use only statements with the INDEX option.
DELETE <itab> INDEX <idx>.
Deletes line with the index <idx>. Return codes: SY-SUBRC = 4 - no line with
<idx> exists; SY-SUBRC = 0 - success.
DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING
{<f1> ... <f1>|ALL FIELDS}].
Deletes adjacent duplicates entries. Return codes: SY-SUBRC = 0 - at least one
entry was deleted; SY-SUBRC = 4 - otherwise. Without the COMPARING
option, the contents of the standard key fields must be the same.
DELETE <itab> [FROM <n1>] [TO <n2>] [WHERE <condition>].
Deletes selected entries. At least one of three criteria should be used. First
operand in WHERE should be a component of the internal table's line structure.
Return codes: SY-SUBRC = 0 - at least one entry was deleted; SY-SUBRC = 4 otherwise.
ABAP Training
Page 6 of 9
Internal Tables
Clearing Table
You can check whether an internal table is empty using logical expression:
... <itab> IS INITIAL ...
REFRESH <itab>.
Empties internal table.
CLEAR <itab>[].
Empties internal table without clearing the table work area.
CLEAR <itab>.
Empties internal table that has no table work area (header line).
Clears the table work area if the table has it.
FREE <itab>.
Empties internal table and releases reserved memory without clearing the table
work area.
ABAP Training
Page 7 of 9
Internal Tables
ABAP Training
Page 8 of 9
Internal Tables
... <itab1> {EQ|=|NE|<>|><|GE|>=|LE|<=|GT|>|LT|<} <itab2> ...
The first criterion for comparing internal tables is the number of lines they
contain. The more lines an internal table contains, the larger it is. If two internal
tables contain the same number of lines, they are compared line by line,
component by component. If components of the table lines are themselves internal
tables, they are compared recursively. If you use operators other than the equality
operator, the system stops the comparison as soon as it finds a pair of components
which are not equal and returns the result. In the case of internal tables with a
header line, you can use square brackets ([]) after the table name to distinguish the
table body from the table work area.
Assignment Operator:
MOVE <itab1> TO <itab2>.
[COMPUTE] <itab2> = <itab1>.
Copies entire contens of internal table that has not header line.
MOVE <itab1>[] TO <itab2>[].
[COMPUTE] <itab2>[] = <itab1>[].
Copies entire contens of internal table with header line.
ABAP Training
Page 9 of 9