Cobol ANS 74/Version imprimable

Nuvola-inspired File Icons for MediaWiki-fileicon-ps.png

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

HistoriqueModifier

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 language 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 COBOLModifier

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 language 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 COBOLModifier

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 COBOLModifier

         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.


Structure générale

FormatModifier

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.

Format fixeModifier

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

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.

Format libreModifier

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.

AffichageModifier

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

4 Divisions par ProgrammeModifier

Un programme est divisé en quatre divisions :

IDENTIFICATION DIVISION.
(Obligatoire) Identification du programme par un nom composé de 1 à 30 caractères.
IDENTIFICATION DIVISION.
 PROGRAM-ID. EXEMPLE.
 AUTHOR. FR-WIKIBOOKS-ORG.
ENVIRONMENT DIVISION.
Description de l'environnement de programme :
  • Ordinateur utilisé pour compiler le programme source
  • Ordinateur utilisé pour exécuter le programme compilé
ENVIRONMENT DIVISION.
 SOURCE-COMPUTER. CPU1.
 OBJECT-COMPUTER. CPU1.
 INPUT-OUTPUT SECTION.
  FILE-CONTROL.
   SELECT ...
DATA DIVISION.
Définition des données (structures, variables) utilisées.
PROCEDURE DIVISION.
Définition des instructions du programme à exécuter.
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.

Éléments du CobolModifier

  • Identificateurs (nom var, f., paragraphes)
[A-Z][0-9][-]
ex.: 128A 128 -ABC IF NUM.ART total
  • Constantes
    • Numeriques: [0-9], . (jamais à droite),+- (tjs devant)
 ex.: .0 13.34.56 -.45 .+65 -12.
    • Alphabetiques: "..." ""->1"
    • Figuratives: prédéfinies (tout numérique sauf 0 = alphanumerique).
{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))

ClausesModifier

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<->" "

Nombre niveauModifier

  • 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 ARITHMETIQUEModifier

[+ - * / **(exp)]

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

INSTRUCTIONSModifier

élémentairesModifier

  • 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

de contrôleModifier

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 programmeModifier

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

SymbolesModifier

. 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

Cette page est considérée comme une ébauche à compléter . Si vous possédez quelques connaissances sur le sujet, vous pouvez les partager en éditant dès à présent cette page (en cliquant sur le lien « modifier »).

Ressources suggérées : Aucune (vous pouvez indiquer les ressources que vous suggérez qui pourraient aider d'autres personnes à compléter cette page dans le paramètre « ressources » du modèle? engendrant ce cadre)


Divisions, sections, paragraphes

IDENTIFICATION DIVISIONModifier

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

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

ENVIRONMENT DIVISIONModifier

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.

DATA DIVISIONModifier

WORKING STORAGE SECTION.Modifier

 78    |
  DATA DIVISION
 *-------------
   WORKING STORAGE SECTION.


Les champsModifier

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 DIVISIONModifier

  • 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équentielModifier

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 indexeModifier

  • 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

exercicesModifier

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 relatifModifier

  • 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é.

files statusModifier

  • Chaque E/S fichier genere 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

Une dimensionModifier

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)

MultitablesModifier

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)

MultidimensionModifier

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 tableauModifier

indicesModifier

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

indexModifier

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

searchModifier

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

search allModifier

  • 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}

inspectModifier

INSPECT ident1 TALLYING
{ident2 FOR {{{ALL/LEADING}CHARACHTER}{ident3/literal1}}
[{before/after} INITIAL {ident4/literal2}]}...}...

stringModifier

STRING {{ident1/cont1}[ident2/const2]...
DELIMITED BY {ident1/const1/SIZE}}...
INTO ident4 [WITH POINTER ident5]
[ON OVERFLOW ins]

unstringModifier

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 syntheseModifier

? 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 projetsModifier

Autres sitesModifier

  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.