Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

OCCURS-Klausel

&pagelevel(4)&pagelevel

Funktion

Die OCCURS-Klausel wird benutzt, um Tabellen zu definieren. In der Klausel wird angegeben, wieviele Elemente die Tabelle haben soll, d.h. wie oft ein Feld wiederholt werden soll. Alle Elemente haben dasselbe Format. Die Größe der Tabelle kann variabel sein. Außerdem
können Indizes vereinbart werden.

Format 1

gibt die genaue Anzahl der Wiederholungen eines Datenfeldes an.

Format 2

gibt eine variable Wiederholungszahl eines Datenfeldes an, die zwischen einer maximalen und einer minimalen Tabellenelementnummer liegt. Die Angabe des Minimalwertes kann entfallen.

Format 1


OCCURS ganzzahl-2 TIMES

[{ASCENDING | DESCENDING} KEY IS {datenname-2}... ] ...

[INDEXED BY {index-1}...]


Format 2


OCCURS [ganzzahl-1 TO] ganzzahl-2 TIMES DEPENDING ON datenname-1

[{ASCENDING | DESCENDING} KEY IS {datenname-2}... ] ...

[INDEXED BY {index-1}...]


Syntaxregeln für beide Formate

  1. Die OCCURS-Klausel darf in einer Datenerklärung nicht angegeben werden, falls diese

    1. eine Stufennummer 01, 66, 77 oder 88 hat, oder

    2. ein Feld mit variabler Länge beschreibt (die Länge eines Feldes ist variabel, wenn die Datenerklärung irgendeines ihm untergeordneten Feldes eine OCCURS-Klausel mit der DEPENDING-Angabe enthält).

  1. datenname-1, datenname-2,... können mit OF oder IN gekennzeichnet sein (siehe „Kennzeichnung").
  2. datenname-2 kann entweder der Datenname sein, auf den sich die OCCURS-Klausel bezieht (in diesem Fall muss er als erster angegeben sein), oder er muss der Datengruppe, auf die sich die OCCURS-Klausel bezieht, untergeordnet sein.
  3. Stimmt datenname-2 nicht mit dem Datennamen überein, auf den sich die OCCURS-Klausel bezieht, dann darf datenname-2 nicht mit einer OCCURS-Klausel erklärt sein. Er darf auch nicht einem Eintrag untergeordnet sein, der eine andere OCCURS-Klausel enthält.
  4. datenname-2 ist folgenden zusätzlichen Regeln unterworfen:
    1. Bis zu 12 Schlüsselfelder können für ein gegebenes Tabellenelement angegeben werden.

    2. Die Summe der Länge aller Schlüsselfelder, die mit einem Tabellenelement verknüpft sind, darf 256 Bytes nicht überschreiten.

    3. Die Schlüsselfelder dürfen nicht von der Klasse objekt oder zeiger sein.

  5. Die OCCURS-Klausel darf nicht zusammen mit einer IDENTIFIED-Klausel oder in einem Eintrag, der direkt einem Eintrag mit einer IDENTIFIED-Klausel untergeordnet ist, angegeben werden.

    Syntaxregeln für Format 2

  6. ganzzahl-1 muss eine positive ganze Zahl oder 0 sein.

  7. Werden ganzzahl-1 und ganzzahl-2 gemeinsam benutzt, muss ganzzahl-1 kleiner sein als ganzzahl-2.

  8. datenname-1 muss als ganzzahliges numerisches Datenfeld beschrieben sein.

  9. Wenn datenname-1 in demselben Datensatz auftritt wie die Tabelle, deren Wiederholungen er steuert, muss er vor dem variablen Teil dieses Datensatzes stehen. Das Datenfeld, das durch datenname-1 beschrieben ist, muss also vor dem Teil des Datensatzes liegen, der mit der OCCURS-Klausel mit DEPENDING ON-Angabe beschrieben ist.

  10. Wird die OCCURS-Klausel in einer Datenbeschreibung einer Datensatzbeschreibung angegeben, die die EXTERNAL- oder GLOBAL-Klausel enthält, so muss sich datenname-1, falls angegeben, auf ein Datenfeld beziehen, das in derselben DATA DIVISION als EXTERNAL bzw. GLOBAL beschrieben ist.

  11. Einer Datenerklärung, die eine OCCURS-Klausel mit DEPENDING ON-Angabe enthält, dürfen innerhalb dieser Datensatzbeschreibung nur Datenerklärungen folgen, die ihr untergeordnet sind. Der COBOL2000-Compiler lässt auch hierarchisch unabhängige Datenerklärungen zu (siehe Regel 15).

  12. Die OCCURS-Klausel darf nicht in der Satzbeschreibung einer XML-organisierten Datei angegeben werden.

  13. Ein Eintrag, der eine OCCURS-Klausel mit DEPENDING ON-Angabe enthält oder dem ein Eintrag mit einer OCCURS-Klausel mit DEPENDING ON-Angabe untergeordnet ist, darf keine REDEFINES-Klausel enthalten.

Allgemeine Regeln für beide Formate

  1. ganzzahl-2 stellt die Anzahl der Wiederholungen dar.

  2. Außer der OCCURS-Klausel selber gelten alle Datenbeschreibungsklauseln des Datenfeldes, das diese OCCURS-Klausel enthält, für jede Wiederholung des beschriebenen Datenfeldes.

  3. Der Datenname, auf den sich die OCCURS-Klausel bezieht, muss immer dann indiziert oder subskribiert werden, wenn darauf in einer Anweisung Bezug genommen wird.

    Ausnahme: SEARCH und SORT (Format 2)-Anweisung.

    Ist der Datenname Name einer Datengruppe, müssen ebenso alle Datennamen, die zu der Gruppe gehören, indiziert oder subskribiert werden, falls sie als Operanden benutzt werden.

    Ein indizierter oder subskribierter Datenname nimmt Bezug auf ein bestimmtes Tabellenelement. In der SEARCH und SORT (Format 2)-Anweisung wird mit dem Datennamen auf die gesamte Tabelle Bezug genommen.

  4. Die ASCENDING-/DESCENDING-Angabe in Verbindung mit der INDEXED BY-Angabe wird bei der Ausführung einer SEARCH ALL und SORT (Format 2)-Anweisung verwendet.

  5. Ein Index muss initialisiert werden (mit einer SET-, SEARCH ALL- oder PERFORM-Anweisung mit VARYING-Angabe), bevor er als Index benutzt wird.

  6. Mit der ASCENDING/DESCENDING KEY-Angabe wird festgelegt, ob die Elemente der Tabelle in aufsteigender (ASCENDING) oder absteigender (DESCENDING) Reihenfolge entsprechend dem Inhalt von datenname-2 sortiert sind. Dabei sind diese Datennamen in hierarchisch absteigender Reihenfolge aufzuführen. Diese Ordnung wird in der SEARCH ALL-Anweisung vorausgesetzt (der Benutzer muss in diesem Fall für die richtige Sortierung der Tabellenelemente sorgen).

  7. Mit der INDEXED BY-Angabe wird festgelegt, dass auf den Datennamen, auf den sich die OCCURS-Klausel bezieht, und auf jeden ihm untergeordneten Eintrag durch Indizierung Bezug genommen werden kann. Die Speicherzuordnung und das Format der hiermit definierten Indizes legt der Compiler automatisch fest.

  8. Jeder Index enthält einen binären Wert, der die Distanz zum Tabellenbeginn angibt und einer Tabellenelementnummer entspricht. Der Wert errechnet sich aus der Tabellenelementnummer minus eins, multipliziert mit der Länge des Eintrages, der mit dem Index indiziert ist (siehe „Indizierung").

  9. Verlangt ein Datenfeld innerhalb eines Tabellenelements eine besondere Ausrichtung, so sorgt der Compiler dafür, dass diese Ausrichtung auch für jede Wiederholung des Tabellenelements zutrifft (siehe Abschnitt „Herstellerabhängige Darstellung und Ausrichtung von Daten").

    Allgemeine Regeln für Format 2

  10. ganzzahl-1 legt die Minimal-, ganzzahl-2 die Maximalzahl der Wiederholungen fest. Der Inhalt von datenname-1 muss zwischen ganzzahl-1 und ganzzahl-2 liegen.

  11. Der aktuelle Wert von datenname-1 darf bei einem Zugriff auf die Tabelle den Wert von ganzzahl-2 nicht überschreiten.

  12. datenname-1 in der DEPENDING ON-Angabe der OCCURS-Klausel eines Datenbereichs variabler Länge muss mit einem Wert versorgt sein, bevor dieser Datenbereich in einer Übertragung als Sende- oder Empfangsfeld benutzt wird. Derselbe datenname-1 kann von Sende- und Empfangsfeld verwendet werden (siehe Beispiel 7-8).

  13. DEPENDING ON gibt an, dass das Datenfeld, das durch die OCCURS-Klausel beschrieben wird, eine variable Anzahl von Wiederholungen hat. Zur Ausführungszeit wird die Anzahl der Wiederholungen durch den Wert von datenname-1 bestimmt.

  14. Wird auf eine Datengruppe, der ein Eintrag mit einer OCCURS-Klausel mit DEPENDING ON-Angabe untergeordnet ist, Bezug genommen, wird der Teil des Tabellenfeldes in der Operation wie folgt benutzt:

    1. Ist das Datenfeld datenname-1 nicht Bestandteil der Datengruppe, wird nur der Teil des Tabellenfeldes benutzt, der bei Beginn der Operation durch den Inhalt von datenname-1 festgelegt ist.
      Sind der Datengruppe keine weiteren Einträge untergeordnet und der Inhalt von datenname-1 gleich 0, so ist die Datengruppe ein null-längiges Datenfeld.
      Sind der Datengruppe nur Einträge untergeordnet, die mit einer OCCURS-Klausel mit DEPENDING ON-Angabe definiert sind und die Inhalte von allen durch datenname-1 bezeichneten Datenfelder ist 0, so ist die Datengruppe ein null-längiges Datenfeld.

    2. Ist das Datenfeld datenname-1 Bestandteil der Datengruppe und ist das Gruppendatenfeld als Sendefeld vereinbart, wird nur der Teil des Tabellenfeldes benutzt, der bei Beginn der Operation durch den Inhalt von datenname-1 festgelegt ist. Ist die Datengruppe ein Empfangsfeld, wird die maximale Länge der Datengruppe benutzt.

  15. Die Lage jedes Datenbereichs, der innerhalb einer Datensatzerklärung Datenfeldern mit DEPENDING ON-Angabe folgt und keinem dieser Datenfelder untergeordnet ist, hängt von den aktuellen Werten von datenname-1 in den vorhergehenden DEPENDING ON-Angaben ab.

    Bei Änderung des Wertes von datenname-1 (Änderung der Tabellenlänge) verschiebt sich entsprechend die Lage dieser Datenbereiche. Ihr ursprünglicher Inhalt wird aber nicht mit verschoben (siehe Beispiel 7-8).

Vermindert man zur Programmausführungszeit den Wert von datenname-1, ist der Inhalt der Datenfelder, deren Tabellenelementnummer den neuen Wert von datenname-1 übersteigt, undefiniert.

Beispiel 7-8

Versorgung von datenname-1 in OCCURS DEPENDING ON am Beispiel einer Übertragung mit MOVE-Anweisung. Folgende Datendefinition sei gegeben:

WORKING-STORAGE SECTION.
01  A-FELD.
    02  A-ZAEHL PIC 9.
    02  A-DATEN "ABCDEFGHI".
        03  A-ZEICHEN PIC X OCCURS 1 TO 9
            DEPENDING ON A-ZAEHL.
01  B-FELD.
    02  B-ZAEHL PIC 9.
    02  B-DATEN.
        03  B-ZEICHEN PIC X OCCURS 1 TO 9
            DEPENDING ON B-ZAEHL.

Folgende Übertragungen sollen durchgeführt werden:

a) Sendefeldlänge größer als Empfangsfeldlänge


    MOVE 6 TO A-ZAEHL,
    MOVE 3 TO B-ZAEHL,
    MOVE A-FELD TO B-FELD.

Inhalt nach erfolgter Übertragung:

    ITEM-A: 6ABCDEF
    ITEM-B: 6ABCDEF

Bei MOVE A-DATEN TO B-DATEN lautet der Inhalt:

    ITEM-A: 6ABCDEF
    ITEM-B: 3ABC


b) Sendefeldlänge kleiner als Empfangsfeldlänge (Inhalt der Felder wieder wie vor Fall a))


    MOVE 3 TO A-ZAEHL,
    MOVE 6 TO B-ZAEHL,
    MOVE A-FELD TO B-FELD.

Inhalt nach erfolgter Übertragung:

    ITEM-A: 3ABC
    ITEM-B: 3ABC

Bei MOVE A-DATEN TO B-DATEN lautet der Inhalt:

    ITEM-A: 3ABC
    ITEM-B: 6ABC'BLANK''BLANK''BLANK


Die Übertragungen erfolgen nach den Regeln für alphanumerische Übertragung (siehe „MOVE-Anweisung").

Beispiel 7-9

OCCURS DEPENDING ON datenname-1

Folgende Datendefinition sei gegeben:

WORKING-STORAGE SECTION.
01  DATENSATZ.
    02  TABELLE.
        03  LAENGE   PIC 9.
        03  ELEM     PIC X OCCURS 1 TO 9
                     DEPENDING ON LEN.
    02  FELD         PIC X.


Ist 9 der aktuelle Wert von LAENGE, so ergibt sich folgende Lage der Datenfelder:

DATENSATZ

TABELLE

LAENGE

9

ELEM (1)

A


B
.
.

.
H

ELEM (9)

I

FELD

J

Nach MOVE 1 TO LAENGE

ändert sich die Tabellenlänge und damit die Lage von FELD

DATENSATZ

TABELLE

LAENGE

1

ELEM (1)

A

FELD


B


momentan unbenutzter Teil von DATENSATZ



.

.

.

H

I

J

Das Datenfeld LAENGE hat jetzt den Wert 1, das Datenfeld FELD den Wert B.