Anfang des Inhaltsbereichs

Zuweisungen  Dokument im Navigationsbaum lokalisieren

Dieser Abschnitt behandelt impizite und explizite Typkonvertierungen mit dem Gleichheitszeichen (=) oder der Anweisung MOVE. Zwei Felder sind konvertibel, wenn der Inhalt des einen Feldes dem zweiten zugewiesen werden kann, ohne einen Laufzeitfehler auszulösen.

Bei der Konvertierung zwischen strukturierten Feldern beziehungsweise zwischen einem strukturierten Feld und einem Einzelfeld wurden flache Strukturen bisher wie C-Felder behandelt. Dies ist mit der Einführung von Unicode zu fehleranfällig geworden, da unsicher ist, ob Programme mit plattformunabhängiger Semantik ablauffähig sind.

Zwei Felder sind kompatibel, wenn sie in Typ und Länge gleich sind. Bei der Zuweisung von tiefen Strukturen müssen deshalb die Fragmentsichten übereinstimmen. Bei Zuweisung und Vergleich von tiefen Strukturen wurde bisher schon gefordert, daß Typkompatibilität zwischen den Operanden besteht, womit beide Operanden strukturell gleich aufgebaut sein müssen. Diese Forderung wird auch für Unicode-Systeme beibehalten.

Konvertierung zwischen flachen Strukturen

Zur Überprüfung, ob die Konvertierung überhaupt erlaubt ist, wird zunächst die Unicode-Fragmentsicht der Strukturen gebildet, indem zeichen- und byteartige Gruppen sowie Alignment-Lücken und sonstige Komponenten zusammengefaßt werden. Wenn die Fragmente von Quell- und Zielstruktur mit Typ und Länge in der Länge der kürzeren Struktur übereinstimmen, ist die Konvertierung erlaubt. Die Zuweisung ist ebenfalls unter folgenden Annahmen zulässig:

  1. Beide Strukturen stimmen in allen Fragmenten bis zum vorletzten der kürzeren Struktur überein.
  2. Das letzte Fragment der kürzeren Struktur ist eine zeichen- oder byteartige Gruppe.
  3. Das korrespondierende Fragment der längeren Struktur ist eine zeichen- oder byteartige Gruppe größerer Länge.

Wenn die Zielstruktur länger als die Quellstruktur ist, werden die zeichenartigen Komponenten des Rests mit Leerzeichen gefüllt. Alle anderen Komponenten des Rests werden mit dem typgerechten Initialwert, Alignment-Lücken mit Null-Bytes gefüllt. Da längere Strukturen bisher generell mit Leerzeichen aufgefüllt wurden, ist die Verwendung von Initialwerten bei nicht zeichenartigen Komponententypen inkompatibel. Diese inkompatible Änderung hat allerdings eher den Charakter einer Fehlerkorrektur. Bei zeichenartigen Komponenten wurde aus Gründen der Kompatibilität darauf verzichtet, mit Initialwerten aufzufüllen.

BEGIN OF struc1,
  a(1) TYPE C,
  x(1) TYPE X,
END OF struc1.

BEGIN OF struc2,
  a(1) TYPE C,
  b(1) TYPE C,
END OF struc2.

Die Zuweisung struc1 = struc2 ist unter Unicode nicht erlaubt, weil struc1-x im Gegensatz zu struc2-b nur ein Byte belegt.

BEGIN OF struc3,
  a(2) TYPE C,
  n(6) TYPE N,
  i TYPE I,
END OF struc3.

BEGIN OF struc4,
  a(8) TYPE C,
  i    TYPE I,
  f    TYPE F,
END OF struc4.

Diese Zuweisung struc3 = struc4 ist zulässig, weil die Fragmentsichten der zeichenartigen Felder und der Integerzahl übereinstimmen.

BEGIN OF struc5,
  a(1) TYPE X,
  b(1) TYPE X,
  c(1) TYPE C,
END OF struc5.

BEGIN OF struc6,
  a(1) TYPE X,
  BEGIN OF STRUC3,
    b(1) TYPE X,
    c(1) TYPE C,
  END OF struc3,
END OF struc6.

struc5 = struc6 ist wiederum verboten, weil die Fragmentsichten der beiden Strukturen durch die Alignment-Lücken vor struc3 und vor struc3-c abweichen.

BEGIN OF struc7,
  p(8) TYPE P,
  c(1) TYPE C,
END OF struc7.

BEGIN OF struc8,
  p(8) TYPE P,
  c(5) TYPE C,
  o(8) TYPE P,
END OF struc8.

Die Zuweisung struc7 = struc8 funktioniert, weil die Fragmentsichten in der Länge der Struktur struc1 übereinstimmen.

Bei tiefen Strukturen wird wie bisher die Typkompatibilität der Operanden gefordert. Als Abrundungsmaßnahme wurde die Konvertibilität bei Objekt-Referenzen und Tabellenkomponenten leicht verallgemeinert.

Konvertierung zwischen Strukturen und Einzelfeldern

Für die Konvertierung einer Struktur in ein Einzelfeld und umgekehrt gelten folgende Regeln:

Analog zur Zuweisung zwischen Strukturen ist das Auffüllen nicht zeichenartiger Komponenten mit dem Initialwert inkompatibel.

Konvertierung zwischen internen Tabellen

Tabellen sind dann konvertierbar, wenn ihre Zeilentypen konvertierbar sind. Die oben beschriebenen Restriktionen wirken sich somit auch auf die Konvertierung von Tabellen aus.

Implizite Konvertierungen

Für alle ABAP-Anweisungen, die implizite Konvertierungen entsprechend der MOVE-Semantik verwenden, gelten ebenfalls die obigen Regeln. Dies ist zum Beispiel bei folgenden Anweisungen für interne Tabellen der Fall:

APPEND wa TO itab.
APPEND LINES OF itab1 TO itab2.

INSERT wa INTO itab.
INSERT LINES OF itab1 INTO [TABLE] itab2.

MODIFY itab FROM wa.
MODIFY itab ... TRANSPORTING ... WHERE ... ki = vi ...

READ TABLE itab ...INTO wa.  
READ TABLE itab ...WITH KEY ...ki = vi ...

LOOP AT itab INTO wa.
LOOP AT itab .... WITH KEY ... ki = vi ...

Die selben Einschränkungen wie bei der expliziten Konvertierung gelten auch für die implizite Umwandlung von VALUE-Angaben.

Hinweis Im Zusammenhang mit Strukturerweiterungen sind die im Dictionary verwendeten Kategorien zu beachten.