Archives de catégorie : COBOL Sommaire

4.3 LES TYPES DE DONNEES

A pour Alphabétique

Ne peut contenir que des chaînes de caractères issues des lettres “A” à “Z” ou “a” à “z” et le caractère blanc.
Un caractère occupe 1 octet en mémoire.

X pour Alphanumérique

Une chaîne de ce type peut contenir n’importe quel caractère. Un caractère occupe 1 octet en mémoire.

Dans les 2 cas :
– si le texte du value est < à la taille du Pic un complément à blanc est effectué.
– si le texte du value est > à la taille du Pic une erreur sera donnée à la compilation
– si All est utilisé le caractère sera transféré dans toutes les positions de la variable
– si Space est utilisé toute la donnée sera mise à blanc
– les données sont cadrées à gauche

9 pour Numérique

DISPLAY
BINARY
PACKED-DECIMAL

Les données numériques sont représentées par les symboles 9 S et V et selon l’usage utilisé elles seront DISPLAY BINARY ou PACKED-DECIMAL.
Les données sont cadrées à droite sur la virgulle virtuelle. Si la virgule n’est pas présente elles est supposée être à l’extrême droite. Lors d’un MOVE la donnée sera tronquée à gauche si la zone réceptrice est plus petite que la zone émettrice.
Le transfert de 1000 dans une PIC 999 donne comme résultat 000. Si la réceptrice est plus grande la donnée est complétée par des zéros à gauche.

La donnée aura :

Autant de chiffres que la description contiendra de 9.
Un signe suivant la présence ou non du S en début de la description.
Un point décimal à l’emplacement défini par V.

En mode DISPLAY

La donnée occupera autant d’octects qu’il y a de 9 et avec un maximum de 18.
Le signe est superposé au dernier chiffre, dans les 4 bits de gauche de l’octet le plus à droite.
Le point décimal V est implicite et n’occupe aucune place en mémoire.

En mode BINARY

Le signe se trouve dans le bit de gauche. Comme les variables sont binaires elles sont normalisées à 2, 4, 8 octets.

Pour Pic 9 à Pic 9999 on réserve en mémoire 2 octets :
PIC 9999 BINARY
Pour Pic 9(5) à Pic 9(9) on réserve en mémoire 4 octets
Pour Pic 9(10) à Pic 9(18) on réserve en mémoire 8 octets

En mode PACKED-DECIMAL

Ce mode caractérise les numériques en décimal condensé avec 2 chiffres par octet. Le signe se trouve dans les 4 bits de droite de l’octet le plus à droite. Ce mode est particulièrement adapté à l’écriture sur les supports externes.
La longueur en octet est calculée de la manière suivante :
(nombre de 9) / 2 + 1

Soit VARA PIC 9(7) PACKED-DECIMAL => 7/2 + 1 = 4 octets

4.4 PICTURE D’ÉDITION

Lorsque l’information est entreposée sur un support magnétique les caractères d’édition ne sont pas inclus.
Certaines fonctions d’édition doivent donc être accomplies quand ces données sont imprimées.
Ceci est accompli en utilisant des caractères d’édition dans la PICTURE des items qui doivent être imprimés.

Les fonctions d’édition les plus courantes sont :

  • Suppression des zéros non-significatifs
  • Impression du point décimal
  • Impression des virgules
  • Impression du signe de dollar
  • Impression d’astérisques en guise de protection
  • Impression d’un signe (+ ou -)

Le symbole Z est utilisé pour supprimer l’impression des zéros non-significatifs. Ce symbole peut apparaître plus d’une fois dans un PICTURE.
Le Z a le même effet que le 9, sauf qu’une valeur de 0 qui n’est pas significative est remplacée par un espace.

   01 E-ITEM PIC 9999.
   01 S-ITEM PIC ZZZ9.
   MOVE E-ITEM TO S-ITEM
             E-ITEM    S-ITEM
             0014      • • 14
             0564      • 564
             0000      • • • 0

Le symbole • est utilisé pour indiquer un point décimal. Un seul point peut apparaître dans un nombre.

01 E-ITEM PIC 999V99.
01 S-ITEM PIC 999.99.
MOVE E-ITEM TO S-ITEM
          E-ITEM     S-ITEM
          12345      123.45
          00825      008.25
          00005      000.05

01 E-ITEM PIC 999V99.
01 S-ITEM PIC ZZZ.99.
MOVE E-ITEM TO S-ITEM
          E-ITEM     S-ITEM
          12345      123.45
          00825      • • 8.25
          00005      • • • .05

L’impression d’une virgule est réalisée en plaçant le symbole , à l’endroit désiré dans le PICTURE. Il peut y avoir plus d’une virgule.

01 E-ITEM PIC 9(8)V99.
01 S-ITEM PIC 99,999,999.99.
MOVE E-ITEM TO S-ITEM
          E-ITEM       S-ITEM
          1289344506   12,893,445.06
          0000000835   00,000,008.35

Si le caractère d’édition Z est utilisé avec la virgule, il supprime l’impression des virgules qui sont suivies d’un zéro non-significatif.

01 E-ITEM PIC 9(8)V99.
01 S-ITEM PIC ZZ,ZZZ,ZZ9.99.
MOVE E-ITEM TO S-ITEM
          E-ITEM       S-ITEM
          1289344506   12,893,445.06
          0000000835   • • • • •8.35

Le symbole * est utilisé de la même façon que le Z, sauf que les zéros non-significatifs sont remplacés par des astérisques.

Pour que COBOL distingue entre un nombre positif et un nombre négatif, le programmeur doit indiquer la présence d’un signe en utilisant le symbole S.

01 E-ITEM PIC 9999.
01 S-ITEM PIC S999.

MOVE -37 TO ITEM1, ITEM2.
      ITEM1        ITEM2
      0037         -037

L’utilisation du S indique la présence d’un signe mais celui-ci ne sera pas automatiquement imprimé. Il faut pour cela utiliser le symbole +.

01 E-ITEM PIC S999.
01 S-ITEM PIC +999.
MOVE E-ITEM TO S-ITEM.
      E-ITEM        S-ITEM
      +123          +123
      -014          -014

Le symbole + peut être utilisé au début ou à la fin du PICTURE. Il peut être employé avec les autres caractères d’édition.

01 E-ITEM PIC S9(5)V99.
01 S-ITEM PIC ZZ,ZZZ.99+.
MOVE E-ITEM TO S-ITEM.
     E-ITEM        S-ITEM
     +3490500      34,905.00+
     -0150000      1,500.00 –

Si on désire que le signe ne soit imprimé que si le nombre est négatif, on peut utiliser le symbole – .

01 E-ITEM PIC S9(5)V99.
01 S-ITEM PIC -ZZ,ZZZ.99.
MOVE E-ITEM TO S-ITEM.
     E-ITEM        S-ITEM
     +3490500      34,905.00
     -0150000      - 1,500.00

4.5 SYMBOLES FLOTTANTS

Pour créer un PICTURE qui contient un symbole flottant, on remplace chaque Z par le symbole qui doit précéder le nombre ( ceux-ci peuvent être * + – Z)

01 E-ITEM PIC 9(8)V99.
01 S-ITEM PIC +++,+++,++9.99.
MOVE E-ITEM TO S-ITEM.
     E-ITEM        S-ITEM
     1289344506    +12,893,445.06
     0000000835    +8.35
     0002565700    +25,657.00

Il est à noter que le premier + – ne prend pas la place d’un caractère numérique. Donc il faut compter une position de plus afin de garder l’intégrité de la donnée.
Pour éviter qu’un signe soit imprimé sans chiffre, la clause BLANK WHEN ZERO est utilisée.

01 E-ITEM PIC S999.
01 S-ITEM PIC ++++ BLANK WHEN ZERO.
MOVE E-ITEM TO S-ITEM.
     E-ITEM      S-ITEM
     -023        • -23
     +131        +131
     000        • • • •

La clause BLANK WHEN ZERO est utilisée avec les items numériques. Si la valeur de l’item est nulle, l’item ne contient que des espaces.
La clause REDEFINES permet de définir des structures de données différentes pour une même zone de mémoire.
La clause JUSTIFIED est utilisée pour modifier la justification (cadrage) des items alphanumériques ou alphabétiques.
La clause SIGN, utilisée pour les items numériques de types DISPLAY contenant un PICTURE S, indique le mode de représentation du signe.
La clause OCCURS sert à définir un tableau.

Le mot réservé FILLER est utilisé :

  • Pour indiquer la présence dans un fichier d’entrée d’un ou plusieurs champs auxquels on ne fera pas référence.
  • Le mot FILLER peut apparaître plus d’une fois dans un programme.
  • Le mot FILLER est optionnel.

4.6 LES STRUCTURES

Pour les travaux de gestion, il est nécessaire d’attribuer un nom collectif à tout ensemble de données puis des noms collectifs à des sous-ensembles,….
En COBOL nous disposons de 2 sortes d’ensembles de données, les structures et les tables.

Une structure est un système hiérarchique de noms qui renvoie à une zone de mémoire centrale regroupant un ensemble de données.

Au premier niveau 01, se trouve le nom de la structure principale qui désigne l’ensemble des éléments de données mémorisées dans la totalité de la zone attribuée à cette structure. Ce nom ne pourra plus être utilisé pour définir une variable simple ou une autre structure ou un quelconque autre nom dans ce programme.

Au niveau 02, il est attribué de nouveaux noms à certaines portions de la zone. Ce processus se poursuit jusqu’à ce qu’au dernier niveau un seul nom désigne un seul et même élément de données appelé élément simple.

Un élément collectif de structure est appelé un groupe et est toujours de type alphanumérique.

Remarque :

Toute ligne de description d’un niveau se termine par un point, un niveau par ligne.

Le niveau 01 doit être en marge A.

Les niveau suivant de 02 à 49 sont écrits à partir de la marge B, avec indentation.

Les éléments simples sont les seuls à disposer d’une PICTURE, le mode DISPLAY étant l’option par défaut.

Si pour certaines raisons, le programme dispose de zones décrites dans une ou plusieurs structures et qui ne doivent pas être utilisées, nous pouvons utiliser l’option FILLER.

01 MADATE.
   02 ANNEE       PIC 9999.
   02 MOIS        PIC 99.
   02 JOUR        PIC 99.
01 EECOls.
   02 ARTECOls    PIC X(38).
   02 TOTECOls    PIC S9(7)V9(4).
   02 TOTDEPECOls PIC S9(7)V99.
   02 FOURNECOls  PIC X(20).
   02 NOFACECOls  PIC X(20).
   02 IMPRECOls   PIC 9 VALUE 0.
   02 MSECOls     PIC 999v99.

4.7 LES TABLES

4.7.1 Principes généraux

Une table est un groupe de données composé d’éléments simples ayant tous des attributs identiques. Les tables sont utilisées pour mettre en mémoire un certain nombre d’informations dans le but de pouvoir les retrouver plus facilement.
Par exemple : trouver le prix de vente d’un article connaissant son code, trouver le nom d’un employé en fonction de son matricule.
La taille d’un tableau n’est pas illimitée, les contraintes viennent du type d’ordinateur utilisé sur PC OCCURS 1300 et il faut encore tenir compte des longueurs des variables utilisées.
(PRUDENCE).
La recherche d’un élément en table se fait en affectant un numéro d’ordre à chaque élément de la table. Ce numéro d’ordre est appelé INDICE.

Exemple :

01 TABLE.
   02 QUANTITE OCCURS 5 PIC 999

Ce qui représente une table à 1 dimension de 5 éléments de 3 caractères numériques.

Quantité 1Quantité 2Quantité 3Quantité 4Quantité 5

La quantité 4 de la table sera désignée par l’expression QUANTITE(4), et si nous désirons ajouter un nombre QACHAT à la quantité 2, nous devons écrire : ADD QACHAT TO QUANTITE (2).

01 PAYS.
   02 Province OCCURS 10 TIMES.
      03 SalesValue PIC 9(8)V99.
      03 NumSold    PIC 9(7).

4.7.2 Utilisation des indices

L’indice peut être utilisé sous forme d’un nombre ou d’une variable.

Sous forme de nombre : on écrit QUANTITE (3) pour atteindre à chaque fois l’élément 3.

Sous forme de variable : on lira par exemple l’indice N qui peut avoir les valeurs 1 à 5 puis la quantité est atteinte en écrivant QUANTITE (N).

Comme toute variable, l’indice doit être déclaré en DATA-DIVISION.
Il peut être tout simplement une zone de fichier entrée qui sert occasionnellement d’indice.

Remarque : la parenthèse gauche doit toujours être précédée par un espace à gauche, mais pas la parenthèse droite.

4.7.3 Tables à plusieurs indices

Cobol autorise des tables à 3 indices. Dans l’exemple suivant, on recherche les points d’un examen de math en deuxième année d’un étudiant d’info.

01 TABLE-ETUDIANT.
   02 LANNEE OCCURS 3.
      03 CODE-ETUDIANT OCCURS 55.
         04 LABRANCHE OCCURS 15 PIC 99.

L’ensemble des points par étudiant se retrouve dans TABLE-ETUDIANT, il s’agit d’une suite continue de caractères numériques. Il n’autorise pas l’usage d’un indice.

LANNEE, spécifie si les points recherchés sont ceux d’un étudiant de première, seconde ou troisième année. L’utilisation de LANNEE (2) nous donne une longue série de chiffres qui correspond à 55 x 15 càd les 15 résultats des 55 étudiants de seconde.
Cette zone autorise l’usage d’un indice et d’un seul.

CODE-ETUDIANT, donne pour un étudiant d’une année l’ensemble des points obtenus pour cette année la. L’utilisation de CODE-ETUDIANT (2, 17) nous donne une série de 15 chiffres de 2 caractères, cette série représente pour l’étudiant n° 17 de seconde année l’ensemble des points
obtenus. Cette zone autorise l’usage de 2 indices et de toujours 2 indices.

LABRANCHE, donne pour un étudiant d’une année les points obtenus dans une branche.
L’utilisation de LABRANCHE (2, 17, 4) nous donne les points de la quatrième matière de l’étudiant n° 17 de 2ème année , il s’agit d’un nombre de 2 positions en PIC 99. Cette zone autorise l’usage de 3
indices et de toujours 3 indices.

Les points du premier examen du deuxième étudiant de troisième année s’écrira :
         LABRANCHE (3, 2, 1)

Pour déplacer l’ensemble des points de l’étudiant 5 de première année on écrira :
         CODE-ETUDIANT (1, 5)

Pour déplacer l’ensemble des points des étudiants de première année on écrira :
         LANNEE (1)

4.7.4 La clause OCCURS

OCCURS n TIMES, spécifie qu’un groupe ou un élément se reproduit n fois. Dans notre exemple nous avions considéré 3 années de 55 étudiants ayant au maximum 15 banches. Cette clause ne peut pas s’écrire à un niveau 1. Pour définir une table à plusieurs niveaux, chaque OCCURS doit être de niveau inférieur sans quoi on obtient plusieurs tables à 1 niveau.
Le mot TIMES est facultatif.

Une clause VALUE spécifiée pour un OCCURS initialise chaque position à cette valeur.

Pour initialiser une table à des valeurs différentes on doit utiliser la clause REDEFINES sous la forme suivante :

01 ENSEMBLE.
   02 FILLER PIC X(9) VALUE "JANVIER".
   02 FILLER PIC X(9) VALUE "FEVRIER".
   02 FILLER PIC X(9) VALUE "MARS".
   02 FILLER PIC X(9) VALUE "AVRIL".
   02 FILLER PIC X(9) VALUE "MAI".
   02 FILLER PIC X(9) VALUE "JUIN".
   02 FILLER PIC X(9) VALUE "JUILLET".
   02 FILLER PIC X(9) VALUE "AOUT".
   02 FILLER PIC X(9) VALUE "SEPTEMBRE".
   02 FILLER PIC X(9) VALUE "OCTOBRE".
   02 FILLER PIC X(9) VALUE "NOVEMBRE".
   02 FILLER PIC X(9) VALUE "DECEMBRE".

01 TABLE-MOIS REDEFINES ENSEMBLE.
   02 MOIS OCCURS 12 PIC X(
9).

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.

16. LA LINKAGE SECTION

Le programme principal et le sous-programme COBOL étant compilés séparément, il est nécessaire que la description des zones de données communes apparaisse dans les DATA DIVISION respectives des programmes.

Mais il est exclu de réserver 2 fois ces zones en mémoire centrale, c’est pourquoi une LINKAGE SECTION a été créée en DATA DIVISION.

Une zone de données commune “TRANSFERT” sera donc décrite normalement dans le programme principal soit en FILE SECTION soit en WORKING-STORAGE SECTION, et sa correspondance dans le sous-programme en LINKAGE SECTION.

L’ordre d’appel de sous-programmes CALL, aura donc pour effet d’attribuer les mêmes adresses mémoire à ces deux zones de données.

Remarque : rien n’oblige le programmeur à utiliser des descriptions de zones rigoureusement identiques entre le programme principal et le sous-programme. Les noms ne doivent pas être les mêmes ainsi que les descriptions de données.

La terminaison d’un sous-programme :

Dans un sous-programme, la terminaison est réalisée par GOBACK.

15. LES SOUS-PROGRAMMES EXTERNES

Le branchement du traitement depuis le programme principal COBOL vers les sous-programmes est réalisé par l’instruction CALL.

CALL 'Nom du sous programme' USING nom de donnée1 …

CALL 'Nom du point d'entrée' USING nom de donnée1 …


‘Nom du sous programme’ : désigne le nom du sous-programme appelé, nom doit être de maximum 8 caractères de long.

‘Nom du point d’entrée’ : désigne une adresse d’entrée dans un sous-programme, son nom doit être différent de celui du sous-programme et doit correspondre à un ENTRY.

Exemple :
CALL "SOUSPROG" USING ZON1 ZON2.
CALL "ENTREE" USING ZON1

LE SOUS-PROGRAMME COBOL

Le sous-programme en COBOL est construit comme tout programme COBOL avec ses 4 Divisions.
La différence avec le programme principal réside dans l’introduction de clauses USING et de la LINKAGE SECTION nécessaire à l’établissement d’une liaison entre les variables du programme principal et du sous-programme.

Cette correspondance est établie au moyen du USING (sous-programme) et du CALL (programme).

La clause USING dans le sous-programme :

PROCEDURE DIVISION USING nom-de-donnée-1 nom-de-donnée-2 …

Au moment de l’appel du sous-programme la correspondance entre les nom-de-donnée-1, nom-dedonnée-2 … est établie et le sous-programme démarre en utilisant les valeurs transférées par le programme principal.

Si l’entièreté du sous-programme ne doit pas être utilisée, nous disposons d’une option ENTRY pour indiquer au sous-programme l’endroit ou le sous-programme doit débuter.

Format :
ENTRY "nom-symbolique" USING nom-donnée-1 nom-donnée-2

Le même système opératoire sera activé et les nom-donnée-1 nom-donnée-2… seront mis en correspondance.

14. LES DECLARATIVES

Cobol a prévu un traitement particuliers en cas d’erreurs des E/S sur les fichiers. Ces traitements doivent être réalisés sous forme de séquences indépendantes regroupées dans une section de la PROCEDURE DIVISION sous le nom de DECLARATIVES.

Les DECLARATIVES sont importantes dans le cas où le programmeur n’aurait pas prévu de traitement dans le cas des erreurs d’E/S. En effet le système d’exploitation de l’ordinateur mettra fin à l’exécution du programme.

Forme générale :

PROCEDURE DIVISION.
DECLARATIVES.
Nom-de-section SECTION. USE ………….
Nom-de-paragraphe.
      Instructions Cobol
END DECLARATIVES.

Les DECLARATIVES commencent toujours par le mot DECLARATIVES, immédiatement après PROCEDURE DIVISION, sont toujours dans une SECTION et se terminent toujours par END DECLARATIVES.

FORMAT :

Si nom-de-fichier est spécifié les DECLARATIVES ne s’appliquent que pour ce ou ces fichiers.

INPUT indique que la section DECLARATIVES sera utilisée pour tous les fichiers ouverts en lecture.

OUTPUT indique que la section DECLARATIVES sera utilisée pour tous les fichiers ouverts en écriture.

I-O indique que la section DECLARATIVES sera utilisée pour tous les fichiers ouverts en lecture et en écriture.

L’instruction USE indique que le branchement n’a lieu qu’après que les routines du système d’exploitation aient été effectuées.

L’option AFTER peut être remplacée par BEFORE.

13. L’INSTRUCTION SET

Syntaxe de l’instruction SET :

SET

Un nombre entier est un entier numérique > 0 et non signé.
Les index-names sont définis par des clauses INDEXED BY.

Cette instruction signifie :

METTRE nom-index-1 A LA VALEUR CORRESPONDANT A index-name-3 avec le numéro d’occurrence nombre entier

Nombre entier représente un numéro d’occurrence de l’élément qu’on désire repérer.

Exemple : SET INDEX1 TO 5, signifie que nous voulons utiliser le 5ème élément de la table. Ce n’est pas la valeur 5 que nous retrouverons dans INDEX1 mais l’adresse correspondant au déplacement de l’élément par rapport au début de la table.
Lorsque index-name-3 est utilisé, il a ajustement de index-name-1 index-name-2 … sur indexname-3 et COBOL traduit le contenu de index-name-3 en occurrence avant de calculer les valeurs de index-1 index-2.

   01 TABLE.
      02 T1 OCCURS 20 INDEXED BY IND1.
         03 T2 OCCURS 30 INDEXED BY IND2.
            04 T3 OCCURS 40 INDEXED BY IND3 PIC 9.

Pour utiliser T3 (5,6,5),    SET IND3 TO 5
                      SET IND1 TO IND3
                      SET IND2 TO 6

Format 2 :

Cette instruction permet avec UP BY d’augmenter ou de diminuer DOWN BY la valeur de indexname-1 et de index-name-2 d’une valeur de nombre ou de index-3. INDEX-3 ne doit pas appartenir à la table de index-1 ou index-2 car le COBOL traduit sa valeur en nombre d’occurrences.

Il est à prévoir que durant l’exécution du programme nous devions retenir une valeur particulière d’index. Dans ce cas nous serons amenés à déclarer une zone particulière d’usage réservé aux INDEX.

01 INDEX-DE-RESERVE USAGE IS INDEX.

Cette clause est utilisée à n’importe quel niveau en DATA DIVISION. Il ne sera pas fait usage de la clause PICTURE puisque cette donnée contiendra une adresse pour notre index.
Lorsque cette clause est spécifiée pour un groupe, ce sont toutes les zones élémentaires du groupe qui sont considérées comme d’usage index.

Pour sauvegarder la valeur de IND2 :
SET INDEX-DE-RESERVE TO IND2

Pour lui retourner sa valeur plus tard :
SET IND2 TO INDEX-DE-RESERVE