Aller au contenu

Cobol ANS 74/Version imprimable

Un livre de Wikilivres.

Ceci est la version imprimable de Cobol ANS 74.
  • Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
  • Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
  • Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.


Cobol ANS 74

Une version à jour et éditable de ce livre est disponible sur Wikilivres,
une bibliothèque de livres pédagogiques, à l'URL :
https://fr.wikibooks.org/wiki/Cobol_ANS_74

Vous avez la permission de copier, distribuer et/ou modifier ce document selon les termes de la Licence de documentation libre GNU, version 1.2 ou plus récente publiée par la Free Software Foundation ; sans sections inaltérables, sans texte de première page de couverture et sans Texte de dernière page de couverture. Une copie de cette licence est incluse dans l'annexe nommée « Licence de documentation libre GNU ».

Généralités

Le langage COBOL (COmmon Business Oriented Language) a été créé par un comité de délégués de constructeurs et utilisateurs d'ordinateurs réunis à l'initiative du gouvernement américain. Ce comité de normalisation, la CODASYL (Conference On DAta SYstems Languages), s'est rassemblé pour la première fois en 1958. Il avait pour mission de définir un langage standard pour la programmation des ordinateurs en vue de résoudre les problèmes commerciaux et administratifs. En avril 1960, le comité publiait une première version du langage connu sous le nom de COBOL 60. Le langage fut ensuite revu, amélioré et complété en 61, 65 et 68. C'est en 1968 que fut défini l'USA Standard COBOL suite à une tentative de normalisation sous l'autorité de l'USASI (United States of America Standards Institute). De nouveau modifié en 1970, le COBOL USA porte maintenant le nom ANS COBOL spécifié par l'ANSI (American National Standards Institute). De nombreuses améliorations ont encore été apportées en 1974 et en 1985. Loin d'être un langage désuet et obsolète (il suffit de prendre connaissance de l'important nombre de grands comptes, publics ou privés, à maintenir à jour un ou plusieurs systèmes d'informations basés sur ce langage), le COBOL a fait l'objet d'une modernisation en 2002, implémentant la programmation orientée objet. Les normes ANS COBOL 1974 sont celles que nous étudierons dans ce cours.

Objectifs du COBOL

[modifier | modifier le wikicode]

Le langage COBOL a été conçu pour produire des programmes :

standardisés
Le COBOL utilise des instructions standards dans une structure de programme standardisée.
Le COBOL est un essai d'utilisation d'un langage commun à tous les ordinateurs : il subsiste des différences d'un constructeur à l'autre, mais ces différences sont minimes.
faciles à comprendre
Parce qu'ils sont écrits en anglais, c'est-à-dire en un langage compréhensible des programmeurs, mais aussi ses non-programmeurs.
orientés vers le traitement des affaires
orientés vers les problèmes administratifs et commerciaux

Quelques termes de programmation COBOL

[modifier | modifier le wikicode]
La source d'un programme
est le programme tel qu'il a été écrit par le programmeur.
Compiler un programme
est utiliser l'ordinateur pour traduire la source d'un programme COBOL en un programme écrit en langage machine. Durant la compilation, une liste des instructions de la source et de l'objet sont imprimés, de même que des messages indiquant les erreurs d'écriture que le compilateur a découvert dans le programme COBOL.
Le programme objet
est le programme obtenu par la traduction du programme source en langage machine.
Le pré-compilateur
est un programme qui traduit les instructions non COBOL (ex: SQL, CICS) en instruction COBOL pour être interprété par le compilateur.
Le compilateur COBOL
est un programme fourni par le constructeur qui dirige l'ordinateur durant la traduction de la source du programme en un programme objet.
Le « source computer »
est l'ordinateur utilisé pour compiler le programme source.
L' « object computer »
est l'ordinateur utilisé pour exécuter le programme objet.

Un exemple de programme COBOL

[modifier | modifier le wikicode]
         1         2         3         4         5         6         7
123456789012345678901234567890123456789012345678901234567890123456789012

       IDENTIFICATION DIVISION.
        PROGRAM-ID. EXEMPLE.
        AUTHOR. SMITH.
        DATE-WRITTEN. 25 SEP 1988.

       ENVIRONMENT DIVISION.
        CONFIGURATION SECTION.
         SOURCE-COMPUTER. MINTA.
         OBJECT-COMPUTER. MINTA.
        INPUT_OUTPUT SECTION.
         FILE_CONTROL.
          SELECT FICHIER1 ASSIGN TO CARD-READER.
          SELECT FICHIER2 ASSIGN TO PRINTER.

       DATA DIVISION.
        FILE SECTION.
         FD FICHIER1 LABEL RECORD IS OMITTED
            DATA RECORD IS COMMERCE.
         01  COMMERCE.
             02 IMPORT.
                03 MECANIQUE    PICTURE 9(5).
                03 ELECTRIQUE   PICTURE 9(5).
             02 EXPORT.
                03 ALIMENTAIRE  PICTURE 9(5).
                03 DIVERS       PICTURE 9(5).
         FD FICHIER2 LABEL RECORD IS OMITTED
            DATA RECORD IS STAT_COMMERCE.
         01 STAT°COMMERCE.
            02 FILLER           PICTURE X(3); VALUE SPACE.
            02 EXP_IMP          PICTURE 9(5).
            02 PCT_MECA         PICTURE 9.99.
            02 PCT_ALIM         PICTURE 9.99.
        WORKING-STORAGE SECTION.
         77 FLAG                PICTURE 9.

       PROCEDURE DIVISION.
        PROG.
           PERFORM D-PROG.
           PERFORM LECTURE-CALCUL-ECRITURE UNTIL FLAG = 1.
           PERFORM F-PROG;
           STOP RUN.
        D-PROG.
           OPEN INPUT FICHIER1.
           OPEN OUTPUT FICHIER2.
           MOVE 0 TO FLAG.
           READ FICHIER1 AT END MOVE 1 TO FLAG.
        LECTURE-CALCUL-ECRITURE.
           COMPUTE EXP-IMP = ALIMENTAIRE + DIVERS - MECANIQUE -
                             ELECTRIQUE.
           COMPUTE PCT_MECA = MECANIQUE / (MECANIQUE + ELECTRIQUE).
           COMPUTE PCT-COMMERCE AFTER ADVANCING 1 LINE.
           WRITE STAT-COMMERCE AFTER ADVANCING 1 LINE.
           READ FICHIER1 AT END MOVE 1 TO FLAG.
        F-PROG.
           CLOSE FICHIER1, FICHIER2.


Environnement de développement

Pour exécuter un programme écrit en COBOL, il faut le traduire en langage machine à l'aide d'un compilateur. Il existe des compilateurs disponibles gratuitement comme GnuCOBOL.

Éditeur de code source

[modifier | modifier le wikicode]

Tout éditeur de fichier texte peut être utilisé.

Cependant certains permettent une coloration syntaxique (Vi, Notepad++). Il existe aussi des extensions pour Visual Studio Code.


Structure générale

Le code source en COBOL peut utiliser un format fixe (hérité des cartes perforées) ou un format libre depuis COBOL 2002.

Les perforations des cartes perforées ne permettait que l'encodage des lettres en capitales ; cela explique que les mots-clés et les noms en COBOL n'utilisent pas de lettres en minuscules.

Le format fixe est hérité des cartes perforées utilisées pour écrire les premiers programmes en COBOL.

Carte perforée d'une ligne de COBOL commençant à la colonne 12

Les lignes sont limitées à 80 caractères (80 colonnes) qui sont divisées comme suit :

Colonnes Description
1 à 6
Paquet de cartes perforées d'un programme COBOL pour système IBM 370.

Numéro de séquence, utilisé à l'origine pour numéroter les cartes, c'est-à-dire les lignes car une carte perforée stocke une ligne de code. Cette partie est ignorée par le compilateur.

Lors de la présentation des cartes perforées à la machine, ce numéro peut être utilisé pour mémoriser les lignes dans le bon ordre. Cependant beaucoup de machines ne tenaient pas compte de ce numéro, mais les cartes perforées pouvaient être triées automatiquement par une machine de tri.

Ce numéro de 6 chiffres peut être décomposé en deux parties : 3 chiffres pour le numéro de page, et 3 chiffres pour le numéro de ligne dans la page.

7 Caractère indiquant le type de la ligne entière :
  • ​ ​ – (espace) Ligne de code normale.
  • D – Ligne de code active en mode de débogage seulement, sinon ignorée par le compilateur.
  • - – Ligne continuant la précédente, celle-ci pouvant être interrompue au milieu d'une chaîne de caractères.
  • * – Ligne de commentaire.
  • / – Ligne de commentaire à imprimer en haut d'une nouvelle page.
8 à 11 Zone A où débute certaines lignes : DIVISION, SECTION, en-têtes de procedure, descripteurs de fichier ou rapport de niveau 01 et 77.
12 à 72 Zone B où débute toutes les autres lignes.
73 à 80 Nom du programme, servant à identifier à quel programme appartient la carte perforée, ignoré par le compilateur.
12345678901234567890123456789012345678901234567890123456789012345678901234567890
      *A   B
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
      ***** Variables
       77 NOM PIC X(20).
       77 COMPTEUR PIC 9(3).
       PROCEDURE DIVISION.
      ***** Initialisation
           MOVE "monde" TO NOM.
           MOVE 99 TO COMPTEUR.
      ***** Affichage
           DISPLAY 'Bonjour ' NOM ' !'.
           DISPLAY 'Vous avez ' COMPTEUR ' messages.'.
           STOP RUN.

Des feuilles découpées en 72 colonnes permettaient de préparer un programme sur papier[1].

Feuille pour préparer un programme COBOL sur papier.

On peut remarquer que le dernier chiffre du numéro de ligne est vierge (0), et donc que le numéro est incrémenté par pas de 10. Cette technique permet de corriger un programme par insertion de nouvelles lignes sans avoir à renuméroter les lignes suivantes. Par exemple, pour insérer une ligne entre 010 et 020, une nouvelle ligne sera numérotée 015.

Cette technique peut également être appliquée aux numéros de pages.

Les systèmes modernes n'emploient plus de cartes perforées ; les contraintes du format fixes ne sont plus obligatoires avec le format libre. Le format libre est possible en COBOL à partir de la version 2002 :

  • La position du début de ligne (indentation) n'est plus imposée ;
  • Il n'y a plus de limitation à 80 caractères par ligne ;
  • Les indicateurs sont supprimés :
    • L'indicateur * pour une ligne de commentaire est remplacé par *> en début de ligne.
    • L'indicateur - de continuation n'est plus nécessaire vu qu'il n'y a plus de limitation de longueur de ligne.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
*>**** Variables
77 NOM PIC X(20).
77 COMPTEUR PIC 9(3).
PROCEDURE DIVISION.
*>**** Initialisation
MOVE "monde" TO NOM.
MOVE 99 TO COMPTEUR.
*>**** Affichage
DISPLAY 'Bonjour ' NOM ' !'.
DISPLAY 'Vous avez ' COMPTEUR ' messages.'.
STOP RUN.

Les deux exemples précédents sont équivalents et affichent :

Bonjour monde                !
Vous avez 099 messages.

Cet affichage montre que les variables sont affichées pleinement, sans suppression des espaces finaux ou des zéros initiaux :

  • La variable nom est définie comme une chaîne (PIC X) de 20 caractères : 77 NOM PIC X(20).
  • La variable compteur est définie comme un entier (PIC 9) sur 3 chiffres : 77 COMPTEUR PIC 9(3).

Quatre Divisions par programme

[modifier | modifier le wikicode]

Un programme est constitué de quatre divisions (elles-mêmes constituées de sections), permettant de structurer le programme en séparant les informations d'identifications, la définition des variables et leur traitement (procédures).

Identification du programme

[modifier | modifier le wikicode]

Cette division est la première dans un programme ; elle est obligatoire. Elle définit les caractéristiques du programme : nom, auteur, ... La syntaxe est la suivante :

IDENTIFICATION DIVISION.

La clause PROGRAM-ID est obligatoirement présente et définit le nom donné au programme ; celui-i sert à le référencer depuis d'autres programmes pour l’utiliser. Cette clause est suivie de l'identification du programme composé de 1 à 30 caractères.

L'identifiant du programme, les noms de paragraphes et de variables peuvent utiliser les lettres et les chiffres et contenir des tirets comme séparateur (mais pas au début ou à la fin).

Exemple :

IDENTIFICATION DIVISION.
 PROGRAM-ID. EXEMPLE.
 AUTHOR. FR-WIKIBOOKS-ORG.

Le point marque la fin des noms de division, de clause et des valeurs associées à ces clauses.

Environnement du programme

[modifier | modifier le wikicode]

Cette division facultative décrit l'environnement dans lequel s'exécute le programme :

  • Ordinateur utilisé pour compiler le programme source,
  • Ordinateur utilisé pour exécuter le programme compilé.
ENVIRONMENT DIVISION.

Exemple :

ENVIRONMENT DIVISION.
 SOURCE-COMPUTER. CPU1.
 OBJECT-COMPUTER. CPU1.
 INPUT-OUTPUT SECTION.
  FILE-CONTROL.
   SELECT ...

Déclaration des données (variables, structures)

[modifier | modifier le wikicode]

Cette division facultative sert à définir les variables et structures utilisées par le programme.

DATA DIVISION.

Traitements (procédures)

[modifier | modifier le wikicode]

Cette division facultative contient les instructions du programme, sont regroupées en paragraphes. Un paragraphe est formé d’un nom suivi d’un point, et d’une séquence d'instructions, chacune terminée par un point.

PROCEDURE DIVISION.

Fin du programme

[modifier | modifier le wikicode]

La fin des division d'un programme est signalée par une ligne END PROGRAM suivie du nom du programme.

L'instruction STOP RUN met fin à l'exécution du programme, en provocant la fermeture de tous les fichiers ouverts.

Exemple de programme complet :

IDENTIFICATION DIVISION.
 PROGRAM-ID. EXEMPLE.
 AUTHOR. FR-WIKIBOOKS-ORG.
ENVIRONMENT DIVISION.
 SOURCE-COMPUTER. CPU1.
 OBJECT-COMPUTER. CPU1.
 INPUT-OUTPUT SECTION.
  FILE-CONTROL.
   SELECT ...
DATA DIVISION.
 FILE SECTION.
  FD FNOM LABEL RECORD STANDARD/OMITTED
  01 FENR.
     02 NOM1 PIC X(10).
 WORKING-STORAGE SECTION.
  66 NOM RENAMES NOMA THRU NOMB.
  77 INDEP PIC X(10)
     88 IND-OK VALUES 1 THRU 10.
     88 IND-KO VALUES 11 THRU 20.
PROCEDURE DIVISION.
END PROGRAM EXEMPLE.

Premier programme

[modifier | modifier le wikicode]

Le programme ci-dessous affiche "Bonjour monde !" après avoir effacé l'écran.

IDENTIFICATION DIVISION.
  PROGRAM-ID. bonjour-monde.
  DATE-WRITTEN. 2024/08/13.
  AUTHOR FR-WIKIBOOKS-ORG.

PROCEDURE DIVISION.
  bonjour-monde.
    DISPLAY " " LINE 1 POSITION 1 ERASE EOS.
    DISPLAY "Bonjour " LINE 12 POSITION 20 NO ADVANCING.
    DISPLAY "monde !".
    STOP RUN.

END PROGRAM bonjour-monde.

L'instruction DISPLAY est suivie des valeurs à afficher et de directives :

LINE y
Positionner le curseur sur la ligne indiquée.
POSITION x
Positionner le curseur sur la colonne indiquée.
ERASE EOS
Effacer (erase) tout jusqu'à la fin de l'écran (EOS : End Of Screen).
NO ADVANCING
Ne pas avancer le curseur à la ligne suivante.

Éléments du Cobol

[modifier | modifier le wikicode]
  • Ensemble de caractères
L'ensemble des caractères disponibles dépend du compilateur et de la plateforme. Toutes les versions supportent les caractères suivants :
  • les lettres majuscules ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • les chiffres 0123456789
  • (espace) et les caractères "$.,;<>()-+/*=
  • Identificateurs (nom de variables, fonctions, paragraphes)
Les lettres et chiffres ainsi que le tiret sont autorisés : [A-Z][0-9][-]
Exemple : 128A 128 IF TOTAL SOUS-TOTAL
Les identifiants complètement numériques (que des chiffres) sont autorisés mais découragés pour éviter la confusion avec les nombres.
Un identifiant peut utiliser le tiret mais pas en première ou dernière position.
  • Constantes
    • Numériques : [0-9], . (jamais à droite),+- (tjs devant)
 ex.: .0 13.34.56 -.45 .+65 -12.
    • Alphabétiques : "..." ""->1"
    • Figuratives : prédéfinies (tout numérique sauf 0 = alphanumérique).
{zero, zeros, zeroes} :0
{space, spaces} :
{quote,quotes} : "
{high-value, high-values} : met plus grande valeur que var peut recevoir
{low-value, loww-values} : met plus petite valeur que var peut recevoir
ALL : demande de repeter const non numerique

ex: ZERO(alphanum) // "ZERO"(alpha) // 0(num) // 0.0(num) // ALL ZERO(alpha) // ALL "ZERO"(alpha) // ALL (0(doit être non num))

PICTURE [V 9 X A]

77 A PIC 9(4)V99; VALUE 193654 >> |1|9|3|6|.|5|4|
77 B PIC X(3)XX; VALUE "A24ZE" >> |A|2|4|Z|E|
77 C PIC A;VALUE "Z" >> |A|

EDITION [. , / B 0] // [+ - $ CR DB] // [Z *] // [+ - $] SIGN // {LEADING/TRAILING} SEPARATE

77 A PIC S999;LEADING SEPARATE. (- devant)
77 B PIC S999;TRAILING SEPARATE. (- derriere)
77 C PIC S999;LEADING. (¢ devant)
77 D PIC S999;TRAILING. (¢ derriere)

VALUE

77 A PIC 999; VALUE 199.

USAGE // {DISPLAY/COMP}

77 B PIC 999;DISPLAY. (sauvé en car)
77 B PIC 999;COMP-0/3. (sauvé en bin).

REDEFINE

01 MONTANT PIC 9(4)V99.
01 REDEF REDEFINES MONTANT.
   02 EURO PIC 9(4).
   02 CENT PIC 99.
01 A REDEFINES MONTANT PIC 9(6).

RENAMES

66 NM RENAMES NB1 THRU DEF1.

FILLER // Var

01 ENREG.
   02 FILLER PIC X(30).
   02 CP PIC 9(4).
   02 FILLER PIC X(6).
      88 OK VALUE SPACE.

BLANK WHEN ZERO

77 A PIC 999; BLANK ZERO; VALUE ZERO.
77 B PIC ZZ9; BLANK ZERO; VALUE ZERO.
A<->" "/B<->" "
  • reservé
66 champ renommé
77 champ indépendant (non groupé)
88 réservé aux noms-conditions (vrai/faux)
  • de groupage
01 ARTICLE.
   02 DESCRIPTION PIC X(10).
      03 CODE-MAGASIN PIC XXX.
      03 NUMERO-COULEUR PIC 99.

EXPR ARITHMETIQUE

[modifier | modifier le wikicode]

[+ - * / **(exp)]

COMPUTE A, C = A*(B**-3). // A=A*(B**-3), C=A*(B**-3) //

élémentaires

[modifier | modifier le wikicode]
  • ACCEPT [VAR]
  • MOVE (X) TO D, E, F, G, H.
  • OPERATION
ADD (X) TO A, B.
ADD (X) GIVING C, D.
-> X : somme // X+A>A, X+B>B, X>C, X>D
SUBTRACT (X) FROM A, B.
SUBTRACT (X) FROM x1 GIVING C, D.
-> X : somme // A-X>A, B-X>B, x1-X>C, x1-X>D
MULTIPLY x1 BY A, B.
MULTIPLY x1 BY x2 GIVING C, D.
-> x1*A>A, x1*B>B, x1*x2>C, x1*x2>D
DIVIDE x1 INTO A, B.
DIVIDE x1 {INTO/BY} x2 GIVING C, D REMAINDER E.
-> A/x1>A, B/x1>B, x2/x1>C (into), x2/x1>D (into), x1/x2>C (by), x1/x2>D (by), x1-x2*D>E (reste)
OPT / ROUNDED : +5 au premier digit décimal non inclu
 77 A PIC 99V99; VALUE 23.43.
 77 B PIC 99V99; VALUE 35.56.
 77 C PIC 99V9.
-> A+B=58.99
ADD A,B GIVING C.
-> c = |5|8|9| = 58.9
ADD A,B GIVING C ROUNDED.
-> c(Rounded) = 58.99 + .05 = 59.04 = |5|9|0| = 59.0
OPT / ON SIZE ERROR = Sur partie entière, si champ trop petit, le champ n'est pas rempli et exec d'instruction.
 77 A PIC 999; VALUE 876.
 77 B PIC 999; VALUE 150.
 77 C PIC 999.
ADD A, B GIVING C; ON SIZE ERROR [instruction].
-> A+B=1026 - trop grand pour C >> exec d'instruction

IF [c1] [ins]

  ELSE IF [c2] [ins]
  ELSE [ins]
  • Condition de relation

[= < > <= >=]

... [NOT]= ...
... [NOT]> ...
... [NOT]< ...

  • Condition de classe
... [NOT] {numeric/alphabetic}
  • Condition de signe
... [NOT] {POSITIVE/NEGATIVE/ZERO} 
  • Condition de nom-condition
77 ETAT-CIVIL PIC 9.
   88 CELIBATAIRE VALUE 1.
   88 MARIE       VALUE 2.
   88 DIVORCE     VALUE 3.
   88 VEUF        VALUE 4.
   88 ETAT-CIVIL-FAUTIF VALUES ARE 0, 5 THRU 9.
   88 SANS-CONJOINT     VALUES ARE 1, 3, 4.

ETAT-CIVIL-FAUTIF si 0,5,6,7,8,9 (vrai) sinon (faux)

  • Condition composée

[( ) NOT AND OR]

IF MARIE AND FEMME OR (AGE > 30).
  • Condition de relation simplifiee
IF A=B OR A=C OR A>D
IF A=B OR =C  OR >D
IF A=B OR C   OR >D

Feuille de programme

[modifier | modifier le wikicode]

Feuille à 80 colonnes issue du modèle des cartes perforées.

Structure :

  • 1->6 : Num de séquence (facultatif)
  • 7 : Indicateur (*(cmt) /(cmt+nl) -(merge))
  • 8->72 : Ecriture du PRG (marge A : 8->11, marge B : 12->72)
  • 73->80 : Identification

. Le point ferme l'instruction en Cobol et il est suivi d'un espace.

IF A = B MOVE 1 TO C
    ELSE MOVE 3 TO C
         MOVE 1 To B D.

,; (facultatif) séparateur pour clarifier la notation

ELSE MOVE 3 TO C;
     MOVE 1 TO B, D.


Bases du Cobol

Divisions, sections, paragraphes

IDENTIFICATION DIVISION

[modifier | modifier le wikicode]

Identification du programme, n'est formé que de paragraphes.

78   |                 
 IDENTIFICATION DIVISION
*-----------------------
  PROGRAM-ID. EXEMPLE.
  AUTHOR. NOM.

ENVIRONMENT DIVISION

[modifier | modifier le wikicode]

CONFIGURATION SECTION. (obligatoire) [INPUT-OUTPUT SECTION] (facultatif)

 78    |                                          
  ENVIRONMENT DIVISION
 *--------------------
   CONFIGURATION SECTION.
    OBJECT-COMPUTER. MINTA.
    SOURCE-COMPUTER. MINTA.
    INPUT-OUTPUT SECTION.
     FILE-CONTROL.
      SELECT (F1) ASSIGN TO DISK;
                         FILE STATUS IS FS.
      SELECT (F2) ASSIGN TO PRINTER.

WORKING STORAGE SECTION.

[modifier | modifier le wikicode]
 78    |
  DATA DIVISION
 *-------------
   WORKING STORAGE SECTION.


Reçoit les vars

nombre_niveau {nom   } [clause] ...
              {FILLER}
  • nombre_niveau : niveau en pallier hiérarchique. En cobol tout est organisé en Enreg dont l'info principale est de niveau 1.
  • FILLER : ligne DUMMY
  • clause : taille/type/val. initiale

? Soit le champ article divisé en description et code article qui est divisé en code magasin et numéro couleur.

ARTICLE
DESCRIPTION
CODE ARTICLE
CODE MAGASIN NUMERO COULEUR
  • ici 3 Niveaux
  • Champs de groupes avec (.) contient :
  • des champs élémentaires.
78   |
 DATA DIVISION
*-------------------------
  WORKING STORAGE SECTION.
   01 ARTICLE.
      02 DESCRIPTION PIC X(10).
      02 CODE-ARTICLE. 
         03 CODE-MAGASIN PIC ---.
         03 NUMERO-COULEUR PIC 99.
   77 CPT PIC 99.
  • CARACTERES PICTURES (type de contenu de variable)

Les champs élémentaires reçoivent PIC :

  • 9 [0-9] ,v (donne position de virgule)
ex. : PIC 99v999 (trois chiffres après la virgule)
  • - alphanumérique
ex. : PIC -(6) = PIC - - - - - - (- alphanumériques)

PROCEDURE DIVISION

[modifier | modifier le wikicode]
  • Reçoit les instructions de PROG.
  • Reçoit toujours un paragraphe avant la premiére instruction.
  • Toutes les instructions vont en marge B.
 78   |
  PROCEDURE DIVISION
 *------------------
   PROG.
       ADD...
       MOVE...


Fichiers

Fichier séquentiel

[modifier | modifier le wikicode]
ENVIRONMENT DIVISION.
  ...
  INPUT-OUTPUT SECTION.
   FILE-CONTROL.
    SELECT FNOM ASSIGN TO (DISK/PRINTER);
           ORGANIZATION IS SEQUENTIAL;
           ACCESS MODE RANDOM;
           FILE STATUS IS FS.
    01 ENREG.
       02 NM1 PIC X(15).
       02 FILLER PIX X(5); VALUE SPACE.
       02 NM2 PIX X(20). 
  DATA DIVISION.
   FILE SECTION.
    FD FNOM LABEL RECORD STANDARD;
       VALUE OF FILE-ID IS "FNOM.DAT".

*OPEN (INPUT/OUTPUT/I-O/EXTEND) FNOM.
*READ FNOM [AT END [INS ... ]].
*WRITE ENREG.
*REWRITE ENREG. - open I-O.
*CLOSE FNOM.


? FACTURE DE GAZ - créer un fichier de consommation de GAZ avec le nom en X(16), adresse X(40), ville X(15) et consommation 9(4)V99. > CRÉER ce fichier en le remplissant et s'il existe déjà, on demande si on veut le détruire (o/n). > FAIRE menu (1. Sortie écran / 2. Rechercher par nom / 3. Ajouter des personnes au fichier / 4. Modifier - smenu (1. nom / 2. adresse / 3. ville / 4. consommation / 0. fin) / 5. Sortie imprimante / 0. fin)

? Rajouter une option d'impression de liste de consommation par client avec numéro en bas de page

fichier indexe

[modifier | modifier le wikicode]
  • OPEN (INPUT/ I-O/ OUTPUT) FICHIER - active CP
  • START FIC KEY IS ((>/ not</ =) nom); INVALID KEY...
    • seq.: Act et pointe CP pour lecture séq.
    • rand: START
    • dyn.: Tous sens.
  • READ
    • seq.: READ ... [AT END ...]; INVALID KEY ...
    • ran.: READ ... KEY IS ...; INVALID KEY ...
    • dyn.: direct / READ ... KEY IS ...; INVALID KEY ...
    • dyn.: sequen / READ ... NEXT [AT END ...]
  • REWRITE ... ; INVALID KEY ... - modif tt sauf CP
  • DELETE FNOM; INVALID KEY ... - charge CP et eff() ENREG
  • WRITE ENREG; INVALID KEY ... - I-O (ajouter), OUTPUT (écrire).
  • CLOSE FNOM

Soit le fichier suivant // (CP-ClePrimaire) est NUM-PROD et (CleAlternative) est DES-PROD

      *8   |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
       ENVIRONMENT DIVISION
       ...
       INPUT-OUTPUT SECTION.
        FILE-CONTROL.
   
         SELECT FPROD ASIGN TO DISK;
                ORGANIZATION INDEXED;
                ACCESS MODE ...
                RECORD KEY IS NUM-PROD;
                ALTERNATE RECORD DES-PROD DUPLICATES;
                FILE STATUS IS STAT-PROD.


       DATA DIVISION.
        FILE SECTION.

         FD FPROD LABEL RECORD STANDARD;
            VALUE OF FILE-ID IS "FPROD.DAT".

         01 ENR-PROD.
            02 NUM-PROD.
               03 FAM-PROD PIC XX.
               03 FILLER PIC X(4).
            02 NOM-PROD.
               03 DES-PROD PIC X(5).
               03 FILLER PIC X(10).
            02 INFO PIC XX.

        WORKING-STORAGE SECTION.
          
         77 STAT-PROD PIC XX.

? 1/ Faire programme pour CREER, REMPLIR, AFFICHER, MODIFIER, EFFACER dans ce fichier

  • acces sequentiel
? 2/ En acces sequentiel, afficher tout le fichier
? 3/ Afficher tous les produits dont le nom commence par B
  • acces random
? 4/ Entrer un numero de produit et l'afficher
  • acces dynamique
? 5/ En dynamic, affichet tous les produits dont le nom est "rivet"
? 6/ Faire les 5 exercices precedents en acces dynamique
? 7/ Afficher le 1er produit sans faire OPEN à partir de n'importe ou
? 8/ Pour tous les produits de la famille K2, si l'info est AA, elle devient XX. Si l'info est BB, on supprime le produit.
? 9/ Afficher tous les produits à partir du produit H51025. (En 2 versions // Toujours le faire / Le faire uniquement s'il est dedans)

fichier relatif

[modifier | modifier le wikicode]
  • SELECT
  SELECT FICHIER ORGANISATION RELATIVE;
         ACCESS MODE [sequential/random/dynamic];
         RELATIVE KEY IS [VAR];
         STATUS IS [VAR].
  • OPEN
  OPEN {INPUT/OUTPUT/I-O} [FICHIER]
  • START
  START [FNOM] KEY IS {=/>/NOT <} clé-relative;
  [INVALID KEY]
  • READ
    • sequentiel : READ ... AT END ...
    • random : READ ... INVALID KEY ...
    • dynamic :
seq : READ ... NEXT AT END ...
dir : READ ... INVALID KEY ...
  • REWRITE [ENREG] INVALID KEY ...
En random ecrit en fonction de la cle.
En dynamique ecrit le dernier lu.
  • DELETE FNOM INVALID KEY ...
En dynamique efface à la clé.
En seqentiel efface le dernier lu.
  • WRITE [ENREG]; INVALID KEY ...
I-O
Pas en séquentiel.
Random et dynamique, en fonction de clé
OUTPUT
Crée dans ordre croissant de la clé.
  • Chaque entrée/sortie fichier génère un status.
FS I/O ORGANISATION MODE SIGNIFICATION
00 All All All Successful
02 REWRITE WRITE Ind All Created duplicate alternate key
02 READ Ind All Detected alternate duplicate key
04 READ All All Record not size of user's buffer
05 OPEN All All Optional file not present
07 CLOSE OPEN All All Invalid file organization or device
10 READ All Seq No next logical record or option file not present (at end)
14 READ Rel All Relative record number too large
21 REWRITE Ind Seq Primary key changed after READ
21 WRITE Ind Seq Attempted nonascending key value (invalid key)
22 REWRITE Ind All Duplicate alternate key (invalid key)
22 WRITE Ind, Rel Ran Duplicate key (invalid key)
23 DELETE READ REWRITE START Ind, Rel Ran Record not in file; optional file not present (invalid key)
24 WRITE Ind, Rel All Boundary violation or relative record number too large (invalid key)
30 All All All All other permanent errors
34 WRITE Seq Seq Boundary violation
35 OPEN All All File not found
37 OPEN All All Inappropriate device type
38 OPEN All All File previously closed with lock
39 OPEN All All Conflict of file attributes
41 OPEN All All File already opened
42 CLOSE All All File not opened
43 DELETE REWRITE All Seq No previous READ or START
44 REWRITE WRITE All All Invalid record size
46 READ All Seq No valid next record (at end)
47 READ START All All File not open, or incompatible open mode
48 WRITE All All File not open, or incompatible open mode
49 DELETE REWRITE All All File not open, or incompatible open mode
90 All All All Record locked by another user (record available)
91 OPEN All All Open is unsuccessful; file locked by another access stream
92 DELETE READ REWRITE START WRITE All All Record locked by another user (record not available)
93 UNLOCK All All No current record
94 UNLOCK All All File not open, or incompatible open mode
95 OPEN All All No file space on device


Tables

Acces par Indice, Index, Search

  • OCCURS (1 par dimension)
ne va pas en 01 66 77 88
01 TAB.
   02 ELEM PIC 99; OCCURS 10.
      88 NUL VALUE 0.

*INITIALISATION.
01 TAB; VALUE "0102030405".
   02 ELEM PIC 99; OCCURS 5.
->TAB (5*2bit)
01 TAB.
   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 TAB-MOIS REDEFINES TAB.
   02 MOIS PIC X(9) OCCURS 12.
->TAB et TAB-MOIS (9*12bit)

Multidimension

[modifier | modifier le wikicode]
01 ECOLE.
   02 NOM-ECOLE PIC X(20).
   02 CLASSE OCCURS 15.
      03 NOM-CLASSE PIC X(10).
      03 ELEVES OCCURS 20.
         04 NOM-ELEVE PIC X(20).
         04 ADR-ELEVE PIC X(30).
      03 PROF OCCURS 10.
         04 NOM-PROF PIC X(20).
         04 COURS OCCURS 5.
            05 INTITULE PIC X(15).
            05 HEURES PIC 99.
-> INTITULE(15, 10, 5) // INTITULE du 5e cours de 10e prof de 15e classe
-> COURS(15, 10, 5) // INTITULE+HEURES du 5e cours de 10e prof de 15e classe
-> NOM-PROF(15, 10) // NOM-PROF du 10e prof de 15e classe
-> PROF(15, 10) // 10e PROF de 15e classe
-> ADR-ELEVE(15, 11) // ADR-ELEVE de 11e eleves de 15e classe
-> NOM-CLASSE(3) // NOM-CLASSE de 3e classe

Recherche dans un tableau

[modifier | modifier le wikicode]
PERFORM RCH VARYING I FROM 1
                      BY   1
                      UNTIL I > 15
            AFTER   J FROM 1
                      BY   1
                      UNTIL J > 20 OR ADR-ELEVE(I, J) = "DANIEL".
  • accelere la recherche sur champs:
01 TAB.
   02 A OCCURS 5; INDEXED BY I1.
      03 B OCCURS 7; INDEXED BY I2, I3.
         04 C PIC 9; OCCURS 4 INDEXED BY I4
-> Chaque tab reçois un index !
Dans l'exemple suivant si C(4, 2, 3)=7 est le premier 7 trouvé, on aura un arret à ((3*7*4)+(1*2*3)) soit la 90e boucle de I4.
PERFORM RCH VARYING I1 FROM 1
                       BY   1
                       UNTIL I1 > 5
            AFTER   I2 FROM 1
                       BY   1
                       UNTIL I2 > 7 
            AFTER   I4 FROM 1
                       BY   1
                       UNTIL I4 > 9 OR C=(I1, I2, I4) = 7.
  • index permet le calcul et les const-> C(I1+3, I2-7, (4+3))
  • l'adressage n'accepte pas la présence d'indice et index en même temps// C(Index,1,indice)
  • SET index TO {index/ch-index/entier} //initialiser
  • SET index1, index2 {UP/DOWN} by entier //incrementer
  • champ index : sert à sauver valeur d'un index
77 CH-INDEX USAGE INDEX.
SEARCH nom [VARYING{index/ch-index/ch-entier}]
[AT END ins]
[WHEN cond1 {ins/NEXT SENTENCE}]
[WHEN cond1 {ins/NEXT SENTENCE}]
...
OCCURS entier TIMES
{{ASCENDING/DESCENDING} KEY IS nom1 (nom2)...}...
INDEXED nom1 [,nom2...
  • Sur champs triés
SEARCH ALL nom1
[AT END ins]
WHEN {nom-cond/nom2{EQUAL}{expr/const/ident}
[AND{nom-cond/nom2{EQUAL}{expr/const/ident}]
{ins/NEXT SENTENCE}
INSPECT ident1 TALLYING
{ident2 FOR {{{ALL/LEADING}CHARACHTER}{ident3/literal1}}
[{before/after} INITIAL {ident4/literal2}]}...}...
STRING {{ident1/cont1}[ident2/const2]...
DELIMITED BY {ident1/const1/SIZE}}...
INTO ident4 [WITH POINTER ident5]
[ON OVERFLOW ins]
UNSTRING identificateur-1
[DELIMITED BY [ALL] {ident1/constante1},[OR[ALL] {ident1/const1}]]
INTO {ident4([DELIMITER ident5]/[COUNT ident6])}
[WHITH POINTER ident7]
[TALLYING ident8]
[ON OVERFLOW ins]

Exercices de synthese

[modifier | modifier le wikicode]

? Faire la gestion d'une bibliotheque ?

Partant des deux fichiers FLIVRE et FTHEME, faire
A/ MenuPrincipal
1/ Ajout new livre (ouvre SousMenu2).
2/ Ajout nouvel exemplaire
3/ Modifier un livre
4/ Recherche de livre par (1/ titre, 2/ autheur, 3/ code, (? 4/ theme))
B/ SousMenu2
>Sort tous les enreg de FTHEME + num (a introduire en A1)
       |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |
       ENVIRONMENT DIVISION.
       ...
       INPUT-OUTPUT SECTION.
        FILE-CONTROL.

         SELECT FLIVRE ASSIGN TO DISK
                ;ORGANIZATION INDEXED
                ;ACCESS MODE DYNAMIC
                ;RECORD KEY IS COD-LIV
                ;ALTERNATE ...
                ;STATUS IS SLIV.

         SELECT FTHEME ASSIGN TO DISK
                ;ORGANIZATION RELATIVE
                ;ACCESS MODE ...
                ;RELATIVE KEY IS ...
                ;STATUS IS STHEME.

       DATA DIVISION.
        FILE SECTION.
         FD FLIVRE LABEL RECORD STANDARD
            VALUE OF FILE-ID IS "FLIVRE.DAT".

         01 ENR-LIV.
            02 CODE PIC X(5).
            02 TITRE PIC X(30).
            02 AUTHEUR PIC X(15).
            02 THEME PIC 99.
            02 QTY-LIV PIC 99.
            02 QT-RESTE PIC 99; COMP-0.

         FD FTHEME LABEL RECORD STANDARD
            VALUE OF FILE-ID IS "FTHEME.DAT".

         01 ENR-THE.
            02 DESC PIC X(20).
            02 RAYON PIC X(8).
            02 QT-MAX PIC 99.

        WORKING STORAGE SECTION.

         ...


Liens

Autres projets

[modifier | modifier le wikicode]
GFDL GFDL Vous avez la permission de copier, distribuer et/ou modifier ce document selon les termes de la licence de documentation libre GNU, version 1.2 ou plus récente publiée par la Free Software Foundation ; sans sections inaltérables, sans texte de première page de couverture et sans texte de dernière page de couverture.


  1. https://www.mainframestechhelp.com/tutorials/cobol/coding-sheet.htm