Die OCCURS-Klausel

Die OCCURS-Klausel verwendet man für die mehrfache Definition von Datenfeldern in einer Tabelle.
Man darf diese Klausel überall in der DATA DIVISION verwenden. "Nach ANSI Standard COBOL ist die OCCURS-Klausel nur auf den Stufennummern 02-49 erlaubt; COBOL/2 erlaubt jedoch die Definition dieser Klausel auf der Stufennummer 01."*

Zum Thema OCCURS nach ANSI bzw. COBOL/2:
Habib* schreibt zur Verwendung der OCCURS-Klausel:
"Nach ANSI Standard COBOL darf die OCCURS-Klausel innerhalb einer Struktur nur siebenmal auf unterschiedlichen Stufennummern codiert werden. Dies bedeutet, daß eine Tabelle maximal dreifach dimensioniert werden kann. COBOL/2 erlaubt jedoch die Definition einer Tabelle mit bis zu 16 Dimensionen."
Wie Habib dabei von den sieben unterschiedlichen Stufennummern auf drei Dimensionen kommt, ist mir nie so recht klar geworden.
Bei Schwanke** heißt es dem entsprechend auch:
"Eine Tabelle kann in älteren Cobol-Versionen mit maximal 3 OCCURS-Eintragungen definiert werden. Man spricht dann von einer dreidimensionalen Tabelle. In Cobol-85 kann eine Tabelle mit maximal 7 Dimensionen definiert werden. MF-Cobol erlaubt 16 Dimensionen."

Nehmen wir an, wir wollten eine Tabelle für 4 Schuhnahen der Größe 41 anlegen. Die Definition der Tabelle würde dann lauten:

01 Schuhe-41.
   05 Schuhnamen PIC X(10) OCCURS 4 TIMES.

Bei dem Wort TIMES handelt es sich um ein Wahlwort und muß daher nicht angegeben werden. Über den Tabellenindex können die so erzeugten Datenfelder der Tabelle dann direkt angesprochen werden. So kann man die Tabelle mit Hilfe der MOVE-Anweisung und des entsprechenden Index füllen:

MOVE "Bali" TO Schuhnamen (1).
MOVE "Armani" TO Schuhnamen (2).
MOVE "Alpenland" TO Schuhnamen (3).
MOVE "Toscana" TO Schuhnamen (4).

Die in Klammern angegebene Zahl nennt man Index. Dieser Index zeigt auf das entsprechende Datenfeld innerhalb der Tabelle. Um auf ein Tabellenfeld zugreifen zu können, bedarf es also der sog. Indizierung. Man unterscheidet dabei zwischen der Normal- und der Spezialindizierung.

In Cobol ist es möglich, ganze Datenstrukturen in ein Tabellenfeld zu legen. So könnte man unsere Schuhe beispielsweise noch mit einer Nummer und dem Preis versehen. Die Definition sähe dann folgendermaßen aus:

01 Schuhtabelle-41.
  05 Schuhe OCCURS 4 TIMES.
    10 Schuh-Nr PIC 9(4).
    10 Schuhname PIC X(10).
    10 Schuhpreis PIC 9(3)V99.

Die daraus resultierende Tabelle könnte nach ihrer 'Füllung' beispielsweise so aussehen:

Schuhe(1) 3825 Bali 122,98
Schuhe(2) 7296 Armani 278,60
Schuhe(3) 1828 Alpenland 103,98
Schuhe(4) 4471 Toscana 079,98

Möchte ich nun beispielsweise den Preis des Modells 'Toscana' in die Variable 'Ergebnis' überführen, so würde die Anweisung lauten:

MOVE Schuhpreis (4) TO Ergebnis.

Das gleiche Ergebnis würde man übrigens erhalten, wenn man den Index bzw. Subscript durch eine Variable ersetzen würde:

MOVE 4 TO Schuhindex.
MOVE Schuhpreis (Schuhindex) TO Ergebnis.

Das ist besonders für die Verarbeitung innerhalb einer Schleife nützlich.

Die OCCURS-Klausel wird natürlich genauso angewendet, wenn es sich um mehrdimensionale Tabellen handelt. Um bei dem Beispiel des Schuhregals (2 Dimensionen) zu bleiben, würde man die Definition der Tabelle (5 verschiedenen Größen und 4 verschiedene Arten) wie folgt codieren:

01 Schuhbestand.
  05 Groesse OCCURS 5 TIMES.
    10 Schuhe OCCURS 4 TIMES.
      15 Schuh-Groesse PIC 9(2).
      15 Schuh-Nr PIC 9(4).
      15 Schuhname PIC X(10).
      15 Schuhpreis PIC 9(3)V99.

Pro Eintrag werden 21 Bytes (2+4+10+5) belegt und das Ganze 20 (4*5) mal. Die Tabelle hätte folglich eine Größe von 420 Bytes. An der Stelle 'Schuhe (2, 3)' wäre dann ein Eintrag zu finden wie z.B.:

41 7294 Armani 278,60


Die OCCURS-Klausel kann noch mit folgenden Zusätzen versehen werden:

Der INDEXED BY - Zusatz
Der DEPENING ON - Zusatz
Der ASCENDING/DESCENDING KEY-Zusatz


Zur Initialisierung von Tabellen empfiehlt sich die INITIALIZE-Anweisung.



*Raouf Habib; COBOL/2 Workbench 2. Aufl. 1995; IWT Verlag GmbH
** Helmut Schwanke; Insider COBOL 6. Aufl. 1999; Markt & Technik Verlag GmbH


...