In operand positions, subareas of certain data objects can be accessed by specifying an offset/length:
A specified offset or length is directly appended to either the
of the data object, an
<fs> field symbol, or a dereferenced data reference variable
dref->*. Offsets/lengths can be specified for:
- Flat structures where one of the following prerequisites must be met:
- The structure contains flat character-like components only.
- The first fragment of the structure fragment view is flat and character-like, and the substring addressed by specifying the offset and length is located within this fragment.
The following restrictions apply:
- In write positions, only flat data objects are permitted; it is not possible to write to substrings of strings.
- Access to substrings of strings is also not possible in the following reading positions:
dobj[+off][(len)]specified as an argument of the statement GET REFERENCE or the reference operator
dobj[+off][(len)]specified as an actual parameter for input parameters in calls of methods, function modules , and subroutines .
- Offsets/lengths cannot be specified for literals or text symbols.
- A specified offset/length cannot be appended directly to a table expression
itab[ ... ], but this is possible after a chaining whose final place is a suitable structure component after a structure component selector.
- No offset or length can be specified for an enumerated object with an enumerated type, regardless of the base type.
- In the case of dynamically specified operands in parentheses, no lengths can be specified.
- A dereferenced data reference variable
dref->*must be typed in full.
- For a writable expression, offsets/lengths cannot be specified as
memory areas in the statement
ASSIGN or as arguments of the reference operator
REF(table expressions only).
The segment of the data object is used that has the offset specified in
and the length (in characters or bytes) specified in
len. A memory area must
not be addressed outside the field boundaries, except in the case of the statement
ASSIGN. In an offset specified without a length, the entire substring
is addressed from
off characters; for a length specified without an offset,
len characters are addressed (different rules apply to the statement
len expect data objects of
i. These data objects must contain positive integers, with the following exceptions.
- The length 0 can be specified for strings.
- A negative offset (but never length 0) can be specified if an
<fs>field symbol is specified in the statement
offis less than the length of
dobj, an asterisk (
*) can be specified for
len. The upper limit of
dobjthen determines the upper limit of the memory area.
If the prerequisites are not met or if the subarea defined by
len is not completely contained in the data object (except in the case of
ASSIGN), a syntax error occurs (if statically identifiable). Otherwise,
an exception of the class CX_SY_RANGE_OUT_OF_BOUNDS is raised. If
off is specified as a numeric literal, this literal cannot be prefixed with a sign.
The offset and length specifications are counted in characters for character-like data objects and in bytes for all other data objects.
A substring specified by an offset or length specification is treated like a data object of the specified length for which the data type depends on the data type of the original data object, the field symbol, or the data reference variable, as shown below:
|Original Data Type||Data Type of Substring|
If the length of the substring matches the length of the structure in a substring access to a structure
exactly, the substring does not have data type
c and is handled like the structure itself instead.
- For reads on substrings of character-like data objects, built-in
substring functions that allow searches by specifying
both substring and offset/lengths are available. The substring functions can also be used to edit arguments where offsets and lengths cannot be specified, such as data objects with an
enumerated type. This is because an implicit conversion to
stringis performed here.
- It is a good idea to specify offsets with the value 0 explicitly too (that is,
dobj(len)). This distinguishes a substring access in the source code clearly from other language constructs that also use parentheses, such as dynamic specifications, method calls, or inline declarations.
dobj(*)are always interpreted as
dobj. In this case,
dobjcan also be a data object where substring access according to the rules above is not possible.
- No substring access
sum(len)can be performed on data objects called
sumunless an offset is specified explicitly. The compiler always interprets this as a number or sum of a field
lenin the group level processing of an extract dataset.
- Obsolete syntax forms can still occur with substring access (apart from with classes).
- The statement
MOVE PERCENTAGEindicates an obsolete form of substring access.
The following structure has both character-like and non-character-like components:
DATA: BEGIN OF struc, a TYPE c LENGTH 3, "Length 3 characters b TYPE n LENGTH 4, "Length 4 characters c TYPE d, "Length 8 characters d TYPE t, "Length 6 characters e TYPE decfloat16, "Length 8 bytes f TYPE c LENGTH 28, "Length 28 characters g TYPE x LENGTH 2, "Length 2 bytes END OF struc.
The fragment view splits the structure into five areas, F1 - F5.
[ aaa | bbbb | cccccccc | ddd | AAA | eeee | fffffffffffff | gg ]
[ F1 | F2 | F3 | F4 | F5 ]
Offset/length accesses are possible on the character-like initial fragment F1
only, for example
struc+7(14). An access such as
struc+57(2), for example, is not permitted.