Show TOC Anfang des Inhaltsbereichs

Obsoletes Casting  Dokument im Navigationsbaum lokalisieren

AchtungFolgende Zusätze der ASSIGN-Anweisung sollten nicht mehr verwendet werden. Sie werden durch den 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 dtype.

Für dtype 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:

·        Typisierte Feldsymbole

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 dtype 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.

·        Untypisierte Feldsymbole

Mit dem TYPE-Zusatz übernimmt ein untypisiertes Feldsymbol <fs> nicht den Datentyp und die Ausgabelänge des zugewiesenen Datenobjekts, sondern den in dtype 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 dtype 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 passt 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:

ASSIGN ... TO <fs> DECIMALS dec.

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 dec kann als Literal oder Variable angegeben werden. Ein Laufzeitfehler tritt auf, wenn dec 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