COBOL 1ER ET LA HORDE...



SOMMAIRE

Chapitre 1 : Was ist das ?

Chapitre 2 : Structure Générale d'un programme

Chapitre 3 : IDENTIFICATION DIVISION

Chapitre 4 : ENVIRONMENT DIVISION

Chapitre 5 : DATA DIVISION

Chapitre 6 : PROCEDURE DIVISION

Chapitre 7 : Les fichiers

Chapitre 8 : Liste des mots réservés en Cobol


Chapitre 1 : Was ist das ?

Si vous croyiez que COBOL avait quelque chose à voir avec la musique, peut-être vaut-il mieux passer votre chemin. En effet, COBOL n'est rien d'autre qu'un langage de gestion comme son nom l'indique (COmmon Business Oriented Language).

Il fut développé à la fin des années 50, sur initiative du gouvernement Américain. Par la suite, différentes normes ont été mises en place, dont la plus récente est ANS 85 (à moins qu'on considére le COBOL Objet comme une nouvelle norme ?)

COBOL, qui était voué à disparaître petit à petit, connaît une certaine renaissance du fait du problème de l'an 2000. Sacrés programmeurs des années 60-70-80 !!! Ils avaient codé les années de leurs dates sur 2 caractères !!! Un petit conseil, donc : ne commettez pas la même erreur, et préparez le passage à l'an 10 000 en codant les années de vos dates sur 5 caractères.


Chapitre 2 : Structure Générale d'un programme

Un programme COBOL comporte 4 divisions que nous allons détailler dans les 4 prochains chapitres. Chaque division a une fonctionnalité particulière :

- IDENTIFICATION DIVISION : Description du programme et de son auteur

- ENVIRONMENT DIVISION : Description de l'environnement, c'est-à-dire le matériel et les fichiers utilisés

- DATA DIVISION: Description des données (contenu des fichiers et variables utilisées)

- PROCEDURE DIVISION : Description des traitements

Les divisions comportent différentes sections, chaque section étant découpée en paragraphes.

On distingue également :

                  Une instruction (qui contient toujours un verbe) constitue l'élément de base du Cobol.

                  Il s'agit d'une suite d'instructions groupées (par un même conditionnement, par exemple). Une phrase se termine par un point et est suivie par un espace (ou retour chariot).

Une ligne COBOL, comportant 80 caractères, est découpée en 5 zones :


Chapitre 3 : IDENTIFICATION DIVISION

Cette division est obligatoire. Syntaxe :

IDENTIFICATION DIVISION.

PROGRAM-ID. Nom-prog.

[AUTHOR. Nom-auteur.]

[DATE COMPILED. Date]

Attention aux pièges !

Une phrase se termine par un point.

Après un point, on doit impérativement avoir un espace. Ainsi :

AUTHOR.MARCEL est incorrect, alors que AUTHOR.  MARCEL ne l'est pas.


Chapitre 4 : ENVIRONMENT DIVISION

Cette division est obligatoire, et contient 2 sections qui sont toutes deux facultatives. Cela signifie que si vous n'avez aucune utilité de faire des descriptions en ENVIRONMENT DIVISION, vous devrez malgré tout créer une division vide.

Syntaxe :

CONFIGURATION SECTION.

[SOURCE-COMPUTER. Nom-ordinateur1.]

[OBJECT-COMPUTER. Nom-ordinateur2.]

[SPECIAL-NAMES.

CURRENCY SIGN IS caractère

DECIMAL-POINT IS COMMA.]

Ca, c'est la syntaxe couramment utilisée, mais vous pouvez utiliser d'autres possibilités que je ne connais pas trop, et dont je ne vous parlerai pas ici (soyons honnête !).

CURRENCY SIGN IS F: désigne le F comme symbole de la monnaie,

CURRENCY SIGN IS $: désigne le $ comme symbole de la monnaie,

etc.

DECIMAL-POINT IS COMMA désigne la virgule comme délimiteur décimal.

C'est ici que l'on va décrire l'organisation des fichiers utilisés. Nous la détaillerons dans le chapitre traitant des fichiers.


Chapitre 5 : DATA DIVISION

Cette division peut contenir plusieurs sections, mais je ne détaillerai que les deux plus usitées, la FILE SECTION et la WORKING-STORAGE SECTION.

C'est ici que l'on va décrire les informations, les données utilisées par les fichiers. Nous la détaillerons dans le chapitre traitant des fichiers.

On distingue 3 classes de données:

  1. Alphabétique : A
  2. Numérique : 9
  3. Alphanumérique : X

Pour décrire une donnée, la syntaxe générale est :

niveau nom-variable PICTURE classe(n).

Ne vous énervez pas ! J'explique par un exemple :

Pour décrire une chaîne alphanumérique de 20 caractères nommée Catherine :

77 Catherine PICTURE X(20).

Et pour un nombre sur 3 positions :

77 nombre PICTURE 9(3).

Et on peut panacher !

Exemple :

77 codesecret PICTURE X(3)9(5)A(2).

3 caractères alphanumériques suivis de 5 chiffres puis 2 lettres

Et là j'entends déjà votre question : Où est-ce qu'il va pécher ce niveau 77 ?

Et voilà que je vais vous donner une règle fréquemment utilisée :

- Pour une variable seule, le niveau est 77.

- Pour un groupe de données, on utilise les niveaux 01 à 49.

- Il existe 2 niveaux particuliers : 66 et 88.

Exemple :

Nous décrivons un ensemble de données concernant un étudiant :

01 etudiant.

   05 numero PICTURE X(5).

   05 nom PICTURE X(20) VALUE SPACE.

   05 prenom PICTURE X(15) VALUE SPACE.

   05 adresse.

      10 num-rue PIC 9(3).

      10 nom-rue PIC X(20) VALUE SPACE.

      10 code-postal PIC X(5).

      10 ville PIC X(25) value 'LAON'.

   05 date-naissance.

      10 ann.

         15 siecle PIC 99.

         15 annee PIC 99.

      10 mois PIC 99.

      10 jour PIC 99.

   05 moyenne PIC 99V99.

Facile, non ?

A la lumière de cet exemple, vous aurez remarqué (si vous êtes perspicace) :

  1. qu'on peut utiliser PIC plutôt que PICTURE (tout le monde sait que les informaticiens sont des fainéants ; n'est-ce pas, papa ?)
  2. que l'on peut assigner une valeur initiale avec le mot clé "VALUE"
  3. que l'on peut déclarer un nombre avec des chiffres après la virgule via le délimiteur V

Le niveau 66 : C'est un niveau symbolique qui permet de regrouper une à plusieurs rubriques sous un même nom.

Exemple :

01 individu.

   02 sexe PIC 9.

   02 jour PIC 99.

   02 mois PIC 99.

   02 annee PIC 9(4).

66 num renames sexe thru annee.

==> num regroupe les rubriques sexe, jour, mois, annee sous un seul nom.

L'utilité ? Je vous en pose des questions, moi ? Peut-être pour des affectations globales, mais alors, là, je suis pas sûr.

Le niveau 88 : C'est un niveau que je trouve utile, et qui s'apparente un peu à l'utilisation des booléens dans d'autres langages. Il ne peut être utilisé qu'avec une donnée de niveau 77.

Voyons tout de suite un exemple :

77 sexe PIC 9.

   88 masculin value 1.

   88 feminin value 2.

Une fois la variable sexe renseignée, on pourra programmer soit :

IF sexe = 1 ... ,

soit :

IF masculin ...

Ce niveau est très utile pour un menu. Supposons un menu qui donne 4 choix : 0, 1, 2, 3.

On pourra coder en WORKING-STORAGE SECTION :

77 choix pic 9.

   88 choix-ok value 0 1 2 3.

et voilà, on simplifie les lignes de code !!!

Et les tableaux ?

J'allais les oublier !!!

On les déclare à l'aide de la clause OCCURS, sur un niveau compris entre 02 et 49. Donc, pas de clause OCCURS sur un niveau 01.

Premier exemple :

01 Table.

   05 Notes pic 99v99 occurs 10.

On a déclaré le tableau Notes de 10 postes (de 1 à10).

Deuxième exemple :

01 Table.

   02 personne occurs 10.

        03 Nom pic X(10).

        03 Prenom pic X(10).

On a déclaré le tableau personne de 10 postes, lui-même composé de Nom et Prénom.

On pourra ainsi accéder à :

- personne (i)

- Nom (i)

- Prenom (i)

Troisième exemple : Initialisation d'un tableau.

01 TABLE.

     05 libmois.

      10 filler PIC X(9) value "janvier".

      10 filler PIC X(9) value "février".

      10 filler PIC X(9) value "mars".

...

      10 filler PIC X(9) value "decembre".

05 libelle redefines libmois.

      10 nomois OCCURS 12 PIC X(9).

Cet exemple fait apparaître 2 nouvelles notions :

- FILLER : plutôt que de nommer une variable qui ne sera jamais utilisée dans un programme, on peut utiliser le mot-clé "FILLER".

- REDEFINES : Il s'agit d'une clause qui permet de définir plusieurs découpages d'un même groupe de données.

Quatrième exemple : Tableau à taille variable.

01 enregistrement.

   05 compteur PIC 99.

   05 Table OCCURS 1 TO 15 DEPENDING ON compteur PIC X(5).

La taille variable est stockée dans compteur.

Cinquième exemple : Tableau à 2 dimensions.

01 Matrice.

   05 vecteur occurs 2.

      10 table PIC X(5) occurs 4.

On accédera à table(i,j) ; ou vecteur(i) ; ou matrice.


Chapitre 6 : PROCEDURE DIVISION

On va enfin coder, réellement, notre programme ! Quel boulot pour en arriver là, non ?

Nous ne verrons ici que les instructions majeures.

Il faut tout de même que je vous dise comment se présente cette division.

Elle est constituée de paragraphes. Pour simplifier, on peut dire qu'un paragraphe correspond à une procédure dans un langage comme le Pascal.

Voici un aperçu de l'organisation de la PROCEDURE DIVISION :

PROCEDURE DIVISION.

paragraphe1.

<corps du paragraphe>

paragraphe2.

<corps du paragraphe>

...

STOP RUN.

Le STOP RUN, qui est obligatoire à au moins un endroit dans la PROCEDURE DIVISION (et qui, si le programme est bien écrit, n'y est présent qu'une seule fois), sert à indiquer la fin du programme.

Ceci étant précisé, voici maintenant les commandes les plus usitées :

Exemple :

On a la variable a

DISPLAY "a=" a.

Exemples :

DISPLAY "Entrez votre nom".

ACCEPT nom.

Pour récupérer la date du jour :

ACCEPT d FROM DATE.

Pour le jour :

ACCEPT j FROM DAY.

Et pour l'heure :

ACCEPT h FROM TIME.

Exemple d'utilisation des verbes ACCEPT et DISPLAY :

IDENTIFICATION DIVISION.

PROGRAM-ID. EXEMPLE1.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

          77 MESSAGE PIC X(32).

PROCEDURE DIVISION.

SAISIE.

         DISPLAY "Entrez votre message".

          ACCEPT message.

          DISPLAY "Votre message était :" message.

          STOP RUN.

Exemples :

Move "LAON" to ville.

Move 1 to a.

Programme exemple 2 :

IDENTIFICATION DIVISION.

PROGRAM-ID. EXEMPLE2.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

77 MESSAGE-SAISI PIC X(16).

77 MESSAGE-RECEVANT PIC X(16).

PROCEDURE DIVISION.

DEBUT.

          DISPLAY "Saisissez votre message".

          ACCEPT MESSAGE-SAISI.

          MOVE MESSAGE-SAISI TO MESSAGE-RECEVANT

          DISPLAY "Vous avez saisi : " MESSAGE-RECEVANT.

          STOP RUN.

Exemples:

ADD b c TO a équivaut à a = a+b +c

ADD b c GIVING a équivaut à a = b +c

ADD a TO b équivaut à b = a+b

SUBTRACT a FROM b équivaut à b = b-a

SUBTRACT c FROM b GIVING a a = b-c

MULTIPLY a BY b GIVING c équivaut à c = a*b

MULTIPLY a BY b équivaut à b = a*b

DIVIDE c INTO b GIVING a. équivaut à  a=b/c

DIVIDE b BY c GIVING a REMAINDER d équivaut à :    a=b/c ; d = reste

COMPUTE a = a*(b+d)/c

COMPUTE b = a+ b

Pour les calculs, il peut être intéressant d'utiliser la clause "ON SIZE ERROR" afin de se prémunir des risques de dépassements.

EXEMPLE 3 :

IDENTIFICATION DIVISION.

PROGRAM-ID. EXEMPLE3.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

     01 NOMBRES-CALUL.

          05 DIVISEUR PIC 99 VALUE 0.

          05 DIVIDENDE PIC 99 VALUE 5.

          05 QUOTIENT PIC 9 VALUE 0.

PROCEDURE DIVISION.

DEBUT.

          DIVIDE DIVISEUR INTO DIVIDENDE GIVING QUOTIENT

          ON SIZE ERROR

               DISPLAY "ERREUR !!!"

               STOP RUN.

          DISPLAY "PAS D'ERREUR !!!".

          STOP RUN.

Notez que dans ce programme on a 2 STOP RUN ! Pour éviter cela, j'aurais dû utiliser un ordre de débranchement, comme GO TO ou PERFORM (ouah, où est-ce que j'ai été la chercher cette transition ?).

Eh oui, amateurs du Basic, ceci doit vous rappeler quelque chose ! Le GO TO (en 2 mots ici) existe aussi en COBOL. Mais je ne sais pas si c'est très sympa de ma part d'en parler ici. Parce que pour la maintenance d'un programme, le GO TO, c'est pas ce qu'il y a de mieux.

Nous lui préférerons le PERFORM.

Celui-ci permet d'exécuter un ou plusieurs paragraphes puis de retourner juste après l'appel.(C'est donc un peu le pendant du GOSUB en Basic).

Syntaxe :

PERFORM nom-paragraphe.

ou

PERFORM nom-paragraphe1 THRU nom-paragraphe2 .

Nous verrons plus loin que le PERFORM est également utilisé pour des structures répétitives.

EXEMPLE 4 : l'exemple 3, mais avec un seul STOP RUN :

IDENTIFICATION DIVISION.

PROGRAM-ID. EXEMPLE3.

ENVIRONMENT DIVISION.

DATA DIVISION.

WORKING-STORAGE SECTION.

     01 NOMBRES-CALUL.

          05 DIVISEUR PIC 99 VALUE 0.

          05 DIVIDENDE PIC 99 VALUE 5.

          05 QUOTIENT PIC 9 VALUE 0.

PROCEDURE DIVISION.

DEBUT.

     DIVIDE DIVISEUR INTO DIVIDENDE GIVING QUOTIENT

     ON SIZE ERROR

          DISPLAY "ERREUR !!!"

          PERFORM FIN-PROG.

     NOT ON SIZE ERROR

          DISPLAY "PAS D'ERREUR !!!".

FIN-PROG.

     STOP RUN.

(Notez que cet exemple montre également la possibilité d'utiliser la clause NOT ON SIZE ERROR)

IF <condition> THEN

<traitements>

[ELSE

<Traitements>]

END-IF.

PERFORM UNTIL<condition d'arrêt>

<Traitements>

END-PERFORM.

PERFORM WITH TEST AFTER UNTIL <condition d'arrêt>

<Traitement>

END-PERFORM.

Pour coder cet algorithme :

Pour i de 1 à Max avec Pas de p Faire

<traitements>

On devra coder :

PERFORM VARYING i From 1 by p until i > Max

<Traitement>

END-PERFORM.

Le pas est obligatoire, même s'il vaut 1 !

On peut remplacer : > par GREATER, < par LESS, = par EQUAL.

On peut combiner des conditions avec AND, OR et NOT.


Chapitre 7 : LES FICHIERS

Le COBOL permet 3 types d'organisation des fichiers :

On peut distinguer 3 types d'accès à ces fichiers :

Bien sur, les accès direct (Random) et dynamique (Dynamic) ne sont pas disponibles pour une organisation séquentielle.

En ENVIRONMENT DIVISION, déclaration des fichiers : FILE-CONTROL

Syntaxe :

INPUT-OUTPUT SECTION.

FILE-CONTROL.

SELECT [OPTIONAL] Nom-fichier-logique ASSIGN TO nom-systéme

ORGANIZATION Sequential/Indexed/Relative (au choix)

ACCESS MODE Sequential/Random/Dynamic

RECORD KEY nom-clé

ALTERNATE RECORD KEY nom-clé-secondaire [WITH DUPLICATES]

RELATIVE KEY nom-donnée

FILE STATUS nom-donnée2..

Expliquons rapidement cette syntaxe :

Par exemple, file status = '00' signifie que l'opération s'est déroulée sans problème, '41' signifie que l'on veut ouvrir un fichier déjà ouvert, etc.

En DATA DIVISION, description des données utilisées par les fichiers :

DATA DIVISION.

FILE SECTION.

FD nom-logique-fichier

     VALUE OF FILE-ID "nom-physique-fichier"

     LABEL RECORD STANDARD

     DATA RECORD nom-enregistrement.

01 nom-enregistrement.

... description de l'enregistrement.

Notons que si l'organisation est INDEXED, la description de l'enregistrement doit contenir la clé elle-même.

Opérations sur les fichiers :

OPEN INPUT/OUTPUT/I-O/EXTEND nom-logique-fichier.

Avec :

INPUT : Ouverture en lecture

OUTPUT : en écriture

EXTEND : en écriture en fin de fichier

I-O : en lecture et en écriture.

READ nom-logique-fichier NEXT

[INTO nom-donnee]

[AT END traitements ]

[NOT AT END traitements]

END-READ.

Renseigner au préalable la clé.

READ nom-logique-fichier

[INTO nom-donnee]

[KEY IS nom-clé]

[INVALID KEY traitements]

[NOT INVALID KEY traitements]

END-READ.

Expliquons un peu tout cela :

- INTO : permet d'indiquer la zone dans laquelle on veut ramener l'enregistrement. Si non précisé, la zone déclarée en FILE SECTION sera utilisée.

- KEY IS : permet d'indiquer quelle clé on utilise entre la clé primaire et les clés secondaires. Si non précisé, c'est la clé primaire qui sera utilisée.

- AT END, NOT AT END, INVALID KEY, NOT INVALID KEY : permet d'indiquer les traitements à effectuer losqu'on est en fin de fichier (AT END) ou non, et lorsqu'une lecture (INVALID KEY) s'est mal déroulée ou non.

WRITE nom-enregistrement

[FROM nom-zone]

[INVALID KEY traitements]

[NOT INVALID KEY traitements]

END-WRITE.

REWRITE nom-enregistrement

[FROM nom-zone]

[INVALID KEY traitements]

[NOT INVALID KEY traitements]

END-REWRITE.

DELETE nom-fichier RECORD

[INVALID KEY traitements]

[NOT INVALID KEY traitements]

END-DELETE

CLOSE nom-logique-fichier [WITH LOCK]

(la clause WITH LOCK permet d'éviter d'ouvrir le même fichier ultérieurement dans le même programme).

Il s'agit d'une instruction particuliére qui permet de se placer sur la premiére position correspondant à une valeur de clé.

Syntaxe :

START nom-fichier

KEY IS = / > / >=/NOT < nom-donnee

[INVALID KEY traitements]

[NOT INVALID KEY traitements]

END-START


Chapitre 8 : Liste des mots réservés en Cobol

ACCEPT ACCESS ADD
ADVANCING AFTER ALL ALPHABETIC
ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED
ALSO ALTER ALTERNATE AND
ANY ARE AREA AREAS
ASCENDING ASSIGN AT AUTHOR
BEFORE BINARY BLANK BLOCK
BOTTOM BY CALL CANCEL
CD CF CH CHARACTER
CHARACTERS CLASS CLOSE COBOL
CODE CODE-SET COLLATING COLUMN
COMMA COMMON COMMUNICATION COMP
COMP-0 COMP-3 COMPUTATIONAL COMPUTATIONAL-0
COMPUTATIONAL-3 COMPUTE CONFIGURATION CONTAINS
CONTENT CONTINUE CONTROL CONTROLS
CONVERTING COPY CORR CORRESPONDING
COUNT CURRENCY DATA DATE
DATE-COMPILED DATE-WRITTEN DAY DECIMAL-POINT
DECLARATIVES DELETE DELIMITED DELIMITER
DEPENDING DESCENDING DESTINATION DESTINATION
DETAIL DISABLE DISK DISPLAY
DIVIDE DIVISION DOWN DUPLICATES
DYNAMIC EGI ELSE EMI
ENABLE END END-ADD END-CALL
END-COMPUTE END-DELETE END-DIVIDE END-EVALUATE
END-IF END-MULTIPLY END-OF-PAGE END-PERFORM
END-READ END-RECEIVE END-RETURN END-REWRITE
END-SEARCH END-START END-STRING END-SUBSTRACT
END-UNSTRING END-WRITE ENTER ENVIRONMENT
EOP EQUAL ERASE ERROR
ESI EVALUATE EVERY EXCEPTION
EXIT EXTEND EXTERNAL FALSE
FD FILE FILE-CONTROL FILE-ID
FILLER FIRST FOOTING FOR
FROM GENERATE GIVING GLOBAL
GO GREATER GROUP HEADING
HIGH-VALUE HIGH-VALUES I-O I-O-CONTROL
IDENTIFICATION IF IN INDEX
INDEXED INITIAL INITIALIZE INPUT
INPUT-OUTPUT INSPECT INSTALLATION INTO
INVALID IS JUST JUSTIFIED
KEY LABEL LAST LEADING
LEFT LENGTH LESS LIMIT
LIMITS LINAGE LINAGE-COUNTER LINE
LINE-COUNTER LINES LINKAGE LOCK
LOW-VALUE LOW-VALUES MEMORY MERGE
MESSAGE MODE MODULES MOVE
MULTIPLE MULTIPLY NATIVE NEGATIVE
NEXT NO NO-ECHO NOT
NUMBER NUMERIC NUMERIC-EDITED OBJECT-COMPUTER
OCCURS OF OFF OMITTED
ON OPEN OPTIONAL OR
ORDER ORGANIZATION OTHER OUTPUT
OVERFLOW PACKED-DECIMAL PADDING PAGE
PAGE-COUNTER PERFORM PF PH
PIC PICTURE PLUS POINTER
POSITION POSITIVE PRINTING PROCEDURE
PROCEDURES PROCEED PROGRAM PROGRAM-ID
PURGE QUEUE QUOTE QUOTES
RANDOM RD READ RECEIVE
RECORD RECORDS REDEFINES REEL
REFERENCE REFERENCES RELATIVE RELEASE
REMAINDER REMOVAL RENAMES REPLACE
REPLACING REPORT REPORTING REPORTS
RERUN RESERVE RESET RETURN
REVERSED REWIND REWRITE RF
RH RIGHT ROUNDED RUN
SAME SD SEARCH SECTION
SECURE SECURITY SEGMENT SEGMENT-LIMIT
SELECT SEND SENTENCE SEPARATE
SEQUENCE SEQUENTIAL SET SIGN
SIZE SORT SORT-MERGE SOURCE
SOURCE-COMPUTER SPACE SPACES SPECIAL
SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2
START STATUS STOP STRING
SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUBTRACT
SUM SUPPRESS SYMBOLIC SYNC
SYNCHRONIZED TABLE TALLYING TAPE
TERMINAL TERMINATE TEST TEXT
THAN THEN THROUGH THRU
TIME TIMES TO TOP
TRAILING TRUE TYPE UNIT
UNSTRING UNTIL UP UPDATE
UPON USAGE USE USING
VALUE VALUES VARYING WHEN
WITH WORDS WORKING-STORAGE WRITE
ZERO ZEROES ZEROS