ASSIGN - range_spec
Short Reference
ABAP Syntax ... { }
| {RANGE range}.
ABAP_ALTERNATIVES:
1 ... { }
2 ... RANGE range
What does it do? The range_spec specification defines the area
limits within which a memory area can be assigned to the field symbol.
Either nothing can be specified here or the addition RANGE .
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 memory area mem_area , the
assigned memory areas in Unicode
programs are used for determining the area limits of the field symbol
that is being assigned (see below).
Latest notes: 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.
ABAP_ALTERNATIVE_1 ... { }
What does it do?
Effect in Unicode Programs
If no value is specified for range_spec , the area limits in
Unicode programs are defined as
follows:
If an elementary data object was specified for dobj in
mem_area , the memory area
of this data object determines the area limits.
If a field symbol was specified for dobj in
mem_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 a structure or a field symbol was specified for dobj in
mem_area , and one of
these points to a structure, the system checks whether the structure has
a character-like 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 predicate 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 when the
memory area mem_area is specified
statically, 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 memory 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.
Latest notes: If the area limits are the same as the data area of the
ABAP program, this data area must also contain the administration
information for deep data objects because
otherwise errors could occur if these are exceeded unintentionally.
Example ABAP Coding 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
memory area to fs2 . In Unicode programs, the logical
expression after IF is no longer true, whereas in non-Unicode
programs, the larger memory 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.
cl_demo_output=>write_text( |{ <(><<)>fs2> }| ).
ENDIF.
ENDDO.
cl_demo_output=>display( ).
ABAP_ALTERNATIVE_2 ... RANGE range
What does it do? If the RANGE addition is specified in
range_spec , the area limits are defined 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 predicate
expression fs IS ASSIGNED
is incorrect, while sy-subrc is set to 4 in the dynamic variant.
The addition RANGE cannot be used with the addition
CASTING TYPE HANDLE or for assigning
table expressions .
Latest notes: A RANGE addition does not remove the type-specific
rules for substring accesses . To enable
substring access beyond the field limits of a specified data object
dobj , substring access must be possible in principle. In particular,
substring access is never possible beyond the limits of a structure in a
Unicode program, since the character-like initial part is not accessed
in this case.
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 component s
.
Example ABAP Coding 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 memory 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.
struc = VALUE #( col1_1 = 'col1_1' col2_1 = 'col2_1'
col1_2 = 'col1_2' col2_2 = 'col2_2'
col1_3 = 'col1_3' col2_3 = 'col2_3'
col1_4 = 'col1_4' col2_4 = 'col2_4'
col1_5 = 'col1_5' col2_5 = 'col2_5' ).
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.
cl_demo_output=>write_data( <(><<)>sub> ).
ENDIF.
ENDWHILE.
cl_demo_output=>display( ).
Documentation extract taken from SAP system, � Copyright SAP AG. All rights reserved