Acces par Indice, Index, Search

  • OCCURS (1 par dimension)
ne va pas en 01 66 77 88

Une dimension

modifier
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

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

indices

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

search all

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

modifier
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

modifier
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

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

         ...