Skip to content

ABAP Keyword Documentation →  ABAP Overview →  ABAP and Unicode →  Differences between Unicode and Non-Unicode Programs 

Offset and Length Specifications in Unicode Programs

Offset/length specifications are made by appending [+off][(len)] to the name of a data object in operand position, and the specifications are used to access subareas of a data object. This type of programming is no longer completely possible in Unicode systems because, for example when accessing structures with components of different data types, it is not possible to define whether offset and length should be specified in characters or bytes. Furthermore, restrictions have been introduced that forbid access to memory areas outside of flat data objects.

Other versions: 7.31 | 7.40 | 7.54

Offset/Length Specifications for Elementary Data Objects

Offset/length specifications are permitted for character-like data objects and byte-like data objects. The specification of offset and length is interpreted either as a number of characters or as a number of bytes. The rules that determine which data objects in Unicode programs count as character-like or byte-like objects do not allow for offset/length specifications for data objects of numeric data types.


Note

The method of using data objects of type c as containers for storing structures of different types, which are often not known until runtime, in which components are accessed using offset/length access, is no longer possible in Unicode programs. Instead of these containers, the statement CREATE DATA can be used to generate data objects of any structure. To enable access to existing containers, these can be assigned to a field symbol using the CASTING addition of the statement ASSIGN. The COMPONENT addition can then be used to access components.

Offset/Length Specifications for Structures

An offset/length specification for a structure is only permitted in Unicode systems if the structure is either

  • character-like (meaning it only contains flat character-like components), or it is
  • flat, has a character-like initial fragment according to the Unicode fragment view, and the offset/length specification accesses this initial fragment.

In both cases, the specification of offset and length is interpreted as a number of characters.


Example

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 Unicode 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 access is only possible for the character-like initial fragment F1. Specifications such as struc(21) or struc+7(14) are accepted and are handled as a single field of type c. An access such as struc+57(2), for example, is not permitted in Unicode systems.

Offset/Length Specifications for Actual Parameters

For actual parameters specified in PERFORM, in Unicode programs, it is not possible to specify a memory area outside of the actual parameter using offset/length specifications. In particular, it is no longer possible to specify an offset without a length, as this would implicitly set the length of the actual parameter.

Offset/Length Specification for Field Symbols

When assigning a memory area to a field symbol using the ASSIGN statement, in Unicode programs it is now only possible to use offset/length specifications to access the memory within the data object. The addition RANGE defines the data object.

Field symbols themselves are also allocated an assignable memory area. This is effective if a field symbol is used as a source in the ASSIGN statement.

In non-Unicode programs, the assignable area is defined by the data area of the current program, which can lead to references being overwritten.

If a data object is entered as a source in ASSIGN, no offset can be specified without a length unless the explicit RANGE addition is specified. Otherwise, this would implicitly set the length of the data object. If the name of a field symbol is specified, its data type in Unicode programs must be flat and elementary if an offset is specified without a length.


Note

Previously, cross-field offset/length accesses could be usefully implemented in the ASSIGN statement for processing repeating groups in structures. In order to enable this in Unicode systems, the ASSIGN statement has been enhanced with the additions RANGE and INCREMENT.