Ein Datenelement, das mit der USAGE-Klausel mit INDEX-Angabe beschrieben ist, heißt Indexdatenfeld. Solch ein Datenfeld (das nicht unbedingt mit einer Tabelle verknüpft zu sein braucht) kann benutzt werden, um Werte von Indizes für eine spätere Verwendung sicherzustellen. Einem Indexdatenfeld wird durch die SET-Anweisung der Wert eines Index zugewiesen. Der Wert eines Indexdatenfeldes ist nicht die Tabellenelementnummer.
Allgemeine Regeln
Die USAGE-Klausel mit INDEX-Angabe kann auf jeder Stufe angegeben werden. Ist eine Datengruppe mit einer USAGE-Klausel mit INDEX-Angabe beschrieben, sind alle Datenelemente in der Datengruppe Indexdatenfelder, die Datengruppe selbst ist kein Indexdatenfeld.
Auf ein Indexdatenfeld kann nur in einer SEARCH- oder SET-Anweisung, einer Vergleichsbedingung, der USING-Angabe der PROCEDURE DIVISION-Überschrift oder der USING-Angabe einer CALL-Anweisung direkt Bezug genommen werden.
Ein Indexdatenfeld darf keine Bedingungsvariable sein.
Ein Indexdatenfeld kann Teil einer Datengruppe sein, auf die in einer MOVE-Anweisung oder in einer Ein-/Ausgabe-Anweisung Bezug genommen wird. Der Inhalt der Indexdatenfelder wird jedoch bei Ausführung solcher Anweisungen nicht konvertiert.
SYNCHRONIZED-, PICTURE- oder VALUE-Klauseln können zur Erklärung von Gruppen oder Datenelementen nicht verwendet werden, die mit der USAGE-Klausel mit INDEX-Angabe beschrieben sind.
Der Compiler gestattet jedoch die Anwendung der SYNCHRONIZED-Klausel mit der USAGE-Klausel mit INDEX-Angabe.
Beispiel 7-32
02 ALPHA PICTURE X(9) OCCURS 5 INDEXED BY A-NAME. ... 77 A-INDEX USAGE IS INDEX. ... SET A-NAME TO 3. ... SET A-INDEX TO A-NAME.
Hier wird das Indexdatenfeld A-INDEX auf den aktuellen Wert des Index A-NAME gesetzt, d.h. Tabellenelementnummer (3) minus 1 mal Länge des Eintrags (9) = 18.