Anfang des Inhaltsbereichs

Variablen Dokument im Navigationsbaum lokalisieren

Variablen sind benannte Datenobjekte, die statisch mit deklarativen Anweisungen oder dynamisch während der Programmlaufzeit erzeugt werden. Variablen dienen dazu, änderbare Daten unter einem bestimmten Namen im Arbeitsspeicher eines Programms zu halten.

Folgende Anweisungen dienen der statischen Deklaration von Variablen:

DATA und STATICS werden in diesem Abschnitt erklärt. Für nähere Informationen zu CLASS-DATA, siehe Klassen, und zu PARAMETERS, SELECT-OPTIONS und RANGES, siehe Selektionsbilder.

Eine dynamische Deklaration von Variablen erfolgt beim Hinzufügen von Zeichen oder Bytes zu Strings oder von Zeilen zu internen Tabellen. Bei Strings liegt nach ihrer statischen Deklaration nur der Typ fest. Bei internen Tabellen sind es die Attribute Zeilentyp, Zugriffsart und Schlüssel. Die eigentlichen Datenobjekte, nämlich die Zeichen- und Bytefolgen bzw. die Zeilen von internen Tabellen, werden dynamisch zur Laufzeit erzeugt.

Auch beim Aufruf von Prozeduren können Datenobjekte dynamisch erzeugt werden. Diese Datenobjekte sind die Formalparameter der Schnittstellendefinition, die ihre technischen Eigenschaften erst zur Laufzeit von übergebenen Aktualparametern übernehmen.

Die Anweisung DATA

Die Anweisung DATA dient der Deklaration von Variablen eines ABAP-Programms oder von Instanzattributen in Klassen. Innerhalb eines Programms oder einer Klasse können mit DATA in Prozeduren nochmals lokale Variablen definiert werden. Für die Sichtbarkeit von Variablen gilt hierbei Sinngemäß das gleiche, wie für die Sichtbarkeit von Datentypen unter Der TYPE-Zusatz. Lokale Variablen in Prozeduren verschatten gleichnamige Variablen im Rahmenprogramm bzw. der Klasse.

Die Syntax der DATA-Anweisung ist ähnlich zur TYPES-Anweisung:

DATA <f> ... [TYPE <type>|LIKE <obj>]... [VALUE <val>].

Der Name der Variablen <f> kann bis zu 30 Zeichen lang sein. Es können alle Zeichen verwendet werden, bis auf die Ausnahmen +., : () und der Name darf nicht aus Ziffern alleine bestehen. Die Namen der vordefinierten Datenobjekte können nicht verwendet werden. Es sollten keine Namen verwendet werden, die mit einem Schlüsselwort oder einem Zusatz von ABAP-Anweisungen übereinstimmen. Es sollten

Bei der statischen Deklaration einer Variablen werden ihre technischen Eigenschaften, also Länge, Anzahl der Dezimalstellen und Datentyp vollständig festgelegt. Hierbei unterscheiden wir folgende Möglichkeiten.

Bezug auf bekannte technische Eigenschaften

Um eine Variable anzulegen, die ihre gesamten technischen Eigenschaften von einem bereits vorhandenen Datentyp oder Datenobjekt übernimmt, verwendet man die DATA-Anweisung wie folgt:

DATA <f> [TYPE <type>|LIKE <obj>]...

Bei Verwendung des TYPE-Zusatzes, ist <type> ein beliebiger Datentyp, dessen technischen Eigenschaften vollständig spezifiziert sind. Dies kann sein ein:

Bei Verwendung des LIKE-Zusatzes, ist <obj> ein bereits deklariertes Datenobjekt. Dies kann auch ein vordefiniertes Datenobjekt sein. Die Variable <f> erhält die gleichen technischen Eigenschaften, wie das Datenobjekt <obj>. Weiterhin kann man sich mit LIKE auf eine Zeile einer bereits als Datenobjekt deklarierten internen Tabelle beziehen:

DATA <f> LIKE LINE OF <itab>.

Aus Kompatibilitätsgründen zu vorhergehenden Releases, kann <obj> auch eine Datenbanktabelle, ein View, eine Struktur oder eine ihrer Komponenten aus dem ABAP Dictionary sein.

Die Datentypen, auf die sich bezogen wird, können elementare Typen, Referenztypen oder komplexe Typen (Strukturen, Tabellen) sein. Bei elementaren Typen sind die Variablen ein einzelnes Feld im Speicherbereich. Bei den Datentypen fixer Länge (D, F, I, T) liegt der belegte Speicherbereich bereits bei der Deklaration fest. Bei den Datentypen variabler Länge (STRING und XSTRING) werden bei der Deklaration nur Verwaltungseinträge vorgenommen und die Länge der Datenobjekte wird zur Laufzeit dynamisch verwaltet. Bei Strukturen sind die Variablen eine Folge von Variablen, die selbst wieder komplex sein können. Die einzelnen Komponenten übernehmen ihre Namen <ci> dabei vom Typ <type> bzw. vom Objekt <obj> und können über <f>-<c i> angesprochen werden. Bei Tabellen werden im Speicherbereich Verwaltungseinträge für interne Tabellen vorgenommen, die zur Laufzeit dynamisch gefüllt werden können.

Beispiel

TYPES: BEGIN OF struct,
         number_1 TYPE i,
         number_2 TYPE p DECIMALS 2,
       END OF struct.

DATA:  wa_struct TYPE struct,
       number    LIKE wa_struct-number_2,
       date      LIKE sy-datum,
       time      TYPE t,
       text      TYPE string,
       company   TYPE s_carr_id.

Es werden Variablen mit Bezug auf den programmlokalen Typ STRUCT, auf eine Komponente eines bereits vorhandenen Datenobjekts WA_STRUCT, auf das eingebaute Datenobjekt SY-DATUM, auf die eingebauten ABAP-Typen T und STRING und auf das Datenelement S_CARR_ID aus dem ABAP Dictionary deklariert.

Bezug auf Datentypen mit generischen Eigenschaften

Wenn man sich in der DATA-Anweisung auf einen der generischen eingebauten ABAP-Typen fixer Länge (C, N, P, X) bezieht, müssen die noch offenen technischen Eigenschaften in der DATA-Anweisung spezifiziert werden. Die DATA-Anweisung hat dabei die gleiche Syntax wie die TYPES-Anweisung;

DATA <f>[(<length>)] TYPE <type> [DECIMALS <d>]...

Mit der Option <length> wird die Feldlänge festgelegt. Ohne die Angabe von <length> wird die Feldlänge auf den entsprechenden Initialwert der Tabelle unter Eingebaute ABAP-Typen gesetzt. Falls <type> gleich P ist, wird mit der Option DECIMALS die Anzahl der Dezimalstellen <d> festgelegt. Ohne die Angabe von DECIMALS wird die Anzahl der Dezimalstellen auf Null gesetzt.

Ohne TYPE- oder LIKE-Zusatz wird implizit der eingebaute generische Typ C verwendet. Die implizite Anweisung

DATA <f>.

definiert also eine Charactervariable <f> der Länge 1. Sie ist eine Kurzform der expliziten Anweisung

DATA <f>(1) TYPE C.

Bei der Angabe von Dezimalstellen für gepackte Zahlen sind maximal sind 14 Stellen <d> nach dem Dezimalpunkt möglich. Um die Dezimalstellen zu verwenden, muß das Programmattribut Festpunktarithmetik gesetzt sein, sonst werden die Varaiblen wie ganze Zahlen behandelt. Bei Zuweisungen an gepackte Zahlen werden überflüssige Ziffern gerundet.

Bis auf generische Standard-Tabellen, deren Schlüssel nicht definiert ist, kann man sich in der DATA-Anweisung zur Zeit nicht auf weitere generische Datentypen beziehen.

Beispiel

DATA: text1,
      text2(2),
      text3(3) TYPE c,
      pack TYPE P DECIMALS 2 VALUE '1.225'.

Es werden drei Charactervariablen der Feldlängen ein Byte, zwei Byte und drei Byte sowie eine Variable für gepackte Zahlen der Feldlänge acht Byte mit zwei Dezimalstellen deklariert. Wenn das Programmattribut Festpunktarithmetik gesetzt ist, ist der Wert von PACK 1,23.

Erzeugung von Variablen mit gebundenen Datentypen

Bisher wurde gezeigt, wie Variablen unter Bezug auf vorhandene Datentypen deklariert wurden. Es ist aber auch möglich in der DATA-Anweisung die gleichen Typkonstruktoren wie in der TYPES-Anweisung zu verwenden, um der Variablen während der Deklaration einen Datentyp zuzuweisen. Dieser Datentyp besteht dann nicht eigenständig, sondern nur als Attribut eines Datenobjekts. Der Datentyp ist an das Datenobjekt gebunden. Man kann nicht mit dem TYPE- sondern nur mit dem LIKE-Zusatz auf ihn verweisen.

Referenzen

Die Syntax für die direkte Deklaration einer Referenzvariablen entspricht der Definition eines Referenztyps mit der TYPES-Anweisung:

DATA <f> TYPE REF TO ...

Hier steht hinter dem TYPE-Zusatz kein Verweis auf einen anderen Datentyp, sondern ein sogenannter Typkonstruktor.

REF TO DATA

definiert die DATA-Anweisung ein Feld <f> mit dem Datentyp Referenz auf ein Datenobjekt. Die Referenzvariable <f> kann Referenzen (Zeiger) auf Datenobjekte also auf Instanzen von Datentypen enthalten (siehe auch Datenreferenzen).

REF TO <class>|<interface>

definiert die DATA-Anweisung ein Feld <f> mit dem Datentyp Referenz auf ein Objekt aus ABAP Objects. Die Referenzvariable <f> kann Referenzen (Zeiger) auf Instanzen der Klasse <class> oder ihrer Unterklassen bzw. von Klassen, die das Interface <interface> implementieren, enthalten. (siehe auch Behandlung von Objekten).

Strukturen

Die Syntax für die direkte Deklaration einer Variablen als Struktur entspricht der Definition eines Strukturtyps mit der TYPES-Anweisung:

DATA: BEGIN OF <structure>,
              ..............
                <fi>...,
              ..............
       END OF <structure>.

Dieser Kettensatz faßt zwischen den Anweisungen

DATA BEGIN OF <structure>. und DATA END OF <structure>.

die in den Anweisungen

DATA <fi>....

definierten Variablen <fi> zu einer Struktur zusammen. Die Anweisungsblöcke DATA BEGIN OF - DATA END OF sind wie bei der TYPES-Anweisung schachtelbar. Die einzelnen Komponenten <f i> können elementare Felder, Referenzvariablen oder durch Bezug auf bekannte komplexe Typen selber komplex sein. Da I- oder F-Felder im Arbeitspeicher bündig ausgerichtet sind (siehe Ausrichtung von Datenobjekten), kann das System bei Bedarf leere Füllfelder zwischen den Komponenten einfügen.

Die einzelnen Variablen einer Struktur werden im Programm mit einem Bindestrich zwischen Strukturname und Komponentenname benannt: <structure>-<fi>.

Beispiel

DATA: BEGIN OF address,
         name(20)    TYPE c,
         street(20)  TYPE c,
         number      TYPE p,
         postcode(5) TYPE n,
         city(20)    TYPE c,
      END OF address.

Dieses Beispiel definiert eine Struktur namens ADDRESS. Die Komponenten können durch ADDRESS-NAME, ADDRESS-STREET usw. angesprochen werden.

Interne Tabellen

Die Syntax für die direkte Deklaration einer internen Tabelle als Datentyp einer Variablen entspricht der Definition einer Tabelle mit der TYPES-Anweisung:

DATA <f> TYPE|LIKE <tabkind> OF <linetype> WITH <key>.

Hier steht hinter dem TYPE-Zusatz kein Verweis auf einen anderen Datentyp, sondern der Typkonstruktor:

<tabkind> OF <linetype> WITH <key>.

Die Variable <f> wird als interne Tabelle der Zugriffsart <tabkind>, dem Zeilentyp <linetype> und dem Schlüssel <key> deklariert. Der Zeilentyp <linetype> ist ein beliebiger bekannter Datentyp. Für ausführliche Informationen zur Definition interner Tabellen siehe Interne Tabellen.

Startwert angeben

Bei der Deklaration einer Variablen von elementarem Datentyp fixer Länge füllt die Anweisung DATA das erzeugte Datenobjekt automatisch mit dem datentypspezifischen Initialwert der Tabelle unter Eingebaute ABAP-Typen.

Der Startwert einer elementaren Variablen fixer Länge kann (auch innerhalb der Deklaration von Strukturen) mit dem Zusatz VALUE der DATA-Anweisung gefüllt werden:

DATA <f>..... VALUE <val>.

Der Startwert der Variablen <f> wird auf <val> gesetzt, wobei <val> folgendermaßen angegeben werden kann:

Im VALUE-Zusatz können keine anderen Variablen und keine Textsymbole angesprochen werden. Bei XSTRINGs, internen Tabellen und Referenzvariablen kann kein Startwert angegeben werden.

Beispiel

Beispiele zur Angabe von Startwerten:

DATA: counter TYPE p VALUE 1,
      date    TYPE d VALUE '19980601',
      flag    TYPE n VALUE IS INITIAL.

Nach dieser Datendeklaration enthält z.B. die Zeichenkette FLAG ihren typspezifischen Initialwert '0'.

Statische Variablen in Prozeduren

Variablen, die mit der Anweisung DATA deklariert werden, leben solange wie ihr Kontext. Variablen in einem ABAP-Rahmenprogramm leben also die gesamte Laufzeit des Programms und lokale Variablen in Prozeduren leben nur während dem Aufruf der Prozedur.

Um den Wert lokaler Variablen über die Laufzeit der Prozedur hinaus zu bewahren, kann man in der Prozedur Variablen mit der Anweisung STATICS deklarieren. Die Anweisung STATICS deklariert Variablen im Kontext des Rahmenprogramms der Prozedur, die aber nur innerhalb der Prozedur sichtbar sind.

Beim ersten Aufruf eines Unterprogramms oder eines Funktionsbausteins wird immer das entsprechende Rahmenprogramm in den internen Modus des Aufrufers geladen und nach Ablauf der Prozedur nicht wieder gelöscht. Deshalb bleiben mit STATICS deklarierte Variablen und ihre Werte über die Laufzeit einer Prozedur hinaus erhalten und können bei erneutem Aufruf der Prozedur wieder verwendet werden (siehe Beispiel unter Lokale Daten in Unterprogrammen).

In Methoden spielen mit STATICS definierte Variablen die Rollen von statischen Attributen, die nur in der entsprechenden Methode sichtbar sind, dies aber in allen Instanzen einer Klasse (siehe Klassen).

Die Syntax der Anweisung STATICS ist identisch zur Syntax der Anweisung DATA.

Ende des Inhaltsbereichs