Spezialindizierung

Es gibt bei der Tabellendefinition mittels der OCCURS-Klausel verschiedene Indizierungsmöglichkeiten.
Hier geht es um die sog. Spezialindizierung. Diese Spezialindizierung wird durch den INDEXED BY - Zusatz bei der Tabellendefinition mitlles OCCURS-Klausel erreicht.
Hier liegt auch schon einer der Hauptunterschiede zum Normalindex, jedenfalls von Programmiererseite aus betrachtet:
Der Spezialindex darf nicht wie andere Datenfelder (und Normalindizes) in der DATA DIVISION definiert werden sondern seine Definition erfolgt ausschließlich mit Hilfe des INDEXED BY - Zusatzes an der OCCURS-Klausel.
Intern gesehen handelt es sich bei dem Spezialindex um ein 4 Byte großes Feld, das die relative Adresse (Adresse oder 'Entfernung' von der Speicher-Startadresse) des angesprochenen Datenfeldes enthält. Diese relative Adresse errechnet sich dabei wie folgt:

Relative Adresse = (Anzahl Elemente - 1) * Elementlänge
Bei dem 5. Element mit der Länge 15 wäre somit die relative Adresse: (5-1)*15=60

Da diese Adresse somit vorhanden und nichtmehr auszurechnen ist, ist der Zugriff auf das Tabellenelement schneller.
Für das Handling mit Spezialindizes gilt eigentlich genau dasselbe wie für Normalindizes, jedoch mit der Außnahme, daß hier nicht die MOVE-Anweisung zur 'Füllung' des Index verwendet werden darf. Um einen Spezialindex mit einem Wert zu versehen, bedarf es der SET-Anweisung.
Die Spezialindizierung soll anhand eines Beispiels verdeutlicht werden:

01 Schuhbestand.
  05 Groesse OCCURS 5 TIMES INDEXED BY Gro-Index.
    10 Schuhe OCCURS 4 TIMES INDEXED BY Schuh-Index.
      15 Schuh-Groesse PIC 9(2).
      15 Schuh-Nr PIC 9(4).
      15 Schuhname PIC X(10).
      15 Schuhpreis PIC 9(3)V99.
                      :
01 Bestandliste.
  05 Bestand-Groesse PIC 9(2).
  05 Bestand-Nr PIC 9(4).
  05 Bestandname PIC X(10).
  05 Bestandpreis PIC 9(3)V99.

                      :
                      :
                      :

SET Gro-Index TO 2.
SET Schuh-Index TO 3.
                      :
MOVE Schuhe (Gro-Index, Schuh-Index) TO Bestandliste.

Hier würde die Datengruppe, bestehend aus Schuh-Groesse, Schuh-Nr, Schunahme und Schuhpreis aus der zweiten Position der ersten und der dritten Position der zweiten Dimension der Tabelle, an die Empfangsdatengruppe Bestandliste übertragen.

Wenn man einen einmal gesetzten Spezialindex im Programm nicht verändern möchte und trozdem auf ein anderes als das indizierte Feld verweisen möchte, so kann man die relative Spezialindizierung verwenden. Man gibt dabei die relative Position des gewünschten Elementes zu der Position an, auf der benutzte Spezialindex verweist. So könnte man die letzte Zeile des Beispiels so abwandeln:

                      :
                      :

SET Gro-Index TO 2.
SET Schuh-Index TO 3.
                      :
MOVE Schuhe (Gro-Index + 1, Schuh-Index - 1) TO Bestandliste.

Hier würde die Datengruppe, bestehend aus Schuh-Groesse, Schuh-Nr, Schunahme und Schuhpreis aus der dritten Position der ersten und der zweiten Position der zweiten Dimension der Tabelle, an die Empfangsdatengruppe Bestandliste übertragen.

...