« Cobol ANS 74 » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Ligne 2 081 : Ligne 2 081 :
DISPLAY "4/ PAR THEME".
DISPLAY "4/ PAR THEME".
DISPLAY "5/ QUITTER".
DISPLAY "5/ QUITTER".
</pre>
}}

<b>? Rajouter au programme de gestion de bibliotheque les modules CLIENT, PRET et COMMANDE ?</b>
:+ Ajouter au module recherche de livres une option "par debut de titre".
:+ Effacer un livre.
:A/ Fichier CLIENT (indexe)
::+ Fichier sequentiel contenant le dernier N°Client utiliser pour l'attribution des N°
::+ Max trois avertissements par client pour pret
::CP : N°Client (annee (99) + num (9(4))), nom, prenom, adresse, #livre en pret(9), #avertissements(9)
::1/ New client
::2/ Modifier client
::3/ Effacer client
:B/ Fichier PRET (indexe)
::CP : N°Membre (x(3)), n°livre (x(3)), date emprunt
::+ Max 5 prets par client::1/ Encodage
::2/ Modification
::3/ Retour de livres (N°Client, N°Livre)
:::-Bon etat remis en LIVRE
:::-Sinon (A commander)
::Mise a jour dans fichiers lies
:C/ Fichier COMMANDE (sequentiel) 1 par theme
::N°Livre, QT à commander
:D/ Fichier d'impression pour les sorties (creation de fichiers tampons autorisee)
::-gestion des retard (tous les mois)
::-liste client (alphabetique)
::
{{Boîte déroulante|titre= :: GESTION DE BIBLIOTHEQUE // PARTIE 2 :: à optimiser|contenu=
<pre>
| | | | | | | | | | | | | | | | |
* GESTION DE BIBLIOTHEQUE // PARTIE 2
*-----------------------------------------------

</pre>
</pre>
}}
}}

Version du 26 novembre 2007 à 01:36

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)

Livre à fractionnerlink={{{link}}}

Il a été suggéré de fractionner ce livre en plusieurs sous-pages afin d'améliorer sa lisibilité.

Généralités

Historique

Le language 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é, 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 languagte fut ensuite revu, amélioré et complété en 61, 65 et 68. C'est en 1968 que 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. Actuellement, on suit les normes du ANS COBOL 1974. Ce sont celles que nous étudierons dans ce cours.

Objectifs du COBOL

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 COBOL

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

         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

4 Divisions par Programme

IDENTIFICATION DIVISION.
 PROGRAM-ID. PROG.
 AUTHOR. AUT.
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. 

Elements du Cobol

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

Clauses

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 niveau

  • 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

[+ - * / **(exp)]

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

INSTRUCTIONS

élémentaires

  • 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ôle

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

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

Symboles

. 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

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

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

ENVIRONMENT DIVISION

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 DIVISION

WORKING STORAGE SECTION.

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


Les champs

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 XXX.
         03 NUMERO-COULEUR PIC 99.
   77 CPT PIC 99.
  • CARACTERES PICTURES (type de contenu de variable)

Les champs élémentaires recoivent PIC :

  • 9 [0-9] ,v (donne position de virgule)
ex: PIC 99v999 (trois chiffres après la virgule)
  • X alphanumerique
ex: PIC X(6) = PIC XXXXXX (6 alphanumeriques)

PROCEDURE DIVISION

  • 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

 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. > CREER ce fichier en le remplissant et s'il existe dejà, 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 numero en bas de page

fichier indexe

  • 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

exercices

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

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

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

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)

Multitables

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

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

indices

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

index

  • 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

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 all

  • 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

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

string

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

unstring

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

? 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