ABAP - Keyword Documentation →  ABAP - Reference →  Processing Internal Data →  Internal Tables →  Processing Statements for Internal Tables →  MODIFY itab → 

MODIFY itab - itab_lines

Quick Reference

Syntax

... itab FROM wa [USING KEY keyname]
         TRANSPORTING comp1 comp2 ... WHERE log_exp|(cond_syntax).


Extras:

1. ... WHERE log_exp

2. ... USING KEY keyname

3. ... WHERE (cond_syntax)

Effect

In this variant, the statement MODIFY assigns the content of the components comp1 comp2 ... of the work area wa specified after TRANSPORTING to all rows of the table itab that meet the condition after WHERE. wa is a functional operand position. The work area wa must be compatible with the row type of the internal table.

The addition TRANSPORTING has the same effect as changing individual rows. The addition WHERE can only be specified together with the addition TRANSPORTING.

Note

Outside of classes, an obsolete short form is possible where FROM wa can be omitted if the internal table has a header line itab with the same name. The statement then uses the header line as the work area implicitly. Furthermore, USING KEY cannot be specified without USING KEY.

Addition 1

... WHERE log_exp

Effect

Static WHERE condition. All rows are processed for which the condition after WHERE is met. If a static WHERE condition is specified, the row type of the internal table must be statically identifiable. WHERE can be specified for all table categories.

A logical expression log_exp can be specified after WHERE, in which the first operand of each relational expression is a component of the internal table. Any comparison expression and the predicate expression IS INITIAL can be specified as relational expressions. Other predicates cannot be specified. The components of the internal table must be specified as individual operands and not as part of an expression. Parenthesized character-like data objects cannot be used to specify a component dynamically here. The remaining operands of a relational expression are general expression positions at which any suitable individual operands or expressions can be specified, but no components of the internal table. The specified components can have any data type. The relevant comparison rules apply to the evaluation.

no optimization takes place when a sorted table or a hashed table is accessed using the primary table key. Any access using a secondary table key produces a syntax error or exception. In the part of the logical expression relevant for the optimization, the static WHERE condition cannot specify any duplicate or overlapping keys. Duplicate key components can, however, be specified in the part of the logical expression whose relational expressions do not make a contribution to the optimized access.

Notes

Example

In the column col2 of the internal table itab, the MODIFY statement replaces every negative value with the number 0.

TYPES:
  BEGIN OF line,
    col1 TYPE c LENGTH 1,
    col2 TYPE i,
  END OF line.

DATA itab TYPE SORTED TABLE OF line
               WITH UNIQUE KEY col1.

DATA(rnd) = cl_abap_random_int=>create( seed = + sy-uzeit
                                        min  = 1
                                        max  = 20 ).

itab = VALUE #( FOR i = 1 UNTIL i > 26
                ( col1 = substring( val = sy-abcde
                                    off = i - 1
                                    len = 1 )
                                    col2 = rnd->get_next( ) - 10 ) ).

MODIFY itab FROM VALUE line( col2 = 0 ) TRANSPORTING col2
            WHERE col2 < 0.

Addition 2

... USING KEY keyname

Effect

The USING KEY addition can be used to specify a table key in keyname used to carry out the processing. The specified table key influences the order in which the table rows are accessed, and the evaluation of the remaining conditions.

If the primary table key is specified, the processing behaves in the same way as when no key is explicitly specified. If a secondary table key is specified, the order in which the rows are accessed is as follows:

Notes

Example

In the internal table itab, the MODIFY statement replaces the value in the column col1 with "_" if the column col2 contains the value 0. The WHERE condition is evaluated (and the evaluation optimized) using the secondary key mkey.

TYPES:
  BEGIN OF line,
    col1 TYPE c LENGTH 1,
    col2 TYPE i,
  END OF line.

DATA itab TYPE TABLE OF line
               WITH EMPTY KEY
               with NON-UNIQUE SORTED KEY mkey COMPONENTS col2.

DATA(rnd) = cl_abap_random_int=>create( seed = + sy-uzeit
                                        min  = 1
                                        max  = 10 ).

itab = VALUE #( FOR i = 1 UNTIL i > 26
                ( col1 = substring( val = sy-abcde
                                    off = i - 1
                                    len = 1 )
                                    col2 = rnd->get_next( ) - 5 ) ).

MODIFY itab FROM VALUE line( col1 = '_' ) USING KEY mkey
            TRANSPORTING col1 WHERE col2 = 0.

Addition 3

... WHERE (cond_syntax)

Effect

Dynamic WHERE Condition cond_syntax can be specified as a character-like data object or standard table with character-like row type that, when the statement is executed and with the following exceptions, contains the syntax of a logical expression (in accordance with the rules of the static WHERE condition) or is initial. The following are not supported in a dynamic WHERE condition:

The syntax in cond_syntax is, as in the ABAP Editor, not case-sensitive. When an internal table is specified, the syntax can be distributed across multiple rows. If cond_syntax is initial when the statement is executed, the logical expression is true. Invalid logical expressions raises an exception from the class CX_SY_ITAB_DYN_LOOP.

Security Note

If used wrongly, dynamic programming techniques can present a serious security risk. Any dynamic content that is passed to a program from the outside must be checked thoroughly or escaped before being used in dynamic statements. This can be done using the system class CL_ABAP_DYN_PRG or the predefined function escape. See Security Risks of Input from Outside.

Note

The dynamic WHERE conditions is not evaluated for a blank table for optimization reasons. Therefore, if an internal table is blank, and a logical expression has errors, no exception is raised.

Example

Like the example for static WHERE conditions, but with a condition for the column col2 that can be entered dynamically.

DATA condition TYPE string VALUE '< 0'.
cl_demo_input=>request( CHANGING field = condition ).
condition = `col2 ` && condition.

TYPES:
  BEGIN OF line,
    col1 TYPE c LENGTH 1,
    col2 TYPE i,
  END OF line.

DATA itab TYPE SORTED TABLE OF line
               WITH UNIQUE KEY col1.

DATA(rnd) = cl_abap_random_int=>create( seed = + sy-uzeit
                                        min  = 1
                                        max  = 20 ).

itab = VALUE #( FOR i = 1 UNTIL i > 26
                ( col1 = substring( val = sy-abcde
                                    off = i - 1
                                    len = 1 )
                                    col2 = rnd->get_next( ) - 10 ) ).
TRY.
    MODIFY itab FROM VALUE line( col2 = 0 ) TRANSPORTING col2
                WHERE  (condition).
    cl_demo_output=>display( itab ).
  CATCH cx_sy_itab_dyn_loop INTO DATA(exc).
    ...
ENDTRY.