Show TOC Anfang des Inhaltsbereichs

Lokale Daten des Unterprogramms  Dokument im Navigationsbaum lokalisieren

Datendeklarationen in Prozeduren erzeugen lokale Datentypen und -objekte, die nur in der Prozedur sichtbar sind. Wir unterscheiden zwischen dynamischen Datentypen und -objekten, die nur während der Ausführung des Unterprogramms existieren, und statischen Datenobjekten, die über den Aufruf eines Unterprogramms hinaus existieren und ihren Wert bis zum nächsten Aufruf des gleichen Unterprogramms behalten. Auch Feldsymbole können lokal deklariert werden. Eine besondere Art von Datenobjekten in Unterprogrammen sind Kopien von globalen Daten auf einem lokalen Datenstack. Sie werden über Feldsymbole definiert und angesprochen.

Dynamische lokale Datentypen und -objekte

Lokale Datentypen und Datenobjekte die innerhalb von Unterprogrammen mit TYPES und DATA deklariert werden, werden für jeden Unterprogrammaufruf neu definiert und nach dem Verlassen des Unterprogramms wieder gelöscht.

Jedes Unterprogramm hat seinen eigenen lokalen Namensraum. Wird ein lokaler Datentyp oder ein lokales Datenobjekt mit dem gleichen Namen wie ein globaler Datentyp oder ein globales Datenobjekt deklariert, ist der globale Datentyp oder das globale Datenobjekt innerhalb des Unterprogramms nicht ansprechbar. Lokale Datentypen oder Datenobjekte verbergen gleichnamige globale Datentypen oder -objekte. Mit anderen Worten, wird der Name eines Datentyps oder -objekts im Unterprogramm verwendet, wird, falls vorhanden, immer ein lokal deklariertes Objekt angesprochen, ansonsten ein global deklariertes. Um zu verhindern, dass globale Datentypen oder -objekte verborgen werden, müssen lokalen Typen und Objekten andere Namen zugewiesen werden. Z.B. könnten alle lokalen Namen in Unterprogrammen mit 'F_' beginnen.

Beispiel

REPORT demo_mod_tech_data_types .

TYPES word(10) TYPE c.
DATA  text TYPE word.

text = '1234567890'. WRITE / text.

PERFORM datatest.

WRITE / text.

FORM datatest.
  TYPES word(5) TYPE c.
  DATA  text TYPE word.
  text = 'ABCDEFGHJK'.
WRITE / text.
ENDFORM.

Nach der Ausführung sieht die Ausgabe so aus:

1234567890

ABCDE

1234567890

In diesem Beispiel werden ein globaler Datentyp word und ein globales Datenobjekt text mit dem Typ word im Hauptprogramm deklariert. Nachdem text ein Wert  zugewiesen und auf der Liste ausgegeben wurde, wird das Unterprogramm datatest aufgerufen. Innerhalb des Unterprogramms ist ein lokaler Datentyp word und ein lokaler Datenobjekt text mit dem Typ word lokal deklariert. Sie verbergen den globalen Typ und das globale Objekt. Erst nach dem Verlassen des Unterprogramms gelten wieder die globalen Definitionen.

Statische lokale Datenobjekte

Um den Wert eines lokalen Datenobjekts nach dem Verlassen des Unterprogramms zu bewahren, muss die Anweisung STATICS anstatt DATA für die Deklaration des lokalen Datenobjekts verwendet werden. STATICS deklariert ein global definiertes Datenobjekt, das jedoch nur lokal von dem Unterprogramm aus sichtbar ist, in dem es definiert wurde.

Beispiel

REPORT demo_mod_tech_statics.

PERFORM datatest1.
PERFORM datatest1.

SKIP.

PERFORM datatest2.
PERFORM datatest2.

FORM datatest1.
  TYPES f_word(5) TYPE c.
  DATA  f_text TYPE f_word VALUE 'INIT'.
  WRITE f_text.
  f_text = '12345'.
  WRITE f_text.
ENDFORM.

FORM datatest2.
  TYPES    f_word(5) TYPE c.
  STATICS  f_text TYPE f_word VALUE 'INIT'.
  WRITE f_text.
  f_text = 'ABCDE'.
  WRITE f_text.
ENDFORM.

Nach der Ausführung sieht die Ausgabe so aus:

INIT  12345 INIT  12345

INIT  ABCDE ABCDE ABCDE

In diesem Beispiel werden die beiden ähnlichen Unterprogramme datatest1 und datatest2 definiert. In datatest2 wird STATICS anstatt DATA zur Deklaration des Datenobjekts f_text verwendet. Bei jedem Aufruf von datatest1 wird f_text  neu initialisiert, behält jedoch seinen Wert in datatest2. Der Zusatz VALUE der Anweisung STATICS funktioniert nur während des ersten Aufrufs von datatest2.

Lokale Feldsymbole

Alle in Unterprogrammen mit der Anweisung FIELD-SYMBOLS deklarierten Feldsymbole sind lokal. Für lokale Feldsymbole gelten folgende Regeln:

·        Lokale Feldsymbole können außerhalb des Unterprogramms nicht angesprochen werden.

·        Bei jedem Aufruf des Unterprogramms ist einem lokalen Feldsymbol kein Feld zugewiesen, auch dann nicht, wenn im letzten Durchlauf ein ASSIGN ausgeführt wurde.

·        Lokale Feldsymbole können die gleichen Namen haben wie global deklarierte Feldsymbole. Lokale Feldsymbole verbergen globale Feldsymbole.

·        Feldsymbole mit aufgeprägten Strukturen können ebenfalls lokal sein. Sie können lokale Strukturen haben und ihnen können lokale Felder zugewiesen werden.

Lokale Kopien globaler Felder

In einem Unterprogramm können lokale Kopien globaler Daten auf dem lokalen Datenstack des Unterprogramms angelegt werden. Man verwendet hierzu lokale Feldsymbole und folgende Variante der ASSIGN-Anweisung:

ASSIGN LOCAL COPY OF field TO <fs>.

Das System stellt eine Kopie des globalen Felds field auf den Stack. Innerhalb des Unterprogramms kann man durch Ansprechen des Feldsymbols <fs> auf diese Kopie zugreifen und sie ändern, ohne das globale Feld zu ändern.

Der Zusatz LOCAL COPY OF kann mit allen Varianten der ASSIGN-Anweisung außer ASSIGN COMPONENT verwendet werden.

Weitere Varianten der ASSIGN-Anweisung zum Gebrauch in Unterprogrammen sind:

ASSIGN LOCAL COPY OF INITIAL field  TO <fs>.

Diese Anweisung legt eine initiale Kopie des globalen Felds field auf den Stack ohne die Feldinhalte zu transportieren.

ASSIGN LOCAL COPY OF INITIAL LINE OF itab TO <fs>.

Diese Anweisung legt eine initiale Kopie der Zeilen einer globalen internen Tabelle itab auf den Stack.

ASSIGN LOCAL COPY OF INITIAL LINE OF (field) TO <fs>.

Diese Anweisung legt eine initiale Kopie der Zeilen einer globalen internen Tabelle itab auf den Stack. Die interne Tabelle wird dynamisch als Inhalt des Felds field angegeben.

Beispiel

REPORT demo_mod_tech_assign_local_cop.

DATA text(5) TYPE c VALUE 'Text1'.

PERFORM routine.

WRITE text.

FORM routine.
  FIELD-SYMBOLS <fs> TYPE ANY.
  ASSIGN LOCAL COPY OF text TO <fs>.
  WRITE <fs>.
  <fs> = 'Text2'.
  WRITE <fs>.
  ASSIGN text TO <fs>.
  
WRITE <fs>.
  <fs> = 'Text3'.
ENDFORM.

Die Listenausgabe ist:

Text1 Text2 Text1 Text3

Durch Zuweisung des Felds text zum lokalen Feldsymbol <fs> im Unterprogramm routine wird eine Kopie von text auf den lokalen Datenstack gestellt. Durch Ansprechen von <fs> kann diese Kopie gelesen und geändert werden. Das globale Feld text ist von den Operationen auf der lokalen Kopie nicht betroffen. Nach der Zuweisung des Felds an das Feldsymbol ohne den Zusatz LOCAL COPY OF, zeigt das Feldsymbol direkt auf das globale Feld und Operationen mit dem Feldsymbol werden auf dem globalen Feld durchgeführt.

 

 

Ende des Inhaltsbereichs