Show TOC Anfang des Inhaltsbereichs

Casting von Datenobjekten  Dokument im Navigationsbaum lokalisieren

Bei der Zuweisung von Datenobjekten an Feldsymbole kann ein Cast auf beliebige Datentypen durchgeführt werden. Das bedeutet, dass ein beliebiger Speicherbereich unter der Annahme eines bestimmten Typs betrachtet werden kann. Somit kann symbolisch und ohne die Zuhilfenahme von Offset-/Längenangaben auf Teilfelder zugegriffen werden.

Ein Cast erfolgt mit dem Zusatz CASTING der ASSIGN-Anweisung. Der Zusatz CASTING erlaubt es, Feldsymbolen Datenobjekte zuzuweisen, deren Typ nicht zur Typisierung des Feldsymbols kompatibel ist. Wir unterscheiden einen Cast mit impliziter und einen Cast mit expliziter Typangabe.

Der CASTING-Zusatz ersetzt einige obsolete Zusätze der ASSIGN-Anweisung, die nicht mehr verwendet werden sollen.

Cast mit impliziter Typangabe

Falls das Feldsymbol entweder vollständig oder mit einem der generischen eingebauten ABAP-Typen c, n, p oder x typisiert ist, kann folgende ASSIGN-Anweisung verwendet werden:

ASSIGN ... TO <fs> CASTING.

Bei Zugriff auf das Feldsymbol, wird der Inhalt des zugewiesenen Datenobjekts so interpretiert, als ob er den Typ des Feldsymbols hätte. Länge und Ausrichtung des Datenobjekts müssen zum Typ des Feldsymbols verträglich sein, ansonsten kommt es zu einem Laufzeitfehler. Falls im Datentyp des zugewiesenen Datenobjekts oder des Feldsymbols Strings, Referenztypen oder interne Tabellen auftreten, müssen diese Komponenten in Typ und Position exakt übereinstimmen. Ansonsten kommt es ebenfalls zu einem Laufzeitfehler.

Beispiel

REPORT demo_field_symbols_casting.

TYPES: BEGIN OF t_date,
          year(4)  TYPE n,
          month(2) TYPE n,
          day(2)   TYPE n,
       END OF t_date.

FIELD-SYMBOLS <fs> TYPE t_date.

ASSIGN sy-datum TO <fs> CASTING.

WRITE / sy-datum.
SKIP.
WRITE: / <fs>-year , / <fs>-month, / <fs>-day.

Die Listenausgabe ist in etwa:

1999/05/19

1999
05
19

In diesem Beispiel wird ein Feldsymbol <fs> vollständig mit dem programmlokalen Typ t_date typisiert. Durch den Zusatz CASTING der ASSIGN-Anweisung kann das Feld sy-ucomm wie eine Struktur behandelt werden. Ohne den CASTING-Zusatz wäre die Zuweisung nicht möglich, da sy-datum nicht verträglich zum Typ des Feldsymbols ist.

Cast mit expliziter Typangabe

Falls das Feldsymbol nicht vollständig sondern generisch typisiert ist, kann folgende ASSIGN-Anweisung verwendet werden:

ASSIGN ... TO <fs> CASTING {TYPE type}|{LIKE dobj} [DECIMALS dec].

Bei Zugriff auf das Feldsymbol, wird der Inhalt des zugewiesenen Datenobjekts so interpretiert, als ob er den angegebenen Typ hätte. Nach TYPE kann auch ein in runden Klammern eingeschlossener Name eines Datenobjekts angegeben werden. Dann bezeichnet der Inhalt des Datenobjekts den Datentyp zur Laufzeit.

Es dürfen keine Typen angegeben werden, mit denen ein explizites Casting von Datenobjekten nicht sinnvoll ist wie z.B ein Cast einer Standard-Tabelle auf eine sortierte Tabelle oder ein Cast einer Objektreferenz auf eine Datenreferenz. Hinter TYPE dürfen also keine Tabellenarten wie z.B. SORTED TABLE oder Referenztypen mit REF TO angegeben werden. Falls im angegebenen Datentyp implizit Strings, Referenztypen oder interne Tabellen auftreten, müssen diese Komponenten bezüglich Typ und Position genauso im zugewiesenen Datenobjekt auftreten. Ansonsten kommt es zu einem Syntax- bzw. Laufzeitfehler.

Der durch TYPE oder LIKE angegebene Datentyp muss mit der generischen Typisierung des Feldsymbols verträglich sein. Er kann die generische Typisierung belassen oder spezialisieren, kann aber eine bereits bekannte technische Eigenschaft des Feldsymbols nicht rückgängig machen. Beispielsweise kann bei einem Feldsymbol vom vollständig generischen Typ ANY ein beliebiger erlaubter, auch generischer Typ angegeben werden. Bei einem Feldsymbol der generischen Typen c, n, p oder x kann nur noch die Länge bzw. die Anzahl der Dezimalstellen festgelegt werden. Bei einem vollständig typisierten Feldsymbol kann ohnehin keine weitere Spezialisierung vorgenommen werden und die explizite Typangabe ist deshalb verboten. Dies wird falls möglich statisch ansonsten zur Laufzeit überprüft.

Der Zusatz DECIMALS ist dann sinnvoll, wenn der Inhalt des zugewiesenen Datenobjekts als gepackte Zahl interpretiert werden kann. Das Feldsymbol erhält dann dec Dezimalstellen. DECIMALS kann nur dann verwendet werden, wenn kein Typangabe gemacht wird oder wenn hinter TYPE der Typ p angegeben ist. Ohne Typangabe wird implizit der Typ p verwendet. Die Zusätze LIKE und DECIMALS dürfen nicht zusammen verwendet werden.

Beispiel

REPORT demo_field_symbols_casting_typ.

TYPES: BEGIN OF t_date,
          year(4)  TYPE n,
          month(2) TYPE n,
          day(2)   TYPE n,
       END OF t_date.

FIELD-SYMBOLS: <fs> TYPE ANY,
               <f>  TYPE n.

ASSIGN sy-datum TO <fs> CASTING TYPE t_date.

WRITE / sy-datum.

SKIP.

DO.
  ASSIGN COMPONENT sy-index OF STRUCTURE <fs> TO <f>.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  
WRITE / <f>.
ENDDO.

Die Listenausgabe ist in etwa:

1999/05/19

1999
05
19

In diesem Beispiel ist das Feldsymbol <fs> vollständig generisch. Durch den Zusatz CASTING der ASSIGN-Anweisung wird für das Feld sy-ucomm ein Cast auf den programmlokalen Typ t_date durchgeführt. Das Feldsymbol <fs> kann jetzt zwar wie eine Struktur behandelt werden, kennt aber keine Komponenten. Deshalb muss es komponentenweise an ein weiteres Feldsymbol <f> zugewiesen werden.

Ende des Inhaltsbereichs