4.8 INDEXATION

L’utilisation des tables est inchangée, mais l’accès mémoire est plus rapide, certaines instructions de recherche peuvent être utilisées ce qui facilite la programmation.
Dans ce cas les indices utilisés sont des données spéciales appelées INDEX (représentation de l’indexation). Ceux-ci doivent être définis par la clause INDEXED BY des clauses OCCURS.

Description d’une table :

01 TABLE.
   02 INFO OCCURS 10 INDEXED BY J PIC X(33).

Utilisation :

MOVE "Ceci est un test " TO INFO (J).
MOVE "Ceci est un test " TO INFO (J + 3).

Remarque :

Les INDEX ne peuvent être modifiés ou initialisés que par PERFORM ou par l’instruction SET.
L’index qui définit un OCCURS doit toujours être utilisé avec le nom de son OCCURS dans notre cas J et INFO.
Une opération + ou – dans la parenthèse peut être réalisée, ce qui donne une indexation relative.
L’entier utilisé doit être > 0 et non signé, le signe doit être précédé et suivi d’un blanc.
On ne peut pas mélanger les INDICES et les INDEX.

Exemple :

01 TABLE.
   02 PCODE OCCURS 3 TIMES INDEXED BY PAR.
   03 ACODE OCCURS 3 TIMES INDEXED BY AGE.
   04 MF OCCURS 2 TIMES INDEXED BY F PIC 9999 USAGE DISPLAY.

La table est de dimension (3, 3, 2) et référencée par MF (PAR, AGE + 2, F – 1)

La clause OCCURS dans le cas des INDEX

Format 1 :

               | ASCENDING  |
OCCURS n TIMES |            |KEY is nom-de-donnée-a, …
               | DESCENDING |
         INDEXED BY nom-index.

Format 2 :

OCCURS n TO m TIMES [DEPENDING ON nom-de-donnée1]
    | ASCENDING  |KEY is nom-de-donnée2, nom-de-donnée3,…
    | DESCENDING |
         INDEXED BY nom-index.

La clause ASCENDING ou DESCENDING spécifie l’argument de classement de la table de manière à préparer les recherches futures par l’instruction SEARCH.

01 TABLE.
   02 ELEMENT OCCURS 100 ASCENDING KEY COD.
      04 COD    PIC XX.
      04 VALEUR PIC S9999 BINARY

Ce qui signifie que le programmeur rangera les différentes informations de la table dans l’ordre croissant du COD. Il peut y avoir un maximum de 12 arguments de classement. Il est bien entendu que la valeur du classement ne peut dépendre que d’une variable incluse au tableau.

Exemples

Mise à zéro d’une table à 2 dimensions.

Soit une table de 30 lignes et 30 colonnes. Chaque élément est numérique entier de 4 de long en display. On demande d’initialiser le tableau à 1.

WORKING-STORAGE SECTION.
01 TABLE.
   02 LIGNES OCCURS 30.
      05 COLON OCCURS 30.
         10 ELEMENT PIC 9999.
01 I    PIC 99 VALUE 0.
01 J    PIC 99 VALUE 0.

PROCEDURE DIVISION.
DEB.
     PERFORM VARYING I FROM 1 BY 1 UNTIL I > 30
               AFTER J FROM 1 BY 1 UNTIL J > 30
               MOVE 1 TO ELEMENT (I, J)
     END-PERFORM.

Soit une table de 30 lignes et 30 colonnes.
Chaque élément du tableau est formé d’une zone numérique entière de 4 de long en display et d’une zone alphanumérique de 20 caractères.
On demande d’initialiser les numériques à 5 et les alphanumériques à blancs.

WORKING-STORAGE SECTION.
01 TABLE.
   02 LIGNES OCCURS 30.
      05 COLON OCCURS 30.
         10 ELEMENT PIC 9999.

         10 CARACTER PIC X(20).

01 I    PIC 99 VALUE 0.
01 J    PIC 99 VALUE 0.

PROCEDURE DIVISION.
DEB.
     PERFORM VARYING I FROM 1 BY 1 UNTIL I > 30
               AFTER J FROM 1 BY 1 UNTIL J > 30
               MOVE SPACE TO CARACTER(I, J)

               MOVE 5 TO ELEMENT (I, J)

     END-PERFORM.

Soit le vecteur

01 VECT.
   03 A PIC XXX OCCURS 4.
   03 B PIC XXX OCCURS 4.

Et le vecteur

01 VECT2.
   03 A OCCURS 4.
      05 B OCCURS 4 PIC XXX.

Le premier vecteur représente 2 petits tableaux séparés à 1 dimension de 4 éléments chacun.
Le second correspond à 1 tableau à 2 dimensions de 4 lignes de 4 colonnes chacune.