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, daß 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.

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 <obj> [DECIMALS <d>].

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 muß 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 <d> 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 muß es komponentenweise an ein weiteres Feldsymbol <f> zugewiesen werden.

Obsolete ASSIGN-Varianten

Folgende Zusätze der ASSIGN-Anweisung sollten nicht mehr verwendet werden. Sie werden durch obigen CASTING-Zusatz abgelöst

Cast mit eingebauten Datentypen

Um den Datentyp eines Feldsymbols unabhängig vom zugewiesenen Datenobjekt festzulegen, konnte man vor der Einführung des CASTING-Zusatzes den Zusatz TYPE direkt in der Anweisung ASSIGN verwenden:

ASSIGN ... TO <FS> TYPE <t>.

Für <t> können aber nur die eingebauten elementaren ABAP-Typen fixer Länge (C, D, F, I, N, P, T, X), sowie 's' für 2-Byte Ganzzahlen mit Vorzeichen und 'b' für 1-Byte Ganzzahlen ohne Vorzeichen als Literal oder Variable angegeben werden. Der CASTING-Zusatz unterstützt im Gegensatz zum TYPE-Zusatz beliebige Datentypen.

Für den direkten TYPE-Zusatz sind zwei Fälle zu unterscheiden:

Die Verwendung des TYPE-Zusatzes bei einem typisierten Feldsymbol war sinnvoll, wenn der Datentyp des zuzuweisenden Datenobjekts nicht verträglich zur Typisierung des Feldsymbols ist, die entsprechende Fehlermeldung aber umgangen werden soll. In diesem Fall müssen der angegebene Typ <t> und die Typisierung des Feldsymbols verträglich sein. Das Feldsymbol behält dann seinen Datentyp unabhängig vom zugewiesenen Datenobjekt. Dieser Fall wird durch den Cast mit impliziter Typangabe abgedeckt.

Mit dem TYPE-Zusatz übernimmt ein untypisiertes Feldsymbol <FS> nicht den Datentyp und die Ausgabelänge des zugewiesenen Datenobjekts, sondern den in <t> angegebenen Datentyp. Wird das Feldsymbol nach einer Zuweisung mit TYPE-Zusatz im Programm verwendet, wird der Inhalt des Datenobjekts wird wie bei einem Feld des Typs <t> interpretiert. Dieser Fall wird durch den Cast mit expliziter Typangabe abgedeckt.

Laufzeitfehler treten auf, wenn, der angegebene Datentyp unbekannt ist, die Länge des angegebenen Datentyps nicht zum Typ des zugewiesenen Feldes paßt und eine Unverträglichkeit mit der Ausrichtung auftritt

Beispiel

Beispiel mit obsoletem TYPE-Zusatz:

DATA txt(8) VALUE '19980606'.

DATA mytype(1) VALUE 'X'.

FIELD-SYMBOLS <fs>.

ASSIGN txt TO <fs>.
WRITE / <fs>.

ASSIGN txt TO <fs> TYPE 'D'.
WRITE / <fs>.

ASSIGN TXT TO <FS> TYPE MYTYPE.
WRITE / <fs>.

Beispiel mit CASTING-Zusatz:

DATA txt(8) VALUE '19980606'.

DATA mytype(1) VALUE 'X'.

FIELD-SYMBOLS <fs>.

ASSIGN txt TO <fs>.
WRITE / <fs>.

ASSIGN txt TO <fs> CASTING TYPE d.
WRITE / <fs>.

ASSIGN txt TO <fs> CASTING TYPE (mytype).
WRITE / <fs>.

Die Listenausgabe ist in beiden Fällen in etwa:

19980606

06061998

3139393830363036

In diesen Beispielen wird die Zeichenkette TXT dreimal dem Feldsymbol<FS> zugewiesen: zuerst ohne Casting, dann mit Casting des Typs auf D und X. Das Format der zweiten Ausgabezeile hängt von den Angaben im Benutzerstammsatz ab. Die Zahlen in der letzten Ausgabezeile stehen paarweise für den hexadezimalen Code der Zeichen in TXT und hängen von der Zeichendarstellung der Plattform (hier ASCII) ab.

Cast der Dezimalstellen

Um bei der Zuweisung einer gepackten Zahl vom Typ P die Anzahl der Dezimalstellen des Feldsymbols festzulegen, man vor der Einführung des CASTING-Zusatzes den Zusatz DECIMALS direkt in der Anweisung ASSIGN verwenden:

Syntax

ASSIGN ... TO <FS> DECIMALS <d>.

Der DECIMALS-Zusatz kann mit allen Varianten der Anweisung ASSIGN eingesetzt werden, bei denen das zugewiesene Datenobjekt den Typ P hat. Die Verwendung des DECIMALS-Zusatzes führt im allgemeinen zu unterschiedlichen numerischen Werten für das Feldsymbol und das zugewiesene Feld. Die Anzahl der Dezimalstellen <d> kann als Literal oder Variable angegeben werden. Ein Laufzeitfehler tritt auf, wenn <d> nicht zwischen 0 und 14 liegt oder das zugewiesene Feld nicht vom Typ P ist.

Beispiel

Beispiel mit obsoletem DECIMALS-Zusatz:

DATA: pack1 TYPE p DECIMALS 2 VALUE '400',
      pack2 TYPE p DECIMALS 2,
      pack3 TYPE p DECIMALS 2.

FIELD-SYMBOLS: <f1> TYPE ANY ,
               <f2> TYPE ANY.

WRITE: / 'PACK1', pack1.

ASSIGN pack1 TO <f1> DECIMALS 1.
WRITE: / '<F1> ', <f1>.

pack2 = <f1>.
WRITE: / 'PACK2', pack2.

ASSIGN pack2 TO <f2> DECIMALS 4.
WRITE: / '<F2> ', <f2>.

pack3 = <f1> + <f2>.
WRITE: / 'PACK3', pack3.

<f2> = '1234.56789'.
WRITE: / '<F2> ', <f2>.
WRITE: / 'PACK2', pack2.

Beispiel mit CASTING-Zusatz:

DATA: pack1 TYPE p DECIMALS 2 VALUE '400',
      pack2 TYPE p DECIMALS 2,
      pack3 TYPE p DECIMALS 2.

FIELD-SYMBOLS: <f1> TYPE ANY ,
               <f2> TYPE ANY.

WRITE: / 'PACK1', pack1.

ASSIGN pack1 TO <f1> CASTING TYPE p DECIMALS 1.
WRITE: / '<F1> ', <f1>.

pack2 = <f1>.
WRITE: / 'PACK2', pack2.

ASSIGN pack2 TO <f2> CASTING TYPE p DECIMALS 4.
WRITE: / '<F2> ', <f2>.

pack3 = <f1> + <f2>.
WRITE: / 'PACK3', pack3.

<f2> = '1234.56789'.
WRITE: / '<F2> ', <f2>.
WRITE: / 'PACK2', pack2.

Die Listenausgabe ist in beiden Fällen:

PACK1          400,00

<F1>          4.000,0

PACK2        4,000,00

<F2>          40,0000

PACK3        4.040,00

<F2>       1.234,5679

PACK2      123.456,79

Die drei Felder vom Typ P haben alle zwei Dezimalstellen. Die Feldsymbole <f1> und <f2> erhalten eine bzw. vier Dezimalstellen. Die numerischen Werte sind verschieden für die Feldsymbole und die zugewiesenen Felder.

Ende des Inhaltsbereichs