Tous les articles par Mr COBOL

7. SCREEN SECTION

Cette section (SCREEN SECTION) sert (selon la version du compilateur utilisé) à créer un dessin d’écran.

Sa forme générale est :

nombre niveau nom-écran AUTO SECURE REQUIRED FULL.

Le nombre niveau doit être un entier compris entre 01 et 49.

Le format au niveau d’un écran élémentaire est :

Nombre-niveau

BLANK SCREEN                          vide l'écran
LINE NUMBER IS entier-1
COLUMN NUMBER IS entier-2
BELL                                  sonnerie
UNDERLINE
REVERSE-VIDEO
HIGHLIGHT
FOREGROUND-COLOR entier-3
BACKGROUND-COLOR entier-4
VALUE is litéral                      affiche le litéral
PIC IS description
      FROM            |
      TO              |               Identifier
      USING           |
JUSTIFIED
AUTO
SECURE
REQUIRED
FULL.

Remarques:

La longueur maximum pour un élément de l’écran est de 80 caractères.

AUTO : passe automatiquement au champs suivant lorsque celui en cours est rempli.

SECURE : met des * dans le champs lors de l’encodage, c’est une sécurité pour le mot de passe.

REQUIRED : une réponse non vide est exigée.

FULL : la zone doit être remplie pour la lecture, son usage permet l’utilisation des tabulations.

PICTURE : oblige l’usage d’un USING, TO ou FROM.

BLANK SCREEN : met tout l’écran à blanc et le curseur est mis en position 1.

Les codes couleurs sont :
– 0 : noir
– 1 : bleu
– 2 : vert
– 3 : cyan
– 4 : rouge
– 5 : magenta
– 6 : brun
– 7 : blanc
– 8 : gris
– 9 : bleu clair
– 10 : vert clair

VALUE is litéral spécifie une chaîne de caractères qui doit être écrite lors du DISPLAY de cet écran. Ce litéral doit être entre quotes et n’est pas imprimé lors d’un ACCEPT de l’écran.
VALUE est incompatible avec PICTURE.

PICTURE spécifie le format de présentation de la donnée. Durant un DISPLAY le contenu du FROM ou du USING est transféré dans une variable temporaire. (JAMAIS DE VARIABLES INDICEES)

LINE et COLUMN donnent la position du curseur.

FOREGROUND et BACKGROUND-COLOR donnent la couleur des caractères et du fond.

Exemple :

SCREEN SECTION.
01 ECRAN1.
   02 BLANK SCREEN BACKGROUND-COLOR 1.
   02 LINE 5 COL 15 PIC X(10) TO PSW SECURE BELL AUTO.
   02 LINE 10 COL 10 VALUE "VOTRE MOT DE PASSE".
   02 LINE 15 COL 20 PIC X(25) TO NOM.
   02 LINE 20 COL 11 VALUE "VOTRE NOM".

PROCEDURE DIVISION.
DEBUT.
    DISPLAY ECRAN1.
    ACCEPT ECRAN1.

Pour envoyer une image écran on utilise le DISPLAY, pour prendre les informations encodées sur l’écran on utilise l’ACCEPT.

Affichage     : DISPLAY
Saisie             : ACCEPT
FROM           : On affiche à partir d ’une zone de données.
TO                   : On reçoit pour une zone de données.
USING          : On affiche et reçoit en utilisant une zone de données

IDENTIFICATION DIVISION.
PROGRAM-ID. Program1.
AUTHOR. jean-marie meskens.
DATE-WRITTEN. vendredi 1 septembre 2006 8:18:52.
REMARKS.

ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.

  DECIMAL-POINT IS COMMA.

INPUT-OUTPUT SECTION.
FILE-CONTROL.

DATA DIVISION.
WORKING-STORAGE SECTION.
77 ch1       PIC 99.
77 ch2       PIC 99.
77 somme     PIC 999.
SCREEN SECTION.
01 ecran-entree.
  05 BLANK SCREEN.
  05 LINE-1.
    10 LINE 1 COLUMN 10 VALUE 'Entrez un chiffre : '.
    10 LINE 1 COLUMN 40 PIC 99 TO ch1.
  05 LINE-2.
    10 LINE 2 COLUMN 10 VALUE 'Un autre chiffre SVP : '.
    10 LINE 2 COLUMN 40 PIC 99 TO ch2.
01 ecran-sortie.
  05 LINE-4.
    10 LINE 4 COLUMN 10 VALUE 'Voici la somme : '.
    10 LINE 4 COLUMN 40 PIC ZZZ using somme.
PROCEDURE DIVISION.
DEB.
   MOVE ZEROS TO ch1, ch2, somme.
   DISPLAY ecran-entree.
   ACCEPT ecran-entree.
   ADD ch1 to ch2 GIVING somme.
   DISPLAY ecran-sortie.
   accept Ecran-Sortie.
   STOP RUN.

6. REDEFINES

Pour les besoins de certains traitements, il est parfois important de pouvoir spécifier des groupages différents dans une structure ou de définir des structures différentes au sein même d’un fichier.

Il faudra faire très attention aux USAGE aux tailles et aux VALUE utilisés dans les différentes descriptions de données.

S’il s’agit d’un fichier dans lequel une redéfinition de la structure générale est nécessaire l’option DATA RECORD ARE ENREG1 ENREG2, sert de REDEFINES et ce mot réservé ne peut être utilisé au niveau 01.

Lorsqu’il s’agit d’un REDEFINES de niveau 01 les longueurs peuvent être différentes la structure la plus longue devant toujours se trouver en première position. S’il s’agit d’un autre niveau les longueurs doivent toujours être identiques.

01 Rates.
   02 Rate1           PIC 99V999.
   02 Rate2 REDEFINES Rate1 PIC 999V99.
   02 Rate3 REDEFINES Rate1 PIC 9999V9.

01 HoldDate.
   02 EuroDate.
      03 EuroDay   PIC 99.
      03 EuroMonth PIC 99.
      03 EuroYear  PIC 9(4).
   02 USDate REDEFINES EuroDate.
      03 USMonth   PIC 99.
      03 USDay     PIC 99.
      03 USYear    PIC 9(4).

01 LetterTable.
   02 TableValues.
      03 FILLER PIC X(13) VALUE "ABCDEFGHIJKLM".
      03 FILLER PIC X(13) VALUE "NOPQRSTUVWXYZ".
   02 FILLER REDEFINES TableValues.
      03 Letter PIC X OCCURS 26 TIMES.

01 BonusTable.
  02 BonusValues.
    03 FILLER PIC X(24) VALUE "507590758595354365406085".
  02 FILLER REDEFINES BonusValues.
    03 Province OCCURS 4 TIMES.
      04 Bonus OCCURS 3 TIMES PIC 99.

5. LES NIVEAUX SPÉCIAUX

Parmi les niveaux spéciaux en dehors des niveaux 1 à 49 il existe encore les niveaux 66, 77, 88.

Le niveau 66

Ce niveau s’écrit en marge A comme le 01, il permet de donner un nouveau nom symbolique à une zone élémentaire ou à un groupe. (Equivalant à un COPY BLOC AFTER)

01 DEBUT.
   02 LECODE.
      03 LENUM PIC 999.
      03 LECAR PIC XXX.
   02 LEDEPOT.
      03 NOM   PIC XXXXX.
      03 DEBIT PIC 9999999.
66 COMPTES RENAMES LECODE.

La structure COMPTES regroupe les variables LENUM et LECAR, ce qui permet l’utilisation des CORRESPONDING et l’usage de LECAR of LECODE ou de LENUM in COMPTES.

Le niveau 77

Ce niveau n’est utilisable qu’en WORKING-STORAGE SECTION , et sert à définir directement une zone élémentaire indépendante d’une structure. Il doit être immédiatement après la clause WORKING-STORAGE SECTION.

77 Nom-de-donnée PIC …

77 I PIC 99 VALUE 0.

Le niveau 88

Le niveau 88 permet de définir des NOMS-CONDITIONS.

Supposons, par exemple, que nous devions représenter la situation matrimoniale des individus par 1 pour célibataire, 2 pour les mariés et 3 pour les veufs.

Dans ce cas la description de la variable MATRIMONIAL serait :

01 MATRIMONIAL PIC 9.

Dans la procédure division nous devons écrire :
IF MATRIMONIAL = 1 PERFORM CELIB
IF MATRIMONIAL = 2 PERFORM MARIES
IF MATRIMONIAL = 3 PERFORM VEUFS

Pour éviter cette écriture longue et fastidieuse nous pouvons compléter la description de la variable comme ceci :

01 MATRIMONIAL PIC 9.
   88 CELIBAT VALUE 1.
   88 MARIE VALUE 2.
   88 VEUF VALUE 3.

Et l’utiliser de la manière suivante :
IF CELIBAT PERFORM CELIB
ELSE IF MARIE PERFORM MARIES
ELSE IF VEUF PERFORM VEUFS

Ce qui aura exactement le même résultat mais sera beaucoup plus parlant.
Ce niveau peut inclure plusieurs valeurs pour un même NOM-CONDITION, par exemple :

88 Nom-condition VALUE |littèral-1 THRU littèral-2|
                       |littèral-3 THRU littéral-4|

02 AGE PIC 999.
   88 ENFANT VALUE 1 THRU 17.
   88 ADO    VALUE 18 THRU 25.
   88 ADULTE VALUE 26 THRU 65.
   88 AGES   VALUE 66 THRU 135.

L’utilisation reste inchangée, en procédure il suffit d’écrire :
IF ADO PERFORM PARAG-ADO

Une association de valeurs peut aussi être créée sous la forme suivante :
02 JOUR PIC 99.
   88 PAIR   VALUE 0 2 4 6 8 10 12.
   88 IMPAIR VALUE 1 3 5 7 9 11 13.

4. DATA DIVISION

La DATA DIVISION est organisée en 4 sections :

  • La FILE SECTION qui définit les fichiers en regroupant les instructions de gestion des entrées sorties et les descriptions des zones de mémoire où sont transmis les enregistrements des fichiers.
  • La WORKING-STORAGE SECTION où sera décrit chaque variable de travail.
  • La LINKAGE SECTION qui permet de déclarer les zones de mémoire utilisées par plusieurs programmes.
  • La SCREEN SECTION pour la gestion du GUI

4.1 FILE SECTION

La FILE SECTION contient une description de fichier ainsi qu’une ou plusieurs descriptions d’enregistrement pour chaque fichier utilisé par le programme.

DECLARATION DU FICHIER

FD file-name BLOCK CONTAINS XXX RECORDS
             RECORD CONTAINS NNN CHARACTERS
             LABEL RECORD IS {STANDARD}
                             {OMITTED }
             VALUE OF { FILE-ID } IS id-name
             DATA { RECORD IS } {record-name} …
                  { RECORDS ARE }

Le nom est celui que l’on trouve dans SELECT
XXX indique le nombre d’enregistrements contenu dans un bloc
NNN donne la longueur en octet d’un enregistrement
LABEL indique s’il s’agit d’enregistrements sur imprimante (omitted) ou autre
VALUE permet de donner le nom du fichier sur disque
DATA RECORD est utilisé pour indiquer le nom de l’enregistrement qui décrira le niveau 01, comme il peut y avoir des enregistrements de modèles différents on peut les renseigner ici.

Description de l’enregistrement

Cette partie donne :
– le type et la longueur des champs qui le composent
– l’ordre de ces champs01 nom-enregistrement.
    05 nom-élément-simple ….
    05 nom-item-groupe.
        10 nom-élément-simple ….
        10 nom-élément-simple ….
    05 nom-élément-simple ….

Dans la description de l’enregistrement :
–les données sont définies de façon hiérarchique (par niveau).
–Le nom de l’enregistrement porte le numéro 01
–les numéros 02 à 49 peuvent être utilisés pour identifier les items dans l’enregistrement.
–Les items qui composent un item de groupe doivent porter un numéro plus grand que ce dernier.
–Tous les items de même niveau doivent porter le même numéro.

Le format général d’une description de zone de données est :
– 01 débute dans la marge A,
– les autres numéros dans la marge B.

4.2 WORKING-STORAGE SECTION

Cette section décrit les variables de travail. Les variables COBOL peuvent être classées en 2 catégories : les données élémentaires et les groupes de données.

Les variables élémentaires

Niveau nom-de-donnée [PICTURE] description Usage [VALUE IS littéral]
                                                      [PIC ]

Niveau : les données élémentaires isolées ont soit le niveau 77 soit 01 (marge A), en soi il n’y a aucune différence, seulement les 77 doivent être déclarées en tête de la WSS. Il n’y a pas de 77 en File Section.

Nom de la donnée : c’est le nom par lequel le programmeur pourra référencer la variable. Ils doivent être différents des mots réservés et univoques.

PICTURE

identifie le type de donnée
indique la dimension (grandeur) de l’item
le type peut être alphanumérique (X), numérique (9), alphabétique (A), numérique édité (9,Z,+, -, …)

01 CODE-PROVINCE     PIC XXX.
   05 PRENOM         PIC XXXXXXXXXX.
      10 SALAIRE     PIC 9999999.
         15 INITIALE PIC A.

Pour éviter les répétitions, on peut utiliser la forme suivante
05 PRENOM PIC X(10).
15 SALAIRE PIC 9(7).

La clause PICTURE :
– est présente pour les éléments SIMPLES seulement.
– peut débuter n’importe où dans la marge B.
– la chaîne de caractère décrivant l’item doit être précédée d’au moins un espace.
– Il ne doit pas y avoir d’espace dans la chaîne de caractères.

Les items numériques (PICTURE 9) sont les seuls qui peuvent être utilisés pour les opérations arithmétiques.
Lorsqu’une valeur décimale est lue dans un fichier d’entrée, le point décimal n’apparaît pas mais sa présence est implicite.

Ex.
12500 représente 125.00
Ceci est indiqué en plaçant le symbole V à l’endroit où doit être le point:
05 MONTANT PIC 999V99

USAGE

identifie le type de représentation interne qui est utilisé pour enregistrer l’information. Les principaux types sont :

DISPLAY
BINARY
PACKED-DECIMAL

VALUE

Il est possible d’initialiser la donnée, le littéral est une valeur constante. Cette initialisation ne se fait qu’une fois lors du lancement du programme. Cette valeur doit être conforme à la descriptions qui a été faite.

Si Value est omis, la valeur initiale est INDETERMINEE.

77 TAUX    PIC 99 VALUE 0.
01 CAPITAL PIC 999999 VALUE ZERO.
01 REPONSE PIC XXX VALUE 'NON'.

Dans le cas des PIC X ou A attention à la longueur, la chaîne est toujours mise entre ” ” , le mot ALL peut être utilisé et dans ce cas il y aura n occurrence du caractère dans la chaîne.

77 CHAINE PIC XXXXXXXX VALUE ALL 'N'.
sans ALL un seul N suivi de blancs serait placé dans chaine.

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 PICTURES 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. 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.

3. ENVIRONMENT DIVISION

Cette division (ENVIRONMENT DIVISION) permet de définir le type d’ordinateur pour lequel est écrit le programme, ainsi que les périphériques nécessaires pour supporter les fichiers.

   A   B
   ENVIRONMENT DIVISION.
   CONFIGURATION SECTION.
   SOURCE-COMPUTER. IBM-AS400.
            Ou      IBM-PC.
   OBJECT-COMPUTER. IBM-AS400.
            Ou      IBM-PC.
   SPECIAL-NAMES. Liste des noms symboliques spéciaux.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
        Options
   I-O-CONTROL.
        Options

Les SPECIAL-NAMES

CURRENCY-SIGN IS caractère : par défaut le $ mais un autre caractère peut être utilisé

DECIMAL-POINT IS COMMA : la Virgule indique la séparation des unités et des décimales.

Nom-réservé IS nom-mnémonique : cette clause s’adresse aux instructions d’entrée-sortie DISPLAY et ACCEPT.

L’INPUT-OUTPUT SECTION

Fait le lien entre les fichiers du programme et les fichiers sur les périphériques (Disque, bande, imprimante). C’est ici qu’on indique si le fichier est séquentiel ou en accès direct.

En FILE-CONTROL, on établit le lien entre chacun des noms de fichiers désignés dans la DATA DIVISION et les noms de fichiers externes.

Forme générale

   A   B
   FILE-CONTROL.
       SELECT FOURNISSEUR ASSIGN TO ……….

FOURNISSEUR est le nom indiqué en FILE SECTION dans la clause FD Nom-de-fichier

Les options

FILE-CONTROL.
    SELECT [optional] nom-du-fichier assign to ……
           ORGANIZATION IS ………
           ACCES MODE IS………….
           Clause KEY…
           FILE STATUS IS ………..

1. ORGANIZATION IS LINE SEQUENTIAL
                   SEQUENTIAL
                   INDEXED
                   RELATIVE

2. ACCESS MODE IS SEQUENTIAL
                  RANDOM
                  DYNAMIC

3. KEY
             RELATIVE KEY IS nom-de-donnée
             RECORD KEY IS nom-de-donnée1
                 ALTERNATE RECORD KEY IS nom-de-donnée2
                 [WITH DUPLICATES]

4. FILE-STATUS IS SKF1

Remarques

Au niveau de l’organisation :
Linesequential pour les fichiers crées par l’EDITEUR.
Relative pour les fichiers à accès directe au moyen d’une clé numérique qui indique la position de l’enregistrement dans le fichier.
Indexed, les enregistrements sont les uns derrières les autres et les clés d’accès se trouvent dans un second fichier.

Au niveau de l’accès :
Sequential le fichier sera lu enregistrement par enregistrement du début à la fin.
Random le fichier est lu directement au moyen d’une clé, l’enregistrement recherché est donné Immédiatement.
Dynamic le fichier peut être lu comme le sequential ou comme le random durant toute la durée du programme.

Au niveau des clés :
La définition de clés n’est valable que pour les fichiers NON séquentiels.

Le FILE-STATUS permet de récupérer sous forme de code numérique le résultat de l’opération effectuée sur ce fichier. Pour cela, l’option doit être indiqué.

Utilisation d’un fichier de type texte

INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT OPTIONAL fdisk1
         ASSIGN TO disk "c:\temp\monfichier.txt"
         Organization is Line Sequential
         FILE STATUS IS status-variable.
   *
      Select impr assign to print "-p spooler".
   ***********************************************
   DATA DIVISION.
   FILE SECTION.
   FD fdisk1.
   01 maligne pic x(80).

*** si vous ne pouvez pas indiquer directement le nom du fichier vous pouvez utiliser cette méthode

    FD fdisk1 VALUE OF FILE-ID LENOM_DE_MONFICHIER.
    01 maligne pic x(80).

    FD Impr.
    01 ligne pic x(80).

01 LENOM_DE_MONFICHIER PIC X(100).

Pour un fichier de données

ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      SELECT optional FOUT
         ASSIGN TO "c:\temp\fout.dta"
         FILE STATUS is sk.
   **********************************************
   DATA DIVISION.
   FILE SECTION.
   FD Fout.
   01 EOUT pic x(20).

2. IDENTIFICATION DIVISION

Cette division (IDENTIFICATION DIVISION) sert à identifier le nom du programme et fournit des informations relatives au nom du programmeur, de la date d’écriture du programme et aux remarques éventuelles.

Forme Générale

       A   B
       IDENTIFICATION DIVISION.
       PROGRAM-ID. Program4.
       AUTHOR. lacommunauteducobol.
       DATE-WRITTEN. dimanche 20 août 2021 9:46:52.
       REMARKS.

Seules les 2 premières instructions sont obligatoires.

PROGRAM-ID. Program4. indique le nom du programme, cette clause est toujours présente car elle identifie le programme. Ce nom est limité à 8 caractères alphanumériques dont le premier doit être alphabétique.

AUTHOR. MOI. Désigne le nom du programmeur.

DATE-WRITTEN. permet d’identifier les différentes versions compilées de votre Programme.

1. INTRODUCTION

COBOL, ‘Common Business Oriented Language ‘, est un langage orienté vers les affaires.
Ce langage a été mis au point en 1959 à la demande du gouvernement américain dans le but d’harmoniser les systèmes des différentes administrations.
Ce langage est encore fort répandu car à peu près 70% des applications commerciales sont écrites en COBOL. Cette grande utilisation peut être expliquée par la grande portabilité de ce langage et ses différentes remises à niveau. Des différences existent entre chaque compilateur COBOL. Nous verrons principalement le compilateur Cobol IBM-AS400 et celui de Microsoft.

1.1 Principes de base

Un programme Cobol s’écrit sur une ligne de 80 colonnes.
Les colonnes 1 à 6 représentent la numérotation des lignes et des pages.
La colonne 7 est utilisée pour indiquer une ligne de continuation (code -) ou pour indiquer un commentaire (code *).
Les colonnes 8 à 72 sont utilisées pour l’écriture du programme.
Les colonnes 73 à 80 sont utilisées pour l’identification mais non contrôlées.

Les noms de Divisions, Sections, Paragraphes sont écrits à partir de la marge A (Colonne 8), les instructions élémentaires sont écrites à partir de la marge B (colonne 12).

1.2 Structure du programme

Un programme Cobol est toujours composé des 4 même parties appelées Divisions. Ces divisions doivent se succéder dans un ordre bien précis.

IDENTIFICATION DIVISION

Cette partie permet de spécifier le nom du programme et celui du programmeur

ENVIRONMENT DIVISION

Décrit le matériel utilisé et les périphériques supportant les fichiers

DATA DIVISION

Décrit toutes les données indépendantes ou structurées

PROCEDURE DIVISION

Contient les instructions exécutables

1.3 Conventions d’écriture

Le programme peut être écrit aussi bien en minuscule qu’en majuscule, mais dans ce cas la recherche d’un nom via l’éditeur sera incomplète. Les caractères utiles sont :
– 0 à 9 de A à Z ou a – z
– L’espace ou Blanc
– Les signes + / * – < > = $ , . ‘ ( )

Tout élément du programme sera précédé et suivi de un ou plusieurs espaces, sauf pour les ( qui ne sont pas suivies de blancs.
Les caractères de ponctuation . et , ne sont pas précédés d’espace, de même que la ).

Les noms symboliques

–1 à 30 caractères
–lettres, chiffres et –
–pas de – au début ou à la fin
–aucun espace inclus
–premier caractère alphabétique
–ne peut être identique à un mot réservé

Ils comportent un maximum de 30 caractères choisis parmi A à Z et 0 à 9 et le trait d’union.
Un nom doit commencer par une lettre, ne pas comporter un caractère blanc et être suivi et précédé d’un espace.

  • Qualification : il peut arriver qu’un même nom soit utilisé pour désigner deux zones différentes.
    On distingue ces 2 zones en qualifiant le nom par IN ou OF.
  • Exemple : NOM OF FCLIENT et NOM OF FOURNISSEUR
  • Nom de paragraphe : il s’agit d’un nom désignant l’adresse d’une instruction du programme.
    Ce nom s’écrit en marge A et est suivi d’un point.
  • Nom-condition : il désigne un état d’une variable associée à une instruction IF.

Les Littéraux

Un littéral est une constante non identifiée par un nom. Il en existe de 2 types, les numériques et les alphanumériques.

  • Les numériques : il s’agit d’un nombre de 18 chiffres maximum. Il s’écrit seul ou avec un point
    décimal si nécessaire et est précédé ou non d’un + ou – (+ par défaut).
  • Exemple : -125.66 ; +0.55 ; 555 ; 258746
  • Les alphanumériques : il s’agit d’une combinaison de caractères inclus entre apostrophes.
  • Exemple : ‘ *** Ceci est un texte de 120 ou 255 caractères…../++ ‘

    Si un tel littéral est trop long pour être contenu sur une seule ligne, on peut le continuer sur la ligne suivante en plaçant :
    – un trait d’union en colonne 7
    – une ‘ en marge B

    Attention aux espaces se trouvant sur la première ligne ils sont compris dans l’ensemble du littéral.

Les constantes Figuratives

Ce sont des constantes désignées par des Noms Réservés et ayant une fonction précise.

ZERO (S)
SPACE SPACES

HIGH-VALUE LOW-VALUE
ALL

00D700xx

00D70014   Limite de l’extention atteinte. DB2 a tenté d’insérer une page système dans l’espace de table, mais il n’y avait pas assez de place pour insérer la page système.

00D70025   La demande de services de méthode d’accès a échoué.

00C9009x

00C90090  Verrouillage incompatible détecté.

00C90091  Tentative d’accès à une ressource déjà verrouillée. Existance d’une UR indoubt en suspens.

00C90092  Conflit de verrouillage sur une ligne de données. Indication de sortie de stockage d’IRLM.

00C90093  Conflit de verrouillage sur une page de données. Erreur IRLM.

00C90094  Ensemble de données dans un état différent de celui attendu par DB2.
– Soit l’ensemble de données a été supprimé et redéfini, mais DB2 ne reconnaît pas l’ensemble de données redéfini.
– Soit une panne DB2 provoquant des dommages sur l’ensemble des données d’une manière ou d’une autre.

00C90095  Tentative d’acces pendant le redémarrage DB2. Db2 n’a pas donc pu accéder à la page. 

00C90096  Nombre de verrous sur page ou sous-page dépassant le nb maxi pour un user. Patienter et recommencer.

00C90097  Tentative de mise à jour d’un tablespace marqué en FULL IMAGE COPY REQUIRED

00C90098  Limite du nombre d’utilisateurs atteint. Prévenir l’équipe système

00C90099  Load sur une partition pleine. Prévenir le système

00C9009A  Anomalie de migration de release DB2. A soumettre au système

00C9009B  Load sur un tablespace full. A soumettre au système

00C9009C  Insert sur une partition pleine. A soumettre au système

00C9009D  Insert sur un tablespace full. A soumettre au système

00C9008x

Problèmes liés aux Tablespaces :

00C90080  Tentative de mise à jour sur un tablespace en lecture seule (Read Only).

00C90081  Accès à un tablespace arrêté.

00C90082  Accès à un tablespace utilisé par un utilitaire (état UTUT).

00C90083  Accès en lecture uniquement à un tablespace utilisé par un utilitaire (état UTRO).

00C90084  Problème d’accès aux Tablespaces temporaires de tri DB2.

00C90085  Limite des tablespaces temporaires de tri atteinte.

00C90086  Accès à un tablespace réservé exclusivement aux utilitaires.

00C90087  Page corrompue détectée. Utilisez l’utilitaire REPAIR pour corriger.

00C90088  Deadlock détecté. Attendre et relancer l’opération.

00C90089  EDM POOL saturé. Contacter l’équipe système.

00C9008B  Limite du nombre de bases définies atteinte. Voir avec l’équipe système.

00C9008C  Accès à un tablespace partitionné sans index de partitionnement trouvé.

00C9008D  Accès à un tablespace partitionné sans index de partitionnement trouvé.

00C9008E  Timeout IRLM : le verrou n’a pas pu être acquis dans le délai imparti. Réessayer.

00C9008F  Taille limite de la base atteinte. Prévoir une REORG des tablespaces.​