ABAP Keyword Documentation → ABAP - Reference → Assignments → Setting References → ASSIGN
ASSIGN - range_spec
Other versions: 7.31 | 7.40 | 7.54
Syntax
... { }
| {RANGE range}.
Alternatives
Effect
The range_spec
specification defines the area limits within which a memory
area can be assigned to the field symbol. You can either make no specification or specify the RANGE
addition.
At the same time, the ASSIGN
statement assigns these area limits to the field
symbol <fs>
. If the field symbol <fs>
is itself used in a subsequent ASSIGN
statement to specify a storage area mem_area
, the assigned storage areas in
Unicode programs are used for determining the area limits of the field symbol that is being assigned (see below).
Note
The area limits assigned to a field symbol using range_spec
only apply to
the following ASSIGN
statements. In other statements, with the exception of ADD UNTIL
, the
general rules apply.
Alternative 1
... { }
Effect
Effect in Unicode Programs
If no value is specified for range_spec
, the area limits in Unicode programs are defined as follows:
-
If you have specified an elementary data object for
dobj
inmem_area
, the memory area of this data object determines the area limits. -
If you have specified a field symbol for
dobj
inmem_area
, and this field symbol has an elementary data object assigned to it, the field symbol<fs>
of the current statement takes on the area limits assigned to this field symbol. -
If you have specified a structure or a field symbol for
dobj
inmem_area
, and one of these points to a structure, the system checks whether the structure has a character-type initial part (up to the first alignment gap). This then determines the area limits.
If these area limits are exceeded, no memory area is assigned for the static variant of mem_area
after the ASSIGN
statement. Also, the logical expression
<fs> IS ASSIGNED
is incorrect, while sy-subrc
is set to 4 in the dynamic variant.
Effect in Non-Unicode Programs
If no value is specified for range_spec
, the area limits in non-Unicode programs are defined as follows:
-
If the name of a data object is specified directly in the specification of the storage area
mem_area
, the area limits are determined by the data area of the ABAP program. -
If the name of a data object is specified dynamically for the specification of the storage area
mem_area
, the area limits are determined by the dynamically specified data object.
If these area limits are exceeded, an unhandleable exception is raised.
Note
If the area limits are the same as the data area of the ABAP program, you must ensure that this data area also contains the administration information for deep data objects because otherwise errors could occur if these are exceeded unintentionally.
Example
In the first ASSIGN
statement, the area limits of the data object text
are assigned to <fs1>
. In the second ASSIGN
statement, <fs2>
takes on these limits. From the sixth loop pass, the
system attempts to assign a larger storage area to <fs2>
. In Unicode programs,
the logical expression after IF
is no longer true, whereas in non-Unicode programs, the larger storage area is assigned.
DATA text TYPE c LENGTH 8 VALUE '12345678'.
FIELD-SYMBOLS: <fs1> TYPE ANY,
<fs2> TYPE ANY.
ASSIGN text+3(3) TO <fs1>.
DO 8 TIMES.
ASSIGN <fs1>(sy-index) TO <fs2>.
IF <fs2> IS ASSIGNED.
WRITE / <fs2>.
ENDIF.
ENDDO.
Alternative 2
... RANGE range
Effect
If the RANGE
addition is specified in range_spec
, the area limits are restricted by the
data area of a range
data object. range
expects a data object of any data type. It must cover
the area limits in Unicode programs when the RANGE
addition is not specified
(see above). If it is established at runtime that range
does not cover these area limits, an unhandleable exception is raised.
When the RANGE
addition is used, only subareas of the range
data object can be assigned to the field symbol. If these area limits are exceeded, no memory area is
assigned for the static variant of mem_area
after the ASSIGN
statement. Also, the logical expression
<fs> IS ASSIGNED
is incorrect, while sy-subrc
is set to 4 in the dynamic variant.
Note
If a structure is specified for range
that contains
dynamic data objects,
they only contribute the internal reference to the data area of the structure. The actual data area
of the dynamic data objects is outsourced and is of no significance for RANGE
. This also applies to substructures that are declared as
boxed components.
Example
The struc
structure is constructed from ten components col1_1
,
col2_1
, ..., col1_5
, col2_5
.
The ASSIGN
statement assigns the memory area of two neighboring components
to the structure-typed field symbol <sub>
, one after the other. Here the
memory area is determined by the common name of the first two components comp1
in the structure struc
and the specification of INCREMENT
.
Without the RANGE
addition, the WHILE
loop would
only execute once in Unicode programs since it would only be possible to access the storage area of
struc-comp1
. The RANGE
addition causes the loop to be passed five times. The components of the field symbol can be accessed after the assignment.
TYPES: BEGIN OF sub_struc,
col1 TYPE c LENGTH 10,
col2 TYPE c LENGTH 10,
END OF sub_struc.
DATA BEGIN OF struc.
INCLUDE TYPE: sub_struc AS comp1 RENAMING WITH SUFFIX _1,
sub_struc AS comp2 RENAMING WITH SUFFIX _2,
sub_struc AS comp3 RENAMING WITH SUFFIX _3,
sub_struc AS comp4 RENAMING WITH SUFFIX _4,
sub_struc AS comp5 RENAMING WITH SUFFIX _5.
DATA END OF struc.
FIELD-SYMBOLS <sub> TYPE sub_struc.
DATA inc TYPE i.
WHILE sy-subrc = 0.
inc = sy-index - 1.
ASSIGN struc-comp1 INCREMENT inc TO <sub> CASTING
RANGE struc.
IF sy-subrc = 0.
WRITE: <sub>-col1, <sub>-col2 ...
ENDIF.
ENDWHILE.