Anfang des Inhaltsbereichs

Bearbeitung von Teilfeldern Dokument im Navigationsbaum lokalisieren

In allen Anweisungen, in denen deklarierte Felder mit nichtnumerischen elementaren ABAP-Typen (C, D, N, T, X) oder Strukturen ohne interne Tabellen als Komponenten auftreten, können über folgende Syntax Teilfelder adressiert werden:

<f>[+<o>][(<l>)]

Durch die optionalen Angaben eines Offsets +<o> und eine Länge (<l>) direkt hinter dem Feldnamen <f>, wird der Teil des Felds, der auf Position <o>+1 beginnt und die Länge <l> hat, als eigenes Datenobjekt angesprochen. In allen Anweisungen können Offset <o> und Länge <l> statisch als Zahlenliterale ohne Vorzeichen oder dynamisch über Variable angegeben werden.

Datentyp und Länge der Teilfelder bestimmen sich wie folgt:

Ursprüngliches Feld

Teilfeld

Datentyp

Datentyp

Länge

C

C

<l>

D

N

<l>

N

N

<l>

T

N

<l>

X

X

<l>

Struktur

C

<l>

Falls die Länge <l> nicht angegeben wird, wird das Teilfeld zwischen <o> und dem Feldende adressiert. Falls die angegebene Kombination von Offset und Länge zu ungültigen Teilfeldern führt, da die ursprüngliche Feldlänge überschritten wird, kommt es zu einem Syntax-, bzw. Laufzeitfehler. Die Teilfeldadressierung ist nicht bei Literalen und Textsymbolen möglich.

Besondere Vorsicht ist bei der Teilfeldadressierung in Strukturen geboten. Diese können wegen der Ausrichtung der Komponenten vom Typ I und F plattformabhängige Füllfelder enthalten, die bei der Zählung zu berücksichtigen sind. Weiterhin ist eine Umstellung der internen Darstellung von zeichenartigen Typen auf UNICODE vorgesehen, wodurch ein Zeichen in einem UNICODE-R/3 System zwei oder vier Bytes statt wie bisher ein Byte belegt. Während bei rein zeichenartigen Feldern (Typ C, D, N, T) oder bei einem rein hexadezimalen Feld (Typ X) die Teilfeldadressierung weiterhin funktionieren wird, kann es in Strukturen, insbesondere wenn numerische, zeichenartige und hexadezimale Komponenten gemischt vorkommen, inkompatible Änderungen geben. Die Teilfeldadressierung von Strukturen wird deshalb nicht empfohlen, insbesondere wenn die Komponenten gemischte Typen haben.

Beispiel

DATA time TYPE t VALUE '172545'.

WRITE time.
WRITE / time+2(2).
CLEAR time+2(4).
WRITE / time.

Ausgabe:

172545

25

170000

Zunächst werden die Minuten durch Angabe eines Offsets in der WRITE-Anweisung ausgewählt. Dann werden Minuten und Sekunden durch Angabe eines Offset in der CLEAR-Anweisung auf ihre Initialwerte gesetzt.

Teilfelder in der Anweisung MOVE

Im Fall der MOVE-Anweisung sieht die Syntax für die Adressierung von Teilfeldern so aus:

MOVE <f1>[+<o1>][(<l1>)] TO <f2>[+<o2>][(<l2>)].

Bzw. für den Zuweisungsoperator:

<f2>[+<o2>][(<l2>)] = <f1>[+<o1>][(<l1>)].

Der Wert des Teilfelds von Feld <f1>, das auf Position <o1>+1 beginnt und die Länge <l1> hat wird Feld <f2> zugewiesen, wo es das Teilfeld überschreibt, das auf Position <o2>+1 beginnt und die Länge <l2> hat.

Es wird empfohlen Werte mit Offset- und Längenangaben nur zwischen zeichenartigen elementaren Feldern zuzuweisen. Bei Strukturen können Teilfeldzuweisungen leicht zu unsinnigen Ergebnissen führen.

Beispiel

DATA: f1(8)  TYPE c VALUE 'ABCDEFGH',
      f2(20) TYPE c VALUE '12345678901234567890'.

f2+6(5) = f1+3(5).

In diesem Beispiel funktioniert der Zuweisungsoperator wie folgt:

Diese Grafik wird im zugehörigen Text erklärt

Beispiel

DATA: f1(8) TYPE c VALUE 'ABCDEFGH',
      f2(8). TYPE c.

DATA: o TYPE i VALUE 2,
      l TYPE i VALUE 4.

MOVE f1      TO f2.      WRITE   f2.
MOVE f1+o(l) TO f2.      WRITE / f2.
MOVE f1      TO f2+o(l). WRITE / f2.

CLEAR f2.
MOVE f1      TO f2+o(l). WRITE / f2.
MOVE f1+o(l) TO f2+o(l). WRITE / f2.

Listenausgabe dieses Beispiels:

ABCDEFGH

CDEF

CDABCD

  ABCD

  CDEF

Zunächst wird der Inhalt von F1 ohne Offset-Angaben F2 zugewiesen. Dann geschieht dasselbe mit Offset- und Längenangaben für F1 . Die nächsten drei MOVE-Anweisungen überschreiben den Inhalt von F2 mit Offset 2. Beachten Sie, daß F2 entsprechend der Konvertierungsregel für Quelltyp C rechts mit Leerstellen aufgefüllt wird.

Teilfelder in der Anweisung WRITE TO

Im Fall der WRITE TO-Anweisung sieht die Syntax für die Adressierung von Teilfeldern so aus:

WRITE <f1>[+<o1>][(<l1>)] TO <f2>[+<o2>][(<l2>)].

Der Wert des Teilfelds von Feld <f1>, das auf Position <o1>+1 beginnt und die Länge <l1> hat, wird in ein Characterfeld konvertiert und dann Feld <f2> zugewiesen, wo es das Teilfeld überschreibt, das auf Position <o2>+1 beginnt und die Länge <l2> hat.

Beispiel

DATA: string(20) TYPE c,
      number(8) TYPE c VALUE '123456',
      offset TYPE i VALUE 8,
      length TYPE i VALUE 12.

WRITE number(6) TO string+offset(length) LEFT-JUSTIFIED.
WRITE: / string.
CLEAR string.

WRITE number(6) TO string+offset(length) CENTERED.
WRITE: / string.
CLEAR string.

WRITE number TO string+offset(length) RIGHT-JUSTIFIED.
WRITE: / string.
CLEAR string.

Die Ausgabe dieses Beispiels ist:

        123456

           123456

              123456

Die ersten sechs Stellen des Felds NUMBER werden linksbündig, zentriert und rechtsbündig in die letzten 12 Stellen des Felds STRING geschrieben.

 

 

Ende des Inhaltsbereichs