Vous êtes sur la page 1sur 62

ESAT-DI [LRE] page XV-1

Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-


indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV LES FICHIERS EN ORGANISATION SÉQUENTIELLE INDEXÉE...................................................................................1


XV.A PRINCIPE................................................................................................................................................................................1
XV.B ETUDE PRATIQUE.....................................................................................................................................................................3
XV.B.1 La phrase select......................................................................................................................................................................3
XV.B.1.1 format [visualisation en mode page]..............................................................................................................................................3
XV.B.1.2 Le « ASSIGN STATIQUE ».............................................................................................................................................................4
XV.B.1.3 Le « ASSIGN DYNAMIQUE »........................................................................................................................................................4
XV.B.1.4 Le « ASSIGN EXTERNE »...............................................................................................................................................................4
XV.B.1.5 Les ASSIGN pour les périphériques.................................................................................................................................................4
XV.B.1.6 Règles générales de la phrase SELECT............................................................................................................................................5
XV.B.1.7 Règles SELECT spécifiques au séquentiel-indexé...........................................................................................................................5
XV.B.1.8 LE FILE STATUS.............................................................................................................................................................................6
XV.B.2 La phrase FD..........................................................................................................................................................................9
XV.B.2.1 Format...............................................................................................................................................................................................9
XV.B.2.2 Règles-remarques............................................................................................................................................................................10
XV.B.3 Ouverture du fichier : OPEN...............................................................................................................................................10
XV.B.3.1 format..............................................................................................................................................................................................10
XV.B.3.2 règles ..............................................................................................................................................................................................10
XV.B.4 Entrée-sortie (I-O) en mode d’accès séquentiel (SEQUENTIAL)......................................................................................13
XV.B.4.1 lecture..............................................................................................................................................................................................13
XV.B.4.2 écriture.............................................................................................................................................................................................16
XV.B.4.3 effacement.......................................................................................................................................................................................18
XV.B.4.4 positionnement dans le fichier (start)..............................................................................................................................................19
XV.B.5 Entrée-Sortie (I-O) en mode d’accès direct (RANDOM)...................................................................................................21
XV.B.5.1 lecture..............................................................................................................................................................................................21
XV.B.5.2 écriture.............................................................................................................................................................................................23
XV.B.5.3 effacement.......................................................................................................................................................................................25
XV.B.6 Entrée-sortie (I-O) en mode d’accès dynamique (DYNAMIC)..........................................................................................26
XV.B.6.1 lecture..............................................................................................................................................................................................26
XV.B.6.2 écriture.............................................................................................................................................................................................31
XV.B.6.3 effacement.......................................................................................................................................................................................33
XV.B.6.4 positionnement dans le fichier (START)........................................................................................................................................34
XV.C EXERCICES - EXEMPLES...........................................................................................................................................................36
XV.C.1 jeu d’essai utilisé dans les exemples....................................................................................................................................36
XV.C.2 consultation en mode séquentiel à partir d’une clé secondaire.........................................................................................37
XV.C.3 création d’un séquentiel-indéxé (avec SPLIT KEY) ...........................................................................................................39
XV.C.4 création d’un séquentiel-indexé (directement par un tri USING-GIVING).......................................................................41
XV.C.5 exemples de START (mode séquentiel)................................................................................................................................42
XV.C.6 restructuration d’un séquentiel-indexé................................................................................................................................46
XV.C.7 exemple de START avec split-key........................................................................................................................................48
XV.C.8 mise à jour............................................................................................................................................................................51
XV.C.9 consultation en mode DYNAMIC ........................................................................................................................................55
XV.D VIDAGE PHYSIQUE..................................................................................................................................................................59
XV.D.1 le format IDXFORMAT »4 »...............................................................................................................................................59
XV.D.2 Les problèmes de compression............................................................................................................................................59

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 1


ESAT-DI [LRE] page XV-1
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

II

III

IV

VI

VII

VIII

IX

XI

XII

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 1


ESAT-DI [LRE] page XV-2
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XIII

XIV

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 2


ESAT-DI [LRE] page XV-1
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV Les fichiers en organisation séquentielle indexée

XV.A Principe

• Les fichiers en organisation séquentielle indexée (séq-ind) possèdent une structure physique qui permet d’accéder directement à l’article
voulu grâce à des clés qui ont été définies lors de la création initiale.

• Il existe deux types de clés :

la clé primaire (ou RECORD KEY ou PRIME KEY) est un champ alphanumérique de l’article ayant une valeur unique qui constitue
donc un identifiant.

Les clés secondaires (ou ALTERNATE KEY) qui sont des champs de l’article pour lesquels les doublons sont autorisés .

Un fichier logique séq-ind est en fait constitué de deux fichiers physiques : en effet ,les clés d’un fichier séq-ind ne sont pas rangées avec les
données mais font l’objet d’un fichier spécifique : le fichier des index.

représentation d’un fichier séquentiel-indexé

FICHIER DES INDEX

LES CLES PRIMAIRES

FICHIER
DES
DONNEES
LES CLES
SECONDAIRES
N°1

PS / CBL85 LES CLES


SECONDAIRES
N°2

CLE PRIMAIRE

N° date de
1 élève Nom Prén. grade divers naissance arme
x x(7) x(20) x(15) x(3) x(250) AAMMJJ xxx
CLE SECONDAIRE N°1 CLE SECONDAIRE N°2

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 1


ESAT-DI [LRE] page XV-2
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

• L’organisation séquentielle-indexée consiste à ranger les enregistrements en ordre croissant sur la zone «clé-primaire» : lors d’une création
initiale à partir d’un fichier en organisation séquentielle , celui-ci doit donc impérativement être trié sur cette rubrique.

Ce rangement concerne essentiellement les clés primaires du fichier des index qui permettent de retrouver tous les enregistrements du
fichier des données dans l’ordre croissant même si physiquement ils sont en désordre dans celui-ci.

NB1 : dans le fichier des données , les articles ne restent pas rangés en croissant sur le champ clé-primaire notamment lorsqu’on a réalisé
des suppressions puis des créations qui ont occupé les espaces disponibles.

NB2 : sur certains systèmes (ex les fichiers BULL des DPS8000,9000,..) les articles du fichier des données sont chaînés et chacun pointe
sur l’article ayant la clé primaire suivante dans l’ordre croissant.

• Le fichier des index est constitué de tables qui contiennent les adresses dans le fichier des données des articles recherchés.

Ces tables peuvent être organisées physiquement de plusieurs façons différentes ; une des plus performante et des plus utilisée est celle qui
consiste à stocker les clés dans une structure en arbre binaire. : on parle alors de fichiers séquentiel-indexés de type BTRIEVE ou B-TREE .
(NB : dans le paragraphe D , nous étudierons les fichiers dits IDXFORMAT4 qui utilisent ce procédé)

• La clé primaire d’un enregistrement n’est jamais modifiée : on peut supprimer l’article concerné puis en créer un nouveau avec la valeur
de clé primaire correcte.

• Les clés secondaires sont des champs modifiables : il faut donc avoir conscience que lorsqu’on fait une mise à jour sur une telle zone , le
système est obligé de mettre à jour également le fichier des index. => si on fait beaucoup de modifications sur des rubriques « clés-
secondaires » , les durées de traitement peuvent augmenter sensiblement.
( => ne pas créer des clés secondaires si elles ne sont pas vraiment utiles)

• Une fois créés, ces fichiers séquentiel-indexés peuvent être traités comme des fichiers en organisation séquentielle c’est-à-dire en lisant les
articles les uns après les autres séquentiellement ou en écrivant les enregistrements dans l’ordre des clés primaires : il s’agit du mode
d’accès séquentiel (ACCESS MODE SEQUENTIAL dans la phrase select).

Ce mode ne présente aucun intérêt particulier ; il peut cependant être utilisé si on veut traiter tous les articles du fichier ou lorsqu’on veut
restructurer les informations.

[restructuration :
Après n mises à jour (modifications,créations,suppressions) le fichier des données peut contenir des « trous » et les index peuvent ne pas être
organisés pour offrir le meilleur rendement : il est donc souhaitable , de temps en temps (en fonction du volume des mises à jour ) de vider
tout le fichier séquentiel-indexé sur un fichier séquentiel trié sur la clé primaire et de refaire la création initiale.]
(CF l’exemple au paragraphe C6)

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 2


ESAT-DI [LRE] page XV-3
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

• L’intérêt principal de ce type de fichier est de permettre l’accès (lecture ou écriture) direct et rapide à l’enregistrement souhaité en
remplissant avec la valeur recherchée la clé concernée (primaire ou secondaire) : il s’agit de l’accès direct (ACCES MODE RANDOM
dans la phrase select).
A chaque opération d’entrée-sortie le système consulte le fichier des index et obtient directement l’adresse utile dans le fichier des
données.

• L’accès dynamique (ACCES MODE DYNAMIC dans la phrase select ) qui permet de combiner les deux modes précédents est le plus
utilisé.
Il permet ,par exemple, d’accéder directement à un enregistrement à partir d’une clé puis de lire séquentiellement tous ceux qui ont la même
valeur de clé.

NB : Chaque mode d’accès (décrit ci-dessus) a ses instructions d’entrée-sortie (read,write,...) spécifiques [ cf les paragraphes B4 ,B5 ,B6]

XV.B Etude pratique

XV.B.1 La phrase select

XV.B.1.1 format [visualisation en mode page]

SELECT [ OPTIONAL ] file-name-1


NOT OPTIONAL
ASSIGN TO

external-file-reference
[ ]
{ [ EXTERNAL }
EXTERNAL DISK data-name-1
DYNAMIC littéral-1

DYNAMIC
DISK FROM data-name-1 ]
[ RESERVE entier-1
no
alternate AREA
AREAS
]
[ ORGANIZATION IS ] INDEXED

[ ACCESS MODE IS SEQUENTIAL


RANDOM
DYNAMIC ]

[LOCK MODE IS {MANUAL} WITH LOCK ON [MULTIPLE] RECORD(S) ]


{AUTOMATIC} ROLLBACK
EXCLUSIVE

RECORD KEY IS {data-name-5}


{split-key-name-1 = data-name-6 [data-n-7]...}.
[password is data-name-11]

ALTERNATE RECORD KEY IS data-name-8


[
]
split-k-n-2 = data-n-9 [data-n-10]....
[with duplicates]
[password is data-name-11]
[suppress [when] zeroes ou zeros ou spaces ou all littéral]

[ FILE STATUS IS data-name-2 ] .

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 3


ESAT-DI [LRE] page XV-4
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.1.2 Le « ASSIGN STATIQUE »

• On parle de fichier assigné en statique car le nom du fichier externe est donné « en dur » sous la forme d’un littéral.

• Le mot DISK (facultatif) nous permet de donner le nom externe du fichier (littéral-1) soit dans la phrase select soit dans la phrase FD.
Si on ne spécifie pas « littéral-1 » avec DISK ni dans la select et ni dans la phrase FD , le nom choisi pour définir le nom externe est celui
du nom interne (file-name-1).

XV.B.1.3 Le « ASSIGN DYNAMIQUE »

• C’est le mode le plus performant car le nom externe du fichier peut être fourni directement (ou même être changé) lors de l’exécution du
programme.

• On parle de fichier assigné en dynamique lorsqu’on fournit un nom-donnée en nom externe avec l’option « DYNAMIC ».
ex : select monfichier assign to dynamic [disk] wzone.
NB: le mot DYNAMIC est facultatif si on utilise la directive de compilation ASSIGN »DYNAMIC ».

[CF l’exemple C5 ou le nom du fichier imprimante résultat varie en dynamique ; cet exemple qui fonctionne sans la clause DYNAMIC
semble démontrer que celle-ci est implicite ]

XV.B.1.4 Le « ASSIGN EXTERNE »

• Il y a deux méthodes pour assigner un fichier en « externe » : soit utiliser une variable d’environnement du système , soit utiliser un fichier
système spécifique au cobol micro-focus : le External File Mapper qui contient les associations entre noms internes et externes.(ce
deuxième cas qui permet de lancer des batch à l’aide de jcl ne sera pas étudié dans ce cours).

• Pour le cas avec variable d’environnement , c’est le littéral-1 de la phrase select qui définit son nom (si le littéral contient des « - » le nom
de la variable est la chaîne de caractères qui suit le dernier tiret).

ex : select monfichier assign to EXTERNAL comment-çà-va


(avant l’exécution du programme , il faut avoir mis une valeur à VA avec la commande SET ; ex :
SET VA=c:\cobol\calculs.dat)

• Pour avoir le mode externe par défaut on utilise la directive de compilation ASSIGN »EXTERNAL ».

XV.B.1.5 Les ASSIGN pour les périphériques

• On peut écrire un programme qui envoie directement les données à l’imprimante ou vers un port de communication.
Les noms de périphériques suivants peuvent être spécifiés dans la phrase select :

CON clavier ou écran


PRN première imprimante parallèle
LPT1 première imprimante parallèle
LPT2 deuxième ..
LPT3 troisième ...
COM1 premier port asynchrone série
COM2 deuxième ..
on peut également donner un nom de lecteur « A: » , »B: » , ...

ex : select monfichier assign to « con » permet d’accéder à l’écran en lecture ou en écriture

ex : select tonfichier assign to wzone.


move « lpt1 » to wzone

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 4


ESAT-DI [LRE] page XV-5
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.1.6 Règles générales de la phrase SELECT

• si le mode d’accès n’est pas spécifié , c’est le mode d’accès séquentiel qui est pris par défaut.

• File-name est toujours le nom interne du fichier qui sera utilisé par la suite dans tout le programme.

• n-donnée-1 peut être déclaré dans la data division comme une zone groupe ou une zone en alphanumérique (assez grande pour contenir le
nom du fichier).
Si elle n’est pas déclarée dans le programme , le système cobol la déclare implicitement (sous la forme d’une zone en pic x(65) ).
Avec l’option FROM , elle doit être explicitement déclarée en data division.

• l’option « not optional » n’est valide (ou active) que si le fichier est ouvert en I-O.
Optional signifie que le fichier n’est pas nécéssairement présent au moment de l’exécution. (cette option ne s’applique qu’aux fichiers
ouverts en I-O ou extend ou input)

• External-file-reference , littéral-1 , nom-données-1 indiquent toujours le nom externe du fichier.

• littéral-1 ne peut pas être utilisé si on a mis l’option EXTERNAL ou DYNAMIC.

• Si on a choisi l’option DYNAMIC , le mot écrit pour définir le nom externe du fichier sera interprété comme une référence externe (cf
b14).

XV.B.1.7 Règles SELECT spécifiques au séquentiel-indexé

• Le split-key-name est le nom qui représente la concaténation d’une ou plusieurs rubriques de l’article ; il ne peut être utilisé que dans un
verbe START ou READ.[cf exemple parag C3]

• nom-donnée-5 , 6 , 9 ,10 , . . . . doivent être décrit dans l’enregistrement du fichier considéré ( en FD).

• les noms de clé (n-d-5 et n-d-8) ainsi que tous les nom-données qui constituent une split-key ne doivent pas être des champs à longueur
variable.

• Les clés secondaires (n-d-8) ne doivent pas être incluses dans la primaire ( n-d-5 ..)ou dans les autres secondaires.

• Quand le mode d’accès séquentiel est choisi , on accède aux articles en ordre croissant sur la clé primaire. (ou en croissant sur une clé
secondaire choisie comme clé de référence par un START)

• Quand le mode RANDOM est spécifié , la valeur de la clé primaire indique l’article auquel on veut accéder directement.

• La clause RECORD KEY spécifie le nom de la clé primaire.

• Si le fichier a plusieurs descriptions d’articles , le nom de la clé primaire ne doit apparaître que dans l’une d’entre elles.

• La clause ALTERNATE RECORD KEY permet de définir les clés secondaires.(with duplicates autorise les doubles sur cette clé).

• La clause SUPPRESS permet de définir une SPARSE KEY (notion spécifique à cobol-micro-focus).
Une sparse key est une clé pour laquelle aucune valeur n’est stockée dans le fichier des index.

Exemple : on peut définir une sparse key avec la valeur « espace » : quand la clé considérée ne contient que des espaces , aucune entrée
n’est créée sur le fichier des index.

Cette option ne concerne que les clés secondaires ; elle permet éventuellement de diminuer la taille du fichier des index.

IL suffit de mettre la clause SUPPRESS pour créer une sparse key.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 5


ESAT-DI [LRE] page XV-6
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.1.8 LE FILE STATUS

Un file status est un ensemble de 2 caractères (défini en working-storage section) qui donne des informations sur le déroulement des
instructions réalisées sur les fichiers.

Quand l’opération (entrée-sortie) s’est bien déroulée , il contient « 00 » (en pic xx) sinon , il faut étudier son contenu pour connaître la nature
de l’erreur.

La déclaration d’un file status est facultative mais si une erreur survient et qu’on n’a pas prévu cette clause le programme « aborte » et le
système fournit un message d’erreur.
(NB : si on a déclaré une phrase USE dans les déclaratives pour gèrer les erreurs d’entrée-sortie , la clause file status est obligatoire.)
On peut déclarer un file status par fichier.

Composition du file status :

il comprend 2 caractères :

le premier = status-key-1 en X donne la nature générale de l’erreur.


le second = status-key-2 (en binaire => décrit en pic 99 comp-x) contient un code numérique indiquant précisément la nature de
l’anomalie.

valeur de status-key-1 :

valeu condition
r
0 déroulement correct
1 passage par AT END
2 passage par INVALID KEY
3 Permanent Error
4 erreur logique (ex fermeture d’un fichier fermé)
9 erreur de l’exécutif

NB : si la valeur n’est pas 9 , le file status peut être traité comme une zone en alphanumérique sur 2 caractères (pic XX)
sinon , il faut étudier la valeur binaire indiquée sur les 8 bits du dernier caractère.

exemple de description :

select monfichier assign to « c:\produit.txt »


organization indexed access dynamic record key numero
file status wst.
.
.
working-storage section.
1 wst.
3 wstk1 pic x.
3 wstk2 pic x.
3 wstbin redefines wstk2 pic 99 comp-x.

fichiers concernés par les différents status :

i : fichier séquentiel-indexé
s : fichier séquentiel
r : fichier relatif

STATU KEY 2
S
KEY 1 0 1 2 3 4 5 6 7 8 9
0 succès sri i sri sri s
1 at end sri r
2 inv key i ri ri ri
3 perm error sri s s sri sri sri
4 logic error sri sri sri sri sri sri sri sri
9 error voir la valeur binaire
system

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 6


ESAT-DI [LRE] page XV-7
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

significations des différents status :

FILE STATUS nature de l’anomalie


00 succès complet
02 pour un READ : la valeur de la clé courante est la même pour l’article suivant
pour WRITE ou REWRITE :l’enregistrement que l’on vient d’écrire a une clé en double pour une clé
secondaire avec doubles autorisés
04 la longueur de l’article n’est pas conforme à la réalité
05 le fichier déclaré en OPTIONAL n’est pas présent lors de l’open.
07 pour OPEN ou CLOSE avec la clause REEL /UNIT : le fichier est un non réel-unit medium

FILE STATUS nature de l’anomalie


10 l’article logique suivant n’existe pas
14 la taille de la zone clé est insuffisante

FILE STATUS nature de l’anomalie


21 erreur de séquence pour l’accès séquentiel : la clé primaire traitée n’est pas en ordre croissant ou sa
valeur a été changée entre le read et le rewrite suivant.
22 clé en double (non autorisée ou sur la clé primaire)
23 article non trouvé
ou un read ou start a été réalisé sur un fichier optional non présent.
24 boundary violation : (dépassement de limites)
problème de write sur un fichier externe
ou problème de write sur un relatif à cause d’une description de clé trop petite.

FILE STATUS nature de l’anomalie


30 boudary violation : dépassement de limites sur un fichier séquentiel ou erreur de parité ou de
transmission.
34 boundary violation : problème d’écriture sur un fichier séquentiel externe
35 un OPEN avec i-o,input ou extend a été tenté sur un non-optional fichier qui n’était pas présent.
37 pb avec OPEN : me mode d’ouverture est inadapté.
38 pb avec OPEN : tentative d’ouverture d’ un fichier verrouillé .(cf LOCK de select ou read ...)
39 incohérence entre la description du fichier dans le programme et le fichier réel.

FILE STATUS nature de l’anomalie


41 ouverture d’un fichier déjà ouvert.
42 CLOSE sur un fichier déjà fermé
43 concerne l’accès séquentiel : le verbe avant delete ou rewrite n’était pas un read.
44 dépassement de limites (boundary violation)
46 un READ a été exécuté sur un fichier ouvert en input ou I-O mais il n’y avait pas d’article suivant valide.
47 un READ ou un START a été tenté sur un fichier non ouvert en input ou I-O.
48 un WRITE a été tenté sur un fichier non ouvert en output ou I-O ou extend.
49 un DELETE ou un REWRITE a été tenté sur un fichier non ouvert en I-O..

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 7


ESAT-DI [LRE] page XV-8
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

cas du status-key-1 = 9 : => erreur système => étude de la valeur binaire du status-key-2

ST-K2 nature de l’anomaliei STK2 nature de l’anomaliei


001 espace buffer insuffisant 068 article verrouillé
002 fichier non ouvert 069 argument illégal pour module ISAM
003 erreur mode série 070 trop de fic indexés ouverts
004 nom de fichier illégal 071 mauvais format pour un fic. indexé
005 spécification de périphérique illégale 072 fin du fichier indexé
006 tentative de write sur fichier en input 073 pas d’article trouvé ds le fic indexé
007 espace disk insuffisant 074 pas d’article courant ds le fic indexé
008 tentative de lecture sur fichier en output 075 nom du fichier indexé trop long
009 pb de path-name (fichier introuvable) 077 pb (failure) avec module interne ISAM
010 fichier non (supplied) 078 descrip. illégale de clé pour un fic indexé
012 ouverture d’un fichier déjà ouvert 081 la clé existe déjà (seq-ind)
013 fichier non trouvé 100 opération incorrecte (invalid)
014 trop de fichiers ouverts simultanément 101 opération incorrecte sur fic indexé
015 trop de fichiers indexés ouverts 102 fic séquentiel avec 1 nb de EL non entier
016 trop de fichiers (devices) ouverts 104 nom de fichier « Null » vide
017 erreur article (longueur) 105 erreur allocation mémoire
018 read-error (eof trouvé avant la fin) 129 tent d’accès à 1 EL n° zero (relatif)
019 rewrite erreur (cf le mode ouverture) 135 le fichier doit exister
020 ressource (ou device) « busy » 138 fic fermé with LOCK (ne peut être ouv.)
021 le nom de fichier est un répertoire 139 longueur d’EL ou de clé illégale
022 illégal ou impossible open (cf mode) 141 ouverture d’un fic déjà ouvert
023 illégal ou mode impossible pour close 142 fermeture d’un fichier non ouvert
024 I-O sur disque en erreur 143 rewrite/delete (mode séq) s. read ok avant
025 operating system data error 146 pas d’article courant def pour read séq.
026 block i-o error 147 mauvais open ou acces mode p read/start
027 périph. non disponible 148 mauvais .open ou access mode pour write
028 pas de place disponible sur le (device) 149 mauv. open ou access mode p.
rewrite/del.
029 tentative de delete d’un fichier ouvert 150 program abandoned at user request
030 fichier système en lecture seule 151 read random sur fichier séquentiel
031 pas de propriétaire de fichier 152 rewrite sur fic non ouvert en I-O
032 trop de seq-indexés ou (no such process) 158 tent rewrite sur fic. line-sequentiel
033 erreur physique de I-O 159 fic line-séquentiel mal construit
034 mode incorrect ou file descriptor 161 file-header non trouvé (pb format)
035 tent. d’accès avec mauvaises permissions 173 programme appelé non trouvé
36 le fichier existe déjà 180 erreur de marque de fin de fichier
037 accès au fichier interdit 182 écran (entrée ou sortie) mal ouvert (mode)
038 disque non compatible 183 tent d’open d’1 fic line-seq pour I-O
039 fichier non compatible 188 nom de fichier trop grand
040 initialisation du langage incorrecte 193 erreur ds la variable length count
041 fichier indexe déterioré 194 taille du fichier trop grande
042 tentative de write sur « broken pipe » 195 delete/rew. non précédé de read
043 il manque des informations pour seq-ind 196 n° d’EL trop grand (relatif)
045 open 1 NLS file utilisant pg incompatible 210 fichier fermé with LOCK
047 dépassement (overflow) sur fic. des index 213 trop de verrous
065 fichier verrouillé 218 fic . multiple/reel unit malformé
066 tent. d’ajout d’une clé primaire en double 219 operating system shared file limit
exceeded
067 fichier indexé non ouvert

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 8


ESAT-DI [LRE] page XV-9
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.2 La phrase FD

XV.B.2.1 Format

FD file-name-1 [ IS EXTERNAL ]
[ IS GLOBAL ]

[ BLOCK CONTAINS [ integer-1] TO integer-2 RECORDS ou CHARCATERS ]

[ RECORD CONTAINS integer-3 CHARCATERS


IS VARYING IN SIZE [FROM integer-4 ] [TO integer-5]
CHARACTERS
[DEPENDING ON nom-donnée-1]
CONTAINS [ integer-6 TO ] integer-7 CHARACTERS
]
[ LABEL RECORD(S) IS (ARE) STANDARD
OMITTED
data-name-2
]
implémentor-name-1 is data-name-3 ou littéral-1
[VALUE OF FILE-ID IS data-name-6 ou littéral-3 - ]

[RECORDING MODE IS F ou V ou U ou S ou FIXED ou VARIABLE ]

[DATA RECORD(S) IS (ARE) data-name-7 [data-name-8] ..... ]


1 data-name-7.
(description de l’enregistrement)
1 data-name-8.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 9


ESAT-DI [LRE] page XV-10
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.2.2 Règles-remarques

NB : dans la phrase FD d’un fichier séquentiel-indexé , il n’y a pas de clause spécifique ( => cf le cours sur les fichiers
séquentiels)
NB : toutes les clauses barrées sont des éléments datant de versions antérieures du cobol (ex CBL74) qui sont désormais
obsolètes.

• L’utilisation des clauses EXTERNAL et GLOBAL est traitée dans le cours sur les sous-programmes (chapître 11).

• BLOCK CONTAINS .. est uniquement un commentaire en cobol85; dans des versions précédentes cette clause permettait de fixer le
facteur de blocage du fichier (c’est-à-dire de nombre d’articles par bloc physique).

• RECORD CONTAINS permet de spécifier le nombre de caractères de l’article (de longueur fixe ou variable)

• Pour la clause RECORDING MODE : V est synonyme de VARIABLE et F synonyme de FIXE


NB en mode V (longueur variable des articles , la longueur de chaque article est incluse en début de chaque record)

• LABEL RECORD ....clause obsolète en cobol85

• VALUE OF : ...encore une clause obsolète pour le cobol ansi-85.

XV.B.3 Ouverture du fichier : OPEN

XV.B.3.1 format

{
OPEN
}
INPUT { file-name-1 [ WITH LOCK ] } . . . .
OUTPUT { file-name-2 [ WITH LOCK ] }....
I-O { file-name-3 [ WITH LOCK ] } . . . .
EXTEND { file-name-4 [ WITH LOCK ] }....

XV.B.3.2 règles

♦ la clause EXTEND (qui signifie ouvir en extension pour ajouter des articles à la suite ) peut être utilisée pour des fichiers
en accès séquentiel.

♦ Si «with lock» est spécifié , tout le fichier est verrouillé.

♦ l’ouverture avec succès d’un fichier rend disponible la zone d’entrée (niveau 1 en FD) dans le programme.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 10


ESAT-DI [LRE] page XV-11
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

♦ tableau des combinaisons autorisées pour le choix du mode d’ouverture et d’accès :

MODE MODE OUVERTUR


D‘ E
D’ ACCES instruction input output I-O Extend
Séquential READ X X
WRITE X X
REWRITE X
START X X
DELETE X
Random READ X X
WRITE X X
REWRITE X
DELETE X
Dynamic READ X X
WRITE X X
REWRITE X
START X X
DELETE X

♦ Un fichier peut être ouvert avec input,output,extend ou I-O plusieurs fois dans le même programme si à chaque fois il a été
fermé par close.

♦ L’exécution d’un OPEN ne délivre aucun article.

♦ L’ouverture par OPEN du fichier entraîne un contrôle du nom de fichier externe inscrit dans la phrase select : celui-ci doit
être conforme au système d’exploitation utilisé.

♦ Les descriptions en phrases FD doivent être conformes à la description de l’enregistrement faite lors de la création initiale
du fichier.

♦ Pour les fichiers ouvert en INPUT ou I-O , l’ordre OPEN positionne le file-position-indicator (pointeur interne au fichier)
sur le premier article courant (pour les fichiers séquentiels et séquentiel-indexés) et sur la clé n° 1 pour les fichiers relatifs.
S’il n’y a pas de courant , le position-indicator est positionné de telle sorte qu’on passe par la clause AT END lors du
prochain READ.
Si le fichier n’existe pas , le file status est renseigné avec la valeur adéquate..

♦ Lorsqu’un OPEN en OUTPUT s’est déroulé correctement , le fichier spécifié est créé (avec 0 article) . Si un fichier avec le
même nom existe déjà , il est écrasé.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 11


ESAT-DI [LRE] page XV-12
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

♦ L’exécution d’une instruction OPEN renseigne toujours le file status.

♦ Quand LOCK MODE EXCLUSIVE est spécifié dans la select , le verbe OPEN verrouille tout le fichier durant toute
l’exécution du programme.

♦ Quand LOCK MODE AUTOMATIC ou MANUAL est spécifié dans la select , le fichier est ouvert en mode partageable
(les 2 modes possibles pour un fichier sont partageable ou exclusif) ; le verrouillage effectif dépend ensuite des options
choisies dans les diverses instructions (open,read,..).
NB : Les fichiers ouverts en OUTPUT ainsi que les fichiers séquentiel-indexés et les fichiers relatifs ouverts en EXTEND
sont implicitement en mode exclusif.

Seuls les fichiers partageables ouverts en I-O peuvent accéder à des articles verrouillés.

♦ Si l’exécution d’un OPEN échoue , le fichier considéré n’est pas « touché » : une valeur est mise dans le file status et
toutes les procédures citées dans une instruction USE AFTER EXCEPTION sont exécutées.

♦ L’ouverture en I-O permet à la fois de lire le fichier et d’écrire sur celui-ci.


Si à l’ouverture en I-O le fichier n’existe pas , le système réagit de la façon suivante :

si la phrase OPTIONAL est spécifié (en select) le fichier est créé.

si c‘est NOT OPTIONAL => il y a erreur.

si aucune phrase n’est spécifiée dans la select et qu’on a mis la directive de compilation OPTIONAL-FILE , le fichier
est créé.

S’il n’y a aucune phrase et aucune directive (ou la directive NOOPTIONAL-FILE) => il y a erreur.

♦ Quand un fichier (en input) contient la clause OPTIONAL dans la phrase select , le système pose une question pour savoir
s’il est présent ou absent.S’il est absent , le premier READ passe par la clause AT END.

♦ La clause EXTEND permet de se positionner juste après le dernier enregistrement logique du fichier.
(pour un fichier séquentiel , le dernier logique est le dernier écrit ; pour un fichier relatif c’est l’article qui a la plus grande
clé relative et pour un séquentiel indexé ,il s’agit de celui qui a la plus grande clé primaire).

♦ L’ouverture en I-O fonctionne avec tous les fichiers sauf les fichiers en organisation LINE-SEQUENTIAL (organisation
spécifique au cobol-micro-focus qui est une organisation séquentielle avec sur la fin d’ article 2 caractères ( 0D,0A)16 ou
RC,LF de façon à obtenir des lignes).
Si le fichier n’existe pas,il est créé et est considéré comme un fichier vide en lecture (sauf si NOT OPTIONAL en select).

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 12


ESAT-DI [LRE] page XV-13
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.4 Entrée-sortie (I-O) en mode d’accès séquentiel (SEQUENTIAL)

XV.B.4.1 lecture

READ file-name NEXT RECORD


PREVIOUS

[ [ INTO Identifier ] [ WITH KEPT LOCK ] ]


NO
IGNORE
WAIT

[ AT END instructions impératives-1 . . . . . . ]


[ NOT AT END instructions impératives-2 . . . . . . ]

END-READ
Rôle :

Permet de lire les articles séquentiellement dans l’ordre croissant des clés primaires.(on n’a aucune clé à remplir : tout
se passe comme si on lisait un fichier séquentiel.).
Permet aussi de lire séquentiellement les articles dans l’ordre croissant d’une clé secondaire choisie à condition d’avoir
fait un START avant. (ce cas fait l’objet de l’exemple du paragraphe C3).
Règles de fonctionnement :

• La clause AT END doit être spécifiée si on n’a pas mis de phrase USE..
♦ La phrase WITH LOCK ne peut être spécifiée que lorsqu’ un simple article a été verrouillé en manuel pour un fichier partageable.
(si le fichier est ouvert en I-O le système n’accède à l’article verrouillé que si la phrase WITH LOCK est mentionnée : un simple read ne
permet pas cet accès.
Pour lire l’article suivant du verrouillé , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternates clés qui autorisent des doubles.)

♦ WITH NO LOCK n’est permis que lorsque les articles ont été verrouillés en manuel ou automatique dans un fichier partageable.
[partageable <=> on n’a pas mis la clause WITH LOCK EXCLUSIVE dans la phrase select ]

♦ WITH KEPT LOCK ne peut être spécifié que si des articles multiples ont été verrouillés manuellement dans un fichier partageable.
(si le fichier est ouvert en I-O le système accède aux articles verrouillés que si la phrase WITH KEPT LOCK est mentionnée : un simple
read ne permet pas cet accès.
Pour lire l’article suivant du verrouillé , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternate clés qui autorisent des doubles.)

♦ La clause WITH WAIT permet de donner au système le temps nécéssaire pour vérifier si un article est verrouillé.

♦ La clause IGNORE LOCK permet au READ de s’exécuter comme si l’article n’était pas verrouillé.

♦ En mode d’accès séquentiel NEXT est facultatif.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 13


ESAT-DI [LRE] page XV-14
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

• Après une lecture infructueuse le contenu de la zone d’entrée (niveau 01 en FD) est indéterminé (et le file-
position-indicator indique que l’article suivant n’a pas été trouvé).
L’exécution d’un verbe READ met toujours à jour le file status.

♦ Si un fichier décrit avec OPTIONAL est non présent (à l’ouverture) , on passe par AT END au moment du READ.

• NB : PREVIOUS pour lire le précédent n’est utilisable qu’en mode d’accès dynamique.
Si on fait un READ PREVIOUS et qu’il n’existe pas de précédent , on passe par AT END (NB attention l’option previous est spécifique
au cobol micro-focus) et le READ est considéré comme ayant échoué.

• En mode d’accès séquentiel , le read délivre les articles dans l’ordre des clés primaires (on n’a aucune clé à
remplir) ou dans l’ordre croissant d’une clé secondaire ayant fait l’objet préalablement d’un START.

• avant l’exécution d ‘un READ , il faut nécéssairement que le fichier ait été ouvert en INPUT ou en I-O (cf tableau au parag. B32)

• Quand on fait plusieurs descriptions logiques des enregistrements du fichier (plusieurs niveaux 1 en FD ) , en
mémoire une seule zone est générée qui est utilisée par les différents types d’articles (plusieurs niveaux 1 en
FD ==> redéfinition implicite de la même zone ).
C’est l’exécution du verbe READ qui permet de remplir cette zone mémoire (appelée ZE zone d’entrée du
fichier ou Record Area)
Chaque instruction READ réussie remplit cette zone en écrasant le contenu précédent.
♦ INTO qui permet de ranger l’article lu dans la zone nommée par « identifier » (= nom-donnée) ne doit pas être utilisé si on a des
articles de longueur variable.
Même s’il y a la clause INTO , l’article lu est stocké dans sa zone d’entrée (=Record Area = le niveau 1 en FD = ZE ).
L’utilisation d’un READ ... INTO est équivalente à un read simple suivi d’un MOVE de la zone d’entrée dans la zone citée après into : si
l’exécution du read ..into est un échec , le move n’est pas réalisé et la zone « into » garde son contenu initial.

♦ Au moment de l’exécution d’un READ (en mode d’accès séquentiel , read signifie lire le suivant) , si le file-position-indicator
indique qu’il n’y a pas d’article logique suivant à lire ou que le fichier optional n’est pas présent :

∗ une valeur est placée dans le file-status indiquant la condition fin de fichier.

∗ si la clause AT END a été spécifiée , les instructions impératives-1 sont exécutées ( et aucune USE AFTER EXCEPTION
procedure n’est exécutée) puis le programme se poursuit séquentiellement à partir du END-READ.

∗ Si la clause AT END n’est pas spécifiée , c’est la USE ..procédure qui est lancée puis le programme se poursuit
séquentiellement à partir du END-READ.

∗ Quand on passe par AT END , le READ est considéré comme en échec (le file status <> 0 le prouve ).
Dans ce cas , le contenu de la zone d’entrée est indéterminé.

♦ Quand la fin de fichier n’est pas atteinte lors de l’exécution du READ (pas de passage par AT END)

∗ le file-position-indicator est mis à jour.

∗ S’il y a une condition d’exception (autre que la fin de fichier) , la procédure USE .. s’exécute.

∗ S’il n’y a pas de condition d’exception ,l’article est rangé dans la zone d’entrée (record area) puis le programme se poursuit
séquentiellement à partir des instructions-impératives-2 si NOT AT END est spécifié ou à partir du END-READ dans le cas
contraire.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 14


ESAT-DI [LRE] page XV-15
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

♦ Après un READ qui tente de lire un article verrouillé , le file-position-indicator reste pointé sur cet article : les read next ou
previous suivants continuent à agir sur le même enregistrement.
Les instructions de la phrase NOT AT END ne sont exécutées que si READ a réussi complètement.

♦ NB (???) Quand la condition de fin de fichier a été décelée (=> au moment de la lecture du dernier enregistrement ) l’instruction
suivante doit être un READ . . .NEXT car PREVIOUS ne peut plus fonctionner car l’article logique précédent n’existe pas .

NB : PROBLEME DE LAFINDE FICHIER

ENREGISTREMENT N°1

ENREGISTREMENT N°2
.
.
.

ENREGISTREMENT N-1

DERNIER ENREGISTREMENT

FINDE FICHIER

pour bien comprendre les problèmes de fin-de-fichier , il


faut considérer qu'il y a un article supplémentaire nommé FIN DE FICHIER

La lecture du dernier article se déroule normalement ; on passe par la clause


AT END lorsqu'on veut lire le suivant.

• Après être passé par AT END , on peut faire OPEN + CLOSE ou START si on veut continuer à travailler sur le fichier.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 15


ESAT-DI [LRE] page XV-16
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.4.2 écriture

format n° 1 utilisable en accès séquentiel :

WRITE record-name [ FROM Identifier-1 ]


littéral-1

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-WRITE
Rôle :

permet d’écrire des articles séquentiellement ( l’article à écrire devant toujours avoir une clé primaire supérieure
à la précédente).
C’est l’instruction à utiliser pour faire la création initiale d’un fichier ou pour faire des créations sur un fichier
existant.
Règles de fonctionnement :

♦ WRITE record-name FROM nom-donnée est équivalent à MOVE nom-donnée to record-name + WRITE record-
name

♦ identifier-1 est soit un nom-donnée décrit en data division (différent de record-name) soit un identificateur de fonction
alphanumérique (FUNCTION arguments ...).

♦ record-name est le nom de la ZS (zone de sortie du fichier ou Record area = niveau 1 en FD ; pour un fichier en lecture on
appelle cette zone ZE= zone d’entrée et pour un fichier sur lequel on veut écrire on la nomme ZS= Zone de sortie).

♦ L’exécution d’un write met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).
Si un write échoue , la procédure mentionnée éventuellement dans une phrase USE est exécutée.

♦ La clause INVALID KEY est obligatoire (si on n’a pas prévu de phrase USE).

♦ Pour faire un write il faut avoir ouvert le fichier en OUTPUT ou en EXTEND. (I-O ne fonctionne pas en mode séquentiel)

♦ L’article écrit par l’exécution d’un WRITE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD) si le
fichier a fait l’objet d’une clause « SAME AREA » en I-O-CONTROL ou si le write a échoué par une condition INVALID KEY.

♦ Au moment de l’exécution du WRITE , le système utilise la clé primaire pour faire la création :
celle-ci doit être unique.

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand (mode séquentiel , fichier ouvert en output) la valeur de la clé primaire est <= à la
précédente ( ou = à une clé existant déjà dans le fichier).

∗ Quand on veut créer un article avec une clé secondaire qui existe déjà et que les doubles n’ont
pas été autorisés.

∗ quand il y a un problème de dépassement de limite ( ex :plus assez de place pour créer un nouvel
article).
[NB : en cas de problème avec des entrées-sorties sur des articles verrouillés : CF les directives de compilation WRITE-LOCK et
FDCLEAR ainsi que les run-time switches N et T]

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 16


ESAT-DI [LRE] page XV-17
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

format n° 2 utilisable en accès séquentiel :

REWRITE record-name [ FROM Identifier-1 ]


littéral-1

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-REWRITE

Rôle :

En mode séquentiel , cette instruction sert à «ré-écrire» et donc remplacer ( =>après l’avoir modifié ) l’article
qu’on vient de lire.
(Il n’y a aucune clé à remplir : l’instruction concerne toujours l’article précédemment lu).
==> pour utiliser ce verbe , il faut forcément avoir fait un READ avant.
Règles de fonctionnement :

♦ Pour utiliser REWRITE le fichier doit être ouvert en I-O.

♦ REWRITE record-name FROM nom-donnée est équivalent à MOVE nom-donnée to record-name + REWRITE
record-name

♦ identier-1 est soit un nom-donnée décrit en data division (différent de record-name) soit un identificateur de fonction
alphanumérique (FUNCTION .arguments ...).

♦ record-name est le nom de la ZS (zone de sortie du fichier ou Record area = niveau 1 en FD ; pour un fichier en lecture on
appelle cette zone ZE= zone d’entrée et pour un fichier sur lequel on veut écrire on la nomme ZS= Zone de sortie).

♦ L’exécution d’un REWRITE met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).
Si un rewrite échoue , la procédure mentionnée éventuellement dans une phrase USE est exécutée.

♦ La clause INVALID KEY n’ est pas obligatoire en mode séquentiel.

♦ L’article écrit par l’exécution d’un REWRITE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD)
si le fichier a fait l’objet d’une clause « SAME AREA » en I-O-CONTROL ou si le rewrite a échoué par une condition INVALID
KEY.

♦ Au moment de l’exécution du REWRITE , le système utilise la clé primaire pour faire l ‘écriture
de remplacement : celle-ci doit être celle de l’article lu précédemment.

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand (mode séquentiel , fichier ouvert en I-O) la valeur de la clé primaire est différente de celle
lue précédemment.

∗ Quand on veut créer un article avec une clé secondaire qui existe déjà et que les doubles n’ont
pas été autorisés.

[NB : en cas de problème avec des entrées-sorties sur des articles verrouillés : CF les directives de compilation WRITE-LOCK et
FDCLEAR ainsi que les run-time switches N et T.
un rewrite sur un article verrouillé echoue]

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 17


ESAT-DI [LRE] page XV-18
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.4.3 effacement

DELETE file-name RECORD

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-DELETE
Rôle :

En mode séquentiel , cette instruction sert à effacer l’article qu’on vient de lire.
(Il n’y a aucune clé à remplir : l’instruction concerne toujours l’article précédemment lu).
==> pour utiliser ce verbe , il faut forcément avoir fait un READ avant.
Règles de fonctionnement :

♦ Pour utiliser DELETE le fichier doit être ouvert en I-O.

♦ L’exécution d’un DELETE met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).

♦ La clause INVALID KEY n’ est pas obligatoire en mode séquentiel.

♦ L’article effacé par DELETE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD).

♦ L’article à effacer ne doit pas être verrouillé.

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand (mode séquentiel , fichier ouvert en I-O) la valeur de la clé primaire est différente de celle
lue précédemment.

NB : effacement d’un fichier complet :

DELETE FILE {file-name-1} . . . .

Ne pas confondre le format précédent avec celui-ci qui permet d’effacer complètement (et physiquement ) tous les fichiers cités à
condition que ceux-ci aient été préalablement fermés. (ne fonctionne pas s’ ils ont été fermés avec close WITH LOCK)

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 18


ESAT-DI [LRE] page XV-19
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.4.4 positionnement dans le fichier (start)

{ = ou alors EQUAL TO }
{ > ou alors GREATER THAN }
{ NOT < ou alors NOT LESS THAN }
START file-name KEY IS { >= ou alors GREATER THAN OR EQUAL TO }
{ < ou alors LESS THAN }
{ NOT > ou alors NOT GREATER THAN }
{ <= ou alors LESS THAN OR EQUAL TO }

data-name-1 [ WITH SIZE { identifier-1 }


split-key-name-1 { littéral-1 } ]

[ INVAKID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-START

Rôle :

Sert à se positionner dans le fichier à partir d’une valeur de clé (primaire ou secondaire*).
Il faut avoir rempli la clé concernée préalablement avec la valeur choisie.
Le START ne fait pas de lecture : pour accéder au premier enregistrement correspondant à la clé choisie , il faut
faire un READ.

Tous les READ . . . NEXT qui suivent un START délivrent les articles en ordre croissant sur la clé choisie
(primaire ou secondaire) au moment du START.
La clé choisie au moment du START devient la clé de référence pour les instructions READ qui suivent.

[* NB (?!?) : certaines documentations COBOL indiquent que START ne fonctionne qu’avec la clé primaire.]
Règles de fonctionnement :

♦ Data-name-1 est le nom de la clé primaire ou secondaire définie dans la phrase select et dans la
description de la zone « record » en niveau 1 en FD.

Data-name-1 peut également être une partie (gauche) de clé (zone sous-groupe ou élémentaire
composant cette clé).

[CF les exemples aux paragraphes C2 C5 C7]

♦ La notion de clé concaténée (split-key-name) est spécifique à cobol-micro-focus.

♦ WITH SIZE indique le nombre de caractères à prendre en compte dans la clé.(dans ce cas identifier-1 doit être une zone
élémentaire numérique).

♦ Si la phrase KEY est spécifiée , data-name-1 doit être une zone décrite en FD.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 19


ESAT-DI [LRE] page XV-20
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

♦ Pour utiliser START , le fichier doit être ouvert en INPUT ou I-O.

♦ Si la phrase KEY n’est pas spécifiée c’est la condition = (ou EQUAL TO) qui est prise par
défaut.

♦ La clause INVALID KEY est obligatoire (si aucune phrase USE n’a été spécifiée en
déclaratives).

♦ l’exécution du START met à jour le file status.

♦ Le START ne trouve jamais les articles verrouillés.

♦ Quand l’opérateur de comparaison est = ou > ou >= , le file-position-indicator pointe sur le premier article qui satisfait la
condition.
Quand l’opérateur de comparaison est < ou <= , le file-position-indicator pointe sur le dernier article logique qui satisfait la
condition.
Si cette clé a des doubles , le file-position-indicator pointe sur la dernière de ces entrées.

♦ Si aucun article ne satisfait la condition , on passe par INVALID KEY (le file-position-indicator
a alors une valeur indéterminée).

♦ Si la clause KEY n’est pas mentionnée , c’est la clé primaire qui est utilisée.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 20


ESAT-DI [LRE] page XV-21
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.5 Entrée-Sortie (I-O) en mode d’accès direct (RANDOM)

En mode d’accès direct , toutes les instructions agissent sur l’enregistrement choisi directement à l’aide d’une clé (primaire ou secondaire)
qu’il faut donc toujours préalablement avoir renseigné.

XV.B.5.1 lecture

READ file-name RECORD

[
[ [ INTO Identifier ] [ WITH KEPT LOCK ] ]
NO
IGNORE
WAIT

[
KEY IS data-name-1 [ WITH SIZE { identifier-1 }
split-key-name-1 { littéral-1 } ]
]
[ INVAKID KEY instructions impératives-3 . . . . . . ]
[ NOT INVALID KEY instructions impératives-4 . . . . . . ]

END-READ

Rôle :

Permet de lire directement l’article pour lequel on a rempli la zone « clé-primaire » (ou la clé secondaire si on utilise la
clause KEY IS ).
Règles de fonctionnement :

• La clause INVALID KEY doit être spécifiée si on n’a pas mis de phrase USE..
♦ La phrase WITH LOCK ne peut être spécifiée que lorsqu’ un simple article a été verrouillé en manuel pour un fichier partageable.
(si le fichier est ouvert en I-O le système n’accède à l’article verrouillé que si la phrase WITH LOCK est mentionnée : un simple read ne
permet pas cet accès.
Pour lire l’article suivant du verrouillé , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternates clés qui autorisent des doubles.)

♦ WITH NO LOCK n’est permis que lorsque les articles ont été verrouillés en manuel ou automatique dans un fichier partageable.
[partageable <=> on n’a pas mis la clause WITH LOCK EXCLUSIVE dans la phrase select ]

♦ WITH KEPT LOCK ne peut être spécifié que si des articles multiples ont été verrouillés manuellement dans un fichier partageable.
(si le fichier est ouvert en I-O le système accède aux articles verrouillés que si la phrase WITH KEPT LOCK est mentionnée : un simple
read ne permet pas cet accès.
Pour lire l’article suivant du verrouillé , , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternate clés qui autorisent des doubles.)

♦ La clause WITH WAIT permet de donner au système le temps nécéssaire pour vérifier si un article est verrouillé.

♦ La clause IGNORE LOCK permet au READ de s’exécuter comme si l’article n’était pas verrouillé.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 21


ESAT-DI [LRE] page XV-22
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

• Après une lecture infructueuse le contenu de la zone d’entrée (niveau 01 en FD) est indéterminé (et le file-
position-indicator indique que l’article suivant n’a pas été trouvé).
L’exécution d’un verbe READ met toujours à jour le file status.

• Data-name doit être une zone décrite en FD.


Data-name est généralement le nom d’une clé décrite en FD( primaire ou secondaire ; NB : habituellement on
met le nom d’une clé secondaire car pour accéder à un article par la clé primaire , cette clause key n’est pas
obligatoire).
Data-name peut aussi être une redéfinition de la clé primaire ou une partie de cette zone.
La clé citée par data-name doit être remplie avec une valeur avant de faire le READ.

♦ Si un fichier décrit avec OPTIONAL est non présent (à l’ouverture) , on passe par AT END au moment du READ.

• avant l’exécution d ‘un READ , il faut nécéssairement que le fichier ait été ouvert en INPUT ou en I-O (cf tableau au parag. B32)

• Quand on fait plusieurs descriptions logiques des enregistrements du fichier (plusieurs niveaux 1 en FD ) , en
mémoire une seule zone est générée qui est utilisée par les différents types d’articles (plusieurs niveaux 1 en
FD ==> redéfinition implicite de la même zone ).
C’est l’exécution du verbe READ qui permet de remplir cette zone mémoire (appelée ZE zone d’entrée du
fichier ou Record Area)
Chaque instruction READ réussie remplit cette zone en écrasant le contenu précédent.
♦ INTO qui permet de ranger l’article lu dans la zone nommée par « identifier » (= nom-donnée) ne doit pas être utilisé si on a des
articles de longueur variable.
Même s’il y a la clause INTO , l’article lu est stocké dans sa zone d’entrée (=Record Area = le niveau 1 en FD = ZE ).
L’utilisation d’un READ ... INTO est équivalente à un read simple suivi d’un MOVE de la zone d’entrée dans la zone citée après into : si
l’exécution du read ..into est un échec , le move n’est pas réalisé et la zone « into » garde son contenu initial.

♦ Si la phrase KEY n’est pas spécifiée , c’est la clé primaire qui est choisie par défaut.

♦ Quand la lecture s’est déroulée correctement , le file-position-indicator est positionné sur l’article trouvé ; si aucun article n’a de clé
avec la valeur fournie , on passe par INVALID KEY.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 22


ESAT-DI [LRE] page XV-23
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.5.2 écriture

format n° 1 utilisable en accès random :

WRITE record-name [ FROM Identifier-1 ]


littéral-1

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-WRITE

Rôle :

permet d’écrire directement l’article pour lequel on a rempli la clé primaire.


C’est l’instruction à utiliser pour faire des créations sur un fichier existant lorsqu’on travaille en mode
RANDOM (ou dynamique).
Règles de fonctionnement :

♦ WRITE record-name FROM nom-donnée est équivalent à MOVE nom-donnée to record-name + WRITE record-
name

♦ identifier-1 est soit un nom-donnée décrit en data division (différent de record-name) soit un identificateur de fonction
alphanumérique (FUNCTION arguments ...).

♦ record-name est le nom de la ZS (zone de sortie du fichier ou Record area = niveau 1 en FD ; pour un fichier en lecture on
appelle cette zone ZE= zone d’entrée et pour un fichier sur lequel on veut écrire on la nomme ZS= Zone de sortie).

♦ L’exécution d’un write met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).
Si un write échoue , la procédure mentionnée éventuellement dans une phrase USE est exécutée.

♦ La clause INVALID KEY est obligatoire (si on n’a pas prévu de phrase USE).

♦ Pour faire un write il faut avoir ouvert le fichier en OUTPUT ou I-O ( EXTEND.ne fonctionne qu’ en mode séquentiel)

♦ L’article écrit par l’exécution d’un WRITE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD) si le
fichier a fait l’objet d’une clause « SAME AREA » en I-O-CONTROL ou si le write a échoué par une condition INVALID KEY.

♦ Avant de faire un WRITE , il faut avoir rempli la zone clé-primaire.


Au moment de l’exécution du WRITE , le système utilise la clé primaire pour faire la création : celle-ci
doit être unique.
En mode direct ou dynamique on peut écrire les articles dans n’importe quel ordre.

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand l’article ayant la valeur de la clé primaire fournie existe déjà dans le fichier.

∗ Quand on veut créer un article avec une clé secondaire qui existe déjà et que les doubles n’ont
pas été autorisés.

∗ quand il y a un problème de dépassement de limite ( ex :plus assez de place pour créer un nouvel
article).
[NB : en cas de problème avec des entrées-sorties sur des articles verrouillés : CF les directives de compilation WRITE-LOCK et
FDCLEAR ainsi que les run-time switches N et T]

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 23


ESAT-DI [LRE] page XV-24
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

format n° 2 utilisable en accès random:

REWRITE record-name [ FROM Identifier-1 ]


littéral-1

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-REWRITE

Rôle :

Cette instruction permet de «ré-écrire» et donc remplacer ( =>après l’avoir modifié ) l’article pour lequel on a
rempli la zone clé-primaire.
[En mode RANDOM (ou dynamique) , avant de faire un REWRITE , il faut avoir rempli la zone clé-primaire
pour choisir directement l’article à modifier.]

Règles de fonctionnement :

♦ Pour utiliser REWRITE le fichier doit être ouvert en I-O.

♦ REWRITE record-name FROM nom-donnée est équivalent à MOVE nom-donnée to record-name + REWRITE
record-name

♦ identier-1 est soit un nom-donnée décrit en data division (différent de record-name) soit un identificateur de fonction
alphanumérique (FUNCTION .arguments ...).

♦ record-name est le nom de la ZS (zone de sortie du fichier ou Record area = niveau 1 en FD ; pour un fichier en lecture on
appelle cette zone ZE= zone d’entrée et pour un fichier sur lequel on veut écrire on la nomme ZS= Zone de sortie).

♦ L’exécution d’un REWRITE met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).
Si un rewrite échoue , la procédure mentionnée éventuellement dans une phrase USE est exécutée.

♦ La clause INVALID KEY est obligatoire..

♦ L’article écrit par l’exécution d’un REWRITE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD)
si le fichier a fait l’objet d’une clause « SAME AREA » en I-O-CONTROL ou si le rewrite a échoué par une condition INVALID
KEY.

♦ Au moment de l’exécution du REWRITE , le système utilise la clé primaire pour faire l ‘écriture
de remplacement : celle-ci doit exister dans le fichier (sinon : INVALID KEY).

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand l’article ayant la valeur de clé primaire choisie n’existe pas dans le fichier.

∗ Quand on veut créer un article avec une clé secondaire qui existe déjà et que les doubles n’ont
pas été autorisés.

[NB : en cas de problème avec des entrées-sorties sur des articles verrouillés : CF les directives de compilation WRITE-LOCK et
FDCLEAR ainsi que les run-time switches N et T.
un rewrite sur un article verrouillé echoue]

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 24


ESAT-DI [LRE] page XV-25
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.5.3 effacement

DELETE file-name RECORD

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-DELETE

Rôle :

Cette instruction sert à effacer l’article pour lequel on a rempli la zone clé-primaire.
Avant de faire un DELETE , en mode RANDOM (ou dynamique) , il faut avoir renseigné la zone clé-primaire
pour choisir directement l’article à effacer.
On peut effacer les articles dans n’importe quel ordre.
Règles de fonctionnement :

♦ Pour utiliser DELETE le fichier doit être ouvert en I-O.

♦ L’exécution d’un DELETE met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).

♦ La clause INVALID KEY est obligatoire.

♦ L’article effacé par DELETE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD).

♦ L’article à effacer ne doit pas être verrouillé.

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand l’article ayant la valeur de la clé primaire fixée n’existe pas dans le fichier.

NB : effacement d’un fichier complet :

DELETE FILE {file-name-1} . . . .

Ne pas confondre le format précédent avec ceui-ci qui permet d’effacer complètement (et physiquement ) tous les fichiers cités à
condition que ceux-ci aient été préalablement fermés. (ne fonctionne pas si ils ont été fermés avec CLOSE WITH LOCK)

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 25


ESAT-DI [LRE] page XV-26
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.6 Entrée-sortie (I-O) en mode d’accès dynamique (DYNAMIC)

Ce mode permet de travailler à la fois en « séquentiel » et en accès direct : il offre donc les mêmes outils que le mode précédent avec la
possibilité supplémentaire d’utiliser les verbes READ . . .NEXT . . .AT END . . . et START du mode séquentiel.

XV.B.6.1 lecture

format n° 1 utilisable en accès dynamique

READ file-name NEXT RECORD


PREVIOUS

[ [ INTO Identifier ] [ WITH KEPT LOCK ] ]


NO
IGNORE
WAIT

[ AT END instructions impératives-1 . . . . . . ]


[ NOT AT END instructions impératives-2 . . . . . . ]

END-READ

Rôle :

Permet de lire les articles séquentiellement dans l’ordre croissant des clés primaires.(on n’a aucune clé à remplir : tout
se passe comme si on lisait un fichier séquentiel.).
Permet aussi de lire séquentiellement les articles dans l’ordre croissant d’une clé secondaire choisie à condition d’avoir
fait avant un START ou un READ-direct (format n° 2) pour commencer la lecture à partir d’un certain article : dans ce
cas , la clé choisie devient clé de reférence pour les READ NEXT suivants.
Règles de fonctionnement :

• La clause AT END doit être spécifiée si on n’a pas mis de phrase USE..
♦ La phrase WITH LOCK ne peut être spécifiée que lorsqu’ un simple article a été verrouillé en manuel pour un fichier partageable.
(si le fichier est ouvert en I-O le système n’accède à l’article verrouillé que si la phrase WITH LOCK est mentionnée : un simple read ne
permet pas cet accès.
Pour lire l’article suivant du verrouillé , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternates clés qui autorisent des doubles.)

♦ WITH NO LOCK n’est permis que lorsque les articles ont été verrouillés en manuel ou automatique dans un fichier partageable.
[partageable <=> on n’a pas mis la clause WITH LOCK EXCLUSIVE dans la phrase select ]

♦ WITH KEPT LOCK ne peut être spécifié que si des articles multiples ont été verrouillés manuellement dans un fichier partageable.
(si le fichier est ouvert en I-O le système accède aux articles verrouillés que si la phrase WITH KEPT LOCK est mentionnée : un simple
read ne permet pas cet accès.
Pour lire l’article suivant du verrouillé , , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternate clés qui autorisent des doubles.)

♦ La clause WITH WAIT permet de donner au système le temps nécéssaire pour vérifier si un article est verrouillé.

♦ La clause IGNORE LOCK permet au READ de s’exécuter comme si l’article n’était pas verrouillé.

♦ En mode d’accès dynamique NEXT n’est pas facultatif.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 26


ESAT-DI [LRE] page XV-27
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

• Après une lecture infructueuse le contenu de la zone d’entrée (niveau 01 en FD) est indéterminé (et le file-
position-indicator indique que l’article suivant n’a pas été trouvé).
L’exécution d’un verbe READ met toujours à jour le file status.

♦ Si un fichier décrit avec OPTIONAL est non présent (à l’ouverture) , on passe par AT END au moment du READ.

• NB : PREVIOUS pour lire le précédent n’est utilisable qu’en mode d’accès dynamique.
Si on fait un READ PREVIOUS et qu’il n’existe pas de précédent , on passe par AT END (NB attention l’option previous est spécifique
au cobol micro-focus) et le READ est considéré comme ayant échoué.

• Ce read délivre les articles dans l’ordre des clés primaires (on n’a aucune clé à remplir) ou dans l’ordre
croissant d’une clé secondaire ayant fait l’objet préalablement d’un START ou d’un READ direct (format
suivant).

• avant l’exécution d ‘un READ , il faut nécéssairement que le fichier ait été ouvert en INPUT ou en I-O (cf tableau au parag. B32)

• Quand on fait plusieurs descriptions logiques des enregistrements du fichier (plusieurs niveaux 1 en FD ) , en
mémoire une seule zone est générée qui est utilisée par les différents types d’articles (plusieurs niveaux 1 en
FD ==> redéfinition implicite de la même zone ).
C’est l’exécution du verbe READ qui permet de remplir cette zone mémoire (appelée ZE zone d’entrée du
fichier ou Record Area)
Chaque instruction READ réussie remplit cette zone en écrasant le contenu précédent.
♦ INTO qui permet de ranger l’article lu dans la zone nommée par « identifier » (= nom-donnée) ne doit pas être utilisé si on a des
articles de longueur variable.
Même s’il y a la clause INTO , l’article lu est stocké dans sa zone d’entrée (=Record Area = le niveau 1 en FD = ZE ).
L’utilisation d’un READ ... INTO est équivalente à un read simple suivi d’un MOVE de la zone d’entrée dans la zone citée après into : si
l’exécution du read ..into est un échec , le move n’est pas réalisé et la zone « into » garde son contenu initial.

♦ Au moment de l’exécution d’un READ (en mode d’accès séquentiel , read signifie lire le suivant) , si le file-position-indicator
indique qu’il n’y a pas d’article logique suivant à lire ou que le fichier optional n’est pas présent :

∗ une valeur est placée dans le file-status indiquant la condition fin de fichier.

∗ si la clause AT END a été spécifiée , les instructions impératives-1 sont exécutées ( et aucune USE AFTER EXCEPTION
procedure n’est exécutée) puis le programme se poursuit séquentiellement à partir du END-READ.

∗ Si la clause AT END n’est pas spécifiée , c’est la USE ..procédure qui est lancée puis le programme se poursuit
séquentiellement à partir du END-READ.

∗ Quand on passe par AT END , le READ est considéré comme en échec (le file status <> 0 le prouve ).
Dans ce cas , le contenu de la zone d’entrée est indéterminé.

♦ Quand la fin de fichier n’est pas atteinte lors de l’exécution du READ (pas de passage par AT END)

∗ le file-position-indicator est mis à jour.

∗ S’il y a une condition d’exception (autre que la fin de fichier) , la procédure USE .. s’exécute.

∗ S’il n’y a pas de condition d’exception ,l’article est rangé dans la zone d’entrée (record area) puis le programme se poursuit
séquentiellement à partir des instructions-impératives-2 si NOT AT END est spécifié ou à partir du END-READ dans le cas
contraire.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 27


ESAT-DI [LRE] page XV-28
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

♦ Après un READ qui tente de lire un article verrouillé , le file-position-indicator reste pointé sur cet article : les read next ou
previous suivants continuent à agir sur le même enregistrement.
Les instructions de la phrase NOT AT END ne sont exécutées que si READ a réussi complètement.

♦ NB (???) Quand la condition de fin de fichier a été décelée (=> au moment de la lecture du dernier enregistrement ) l’instruction
suivante doit être un READ . . .NEXT car PREVIOUS ne peut plus fonctionner pas car l’article logique précédent n’existe pas .

NB : PROBLEME DE LAFINDE FICHIER

ENREGISTREMENT N°1

ENREGISTREMENT N°2
.
.
.

ENREGISTREMENT N-1

DERNIER ENREGISTREMENT

FINDE FICHIER

pour bien comprendre les problèmes de fin-de-fichier , il


faut considérer qu'il y a un article supplémentaire nommé FIN DE FICHIER

La lecture du dernier article se déroule normalement ; on passe par la clause


AT END lorsqu'on veut lire le suivant.

• Après être passé par AT END , on peut faire OPEN + CLOSE ou START si on veut continuer à travailler sur le fichier.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 28


ESAT-DI [LRE] page XV-29
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

format n° 2 utilisable en accès dynamique

READ file-name RECORD

[
[ [ INTO Identifier ] [ WITH KEPT LOCK ] ]
NO
IGNORE
WAIT

[
KEY IS data-name-1 [ WITH SIZE { identifier-1 }
split-key-name-1 { littéral-1 } ]
]
[ INVAKID KEY instructions impératives-1 . . . . . . ]
[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-READ

Rôle :

Permet de lire directement l’article pour lequel on a rempli la zone « clé-primaire » (ou la clé secondaire si on utilise la
clause KEY IS ).
[c’est le READ de l’accès RANDOM ]

Règles de fonctionnement :

• La clause INVALID KEY doit être spécifiée si on n’a pas mis de phrase USE..
♦ La phrase WITH LOCK ne peut être spécifiée que lorsqu’ un simple article a été verrouillé en manuel pour un fichier partageable.
(si le fichier est ouvert en I-O le système n’accède à l’article verrouillé que si la phrase WITH LOCK est mentionnée : un simple read ne
permet pas cet accès.
Pour lire l’article suivant du verrouillé , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternates clés qui autorisent des doubles.)

♦ WITH NO LOCK n’est permis que lorsque les articles ont été verrouillés en manuel ou automatique dans un fichier partageable.
[partageable <=> on n’a pas mis la clause WITH LOCK EXCLUSIVE dans la phrase select ]

♦ WITH KEPT LOCK ne peut être spécifié que si des articles multiples ont été verrouillés manuellement dans un fichier partageable.
(si le fichier est ouvert en I-O le système accède aux articles verrouillés que si la phrase WITH KEPT LOCK est mentionnée : un simple
read ne permet pas cet accès.
Pour lire l’article suivant du verrouillé , , le file-position-indicator doit être modifié par START mais ensuite , on ne peut plus accéder aux
alternate clés qui autorisent des doubles.)

♦ La clause WITH WAIT permet de donner au système le temps nécéssaire pour vérifier si un article est verrouillé.

♦ La clause IGNORE LOCK permet au READ de s’exécuter comme si l’article n’était pas verrouillé.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 29


ESAT-DI [LRE] page XV-30
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

• Après une lecture infructueuse le contenu de la zone d’entrée (niveau 01 en FD) est indéterminé (et le file-
position-indicator indique que l’article suivant n’a pas été trouvé).
L’exécution d’un verbe READ met toujours à jour le file status.

• Data-name doit être une zone décrite en FD.


Data-name est généralement le nom d’une clé décrite en FD( primaire ou secondaire ; NB : habituellement on
met le nom d’une clé secondaire car pour accéder à un article par la clé primaire , cette clause key n’est pas
obligatoire).
Data-name peut aussi être une redéfinition de la clé primaire ou une partie de cette zone.
La clé citée par data-name doit être remplie avec une valeur avant de faire le READ.

♦ Si un fichier décrit avec OPTIONAL est non présent (à l’ouverture) , on passe par AT END au moment du READ.

• avant l’exécution d ‘un READ , il faut nécéssairement que le fichier ait été ouvert en INPUT ou en I-O (cf tableau au parag. B32)

• Quand on fait plusieurs descriptions logiques des enregistrements du fichier (plusieurs niveaux 1 en FD ) , en
mémoire une seule zone est générée qui est utilisée par les différents types d’articles (plusieurs niveaux 1 en
FD ==> redéfinition implicite de la même zone ).
C’est l’exécution du verbe READ qui permet de remplir cette zone mémoire (appelée ZE zone d’entrée du
fichier ou Record Area)
Chaque instruction READ réussie remplit cette zone en écrasant le contenu précédent.
♦ INTO qui permet de ranger l’article lu dans la zone nommée par « identifier » (= nom-donnée) ne doit pas être utilisé si on a des
articles de longueur variable.
Même s’il y a la clause INTO , l’article lu est stocké dans sa zone d’entrée (=Record Area = le niveau 1 en FD = ZE ).
L’utilisation d’un READ ... INTO est équivalente à un read simple suivi d’un MOVE de la zone d’entrée dans la zone citée après into : si
l’exécution du read ..into est un échec , le move n’est pas réalisé et la zone « into » garde son contenu initial.

♦ Si la phrase KEY n’est pas spécifiée , c’est la clé primaire qui est choisie par défaut.

♦ Quand la lecture s’est déroulée correctement , le file-position-indicator est positionné sur l’article trouvé ; si aucun article n’a de clé
avec la valeur fournie , on passe par INVALID KEY.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 30


ESAT-DI [LRE] page XV-31
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.6.2 écriture

format n° 1 utilisable en accès dynamique :

WRITE record-name [ FROM Identifier-1 ]


littéral-1

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-WRITE

Rôle :

permet d’écrire directement l’article pour lequel on a rempli la clé primaire.


C’est l’instruction à utiliser pour faire des créations sur un fichier existant lorsqu’on travaille en mode
DYNAMIC (ou random).
Règles de fonctionnement :

♦ WRITE record-name FROM nom-donnée est équivalent à MOVE nom-donnée to record-name + WRITE record-
name

♦ identifier-1 est soit un nom-donnée décrit en data division (différent de record-name) soit un identificateur de fonction
alphanumérique (FUNCTION arguments ...).

♦ record-name est le nom de la ZS (zone de sortie du fichier ou Record area = niveau 1 en FD ; pour un fichier en lecture on
appelle cette zone ZE= zone d’entrée et pour un fichier sur lequel on veut écrire on la nomme ZS= Zone de sortie).

♦ L’exécution d’un write met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).
Si un write échoue , la procédure mentionnée éventuellement dans une phrase USE est exécutée.

♦ La clause INVALID KEY est obligatoire (si on n’a pas prévu de phrase USE).

♦ Pour faire un write il faut avoir ouvert le fichier en OUTPUT ou I-O ( EXTEND.ne fonctionne qu’ en mode séquentiel)

♦ L’article écrit par l’exécution d’un WRITE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD) si le
fichier a fait l’objet d’une clause « SAME AREA » en I-O-CONTROL ou si le write a échoué par une condition INVALID KEY.

♦ Avant de faire un WRITE , il faut avoir rempli la zone clé-primaire.


Au moment de l’exécution du WRITE , le système utilise la clé primaire pour faire la création : celle-ci
doit être unique.
En mode direct ou dynamique on peut écrire les articles dans n’importe quel ordre.

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand l’article ayant la valeur de la clé primaire fournie existe déjà dans le fichier.

∗ Quand on veut créer un article avec une clé secondaire qui existe déjà et que les doubles n’ont
pas été autorisés.

∗ quand il y a un problème de dépassement de limite ( ex :plus assez de place pour créer un nouvel
article).
[NB : en cas de problème avec des entrées-sorties sur des articles verrouillés : CF les directives de compilation WRITE-LOCK et
FDCLEAR ainsi que les run-time switches N et T]

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 31


ESAT-DI [LRE] page XV-32
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

format n° 2 utilisable en accès dynamique :

REWRITE record-name [ FROM Identifier-1 ]


littéral-1

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-REWRITE

Rôle :

Cette instruction permet de «ré-écrire» et donc remplacer ( =>après l’avoir modifié ) l’article pour lequel on a
rempli la zone clé-primaire.
[En mode DYNAMIC (ou random) , avant de faire un REWRITE , il faut avoir rempli la zone clé-primaire pour
choisir directement l’article à modifier.]

Règles de fonctionnement :

♦ Pour utiliser REWRITE le fichier doit être ouvert en I-O.

♦ REWRITE record-name FROM nom-donnée est équivalent à MOVE nom-donnée to record-name + REWRITE
record-name

♦ identifier-1 est soit un nom-donnée décrit en data division (différent de record-name) soit un identificateur de fonction
alphanumérique (FUNCTION .arguments ...).

♦ record-name est le nom de la ZS (zone de sortie du fichier ou Record area = niveau 1 en FD ; pour un fichier en lecture on
appelle cette zone ZE= zone d’entrée et pour un fichier sur lequel on veut écrire on la nomme ZS= Zone de sortie).

♦ L’exécution d’un REWRITE met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).
Si un rewrite échoue , la procédure mentionnée éventuellement dans une phrase USE est exécutée.

♦ La clause INVALID KEY est obligatoire..

♦ L’article écrit par l’exécution d’un REWRITE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD)
si le fichier a fait l’objet d’une clause « SAME AREA » en I-O-CONTROL ou si le rewrite a échoué par une condition INVALID
KEY.

♦ Au moment de l’exécution du REWRITE , le système utilise la clé primaire pour faire l ‘écriture
de remplacement : celle-ci doit exister dans le fichier (sinon : INVALID KEY).

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand l’article aynat la valeur de clé primaire choisie n’existe pas dans le fichier.

∗ Quand on veut créer un article avec une clé secondaire qui existe déjà et que les doubles n’ont
pas été autorisés.

[NB : en cas de problème avec des entrées-sorties sur des articles verrouillés : CF les directives de compilation WRITE-LOCK et
FDCLEAR ainsi que les run-time switches N et T.
un rewrite sur un article verrouillé echoue]

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 32


ESAT-DI [LRE] page XV-33
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.6.3 effacement

DELETE file-name RECORD

[ INVALID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-DELETE

Rôle :

Cette instruction sert à effacer l’article pour lequel on a rempli la zone clé-primaire.
Avant de faire un DELETE , en mode DYNAMIC (ou random) , il faut avoir renseigné la zone clé-primaire pour
choisir directement l’article à effacer.
On peut effacer les articles dans n’importe quel ordre.
Règles de fonctionnement :

♦ Pour utiliser DELETE le fichier doit être ouvert en I-O.

♦ L’exécution d’un DELETE met toujours à jour le file-status (par contre le file-position-indicator n’est pas modifié).

♦ La clause INVALID KEY est obligatoire.

♦ L’article effacé par DELETE reste disponible dans la zone de sortie (ZS=Record Area = niveau 1 en FD).

♦ L’article à effacer ne doit pas être verrouillé.

♦ On passe par INVALID KEY dans les cas suivants :

∗ quand l’article ayant la valeur de la clé primaire fixée n’existe pas dans le fichier.

NB : effacement d’un fichier complet :

DELETE FILE {file-name-1} . . . .

Ne pas confondre le format précédent avec celui-ci qui permet d’effacer complètement (et physiquement ) tous les fichiers cités à
condition que ceux-ci aient été préalablement fermés. (ne fonctionne pas si ils ont été fermés avec close WITH LOCK)

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 33


ESAT-DI [LRE] page XV-34
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.B.6.4 positionnement dans le fichier (START)

{ = ou alors EQUAL TO }
{ > ou alors GREATER THAN }
{ NOT < ou alors NOT LESS THAN }
START file-name KEY IS { >= ou alors GREATER THAN OR EQUAL TO }
{ < ou alors LESS THAN }
{ NOT > ou alors NOT GREATER THAN }
{ <= ou alors LESS THAN OR EQUAL TO }

data-name-1 [ WITH SIZE { identifier-1 }


split-key-name-1 { littéral-1 } ]

[ INVAKID KEY instructions impératives-1 . . . . . . ]


[ NOT INVALID KEY instructions impératives-2 . . . . . . ]

END-START

Rôle :

Sert à se positionner dans le fichier à partir d’une valeur de clé (primaire ou secondaire*).
Il faut avoir rempli la clé concernée préalablement avec la valeur choisie.
Le START ne fait pas de lecture : pour accéder au premier enregistrement correspondant à la clé choisie , il faut
faire un READ.

Tous les READ . . . NEXT qui suivent un START délivrent les articles en ordre croissant sur la clé choisie
(primaire ou secondaire) au moment du START.
La clé choisie au moment du START devient la clé de référence pour les instructions READ NEXT ou
PREVIOUS qui suivent.

[* NB (?!?) : certaines documentations COBOL indiquent que START ne fonctionne qu’avec la clé primaire.]
Règles de fonctionnement :

♦ Data-name-1 est le nom de la clé primaire ou secondaire définie dans la phrase select et dans la
description de la zone « record » en niveau 1 en FD.

Data-name-1 peut également être une partie (gauche) de clé (zone sous-groupe ou élémentaire
composant cette clé).

[CF les exemples aux paragraphes C2 C5 C7]

♦ La notion de clé concaténée (split-key-name) est spécifique à cobol-micro-focus.

♦ WITH SIZE indique le nombre de caractères à prendre en compte dans la clé.(dans ce cas identifier-1 doit être une zone
élémentaire numérique).

♦ Si le phrase KEY est spécifiée , data-name-1 doit être une zone décrite en FD.

♦ Pour utiliser START , le fichier doit être ouvert en input ou I-O.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 34


ESAT-DI [LRE] page XV-35
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

♦ Si la phrase KEY n’est pas spécifiée c’est la condition = (ou EQUAL TO) qui est prise par
défaut.

♦ La clause INVALID KEY est obligatoire (si aucune phrase USE n’a été spécifiée en
déclaratives).

♦ l’exécution du START met à jour le file status.

♦ Le START ne trouve jamais les articles verrouillés.

♦ Quand l’opérateur de comparaison est = ou > ou >= , le file-position-indicator pointe sur le premier article qui satisfait la
condition.
Quand l’opérateur de comparaison est < ou <= , le file-position-indicator pointe sur le dernier article logique qui satisfait la
condition.
Si cette clé a des doubles , le file-position-indicator pointe sur la dernière de ces entrées.

♦ Si aucun article ne satisfait la condition , on passe par INVALID KEY (le file-position-indicator
a alors une valeur indéterminée).

♦ Si la clause KEY n’est pas mentionnée , c’est la clé primaire qui est utilisée.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 35


ESAT-DI [LRE] page XV-36
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C Exercices - exemples

XV.C.1 jeu d’essai utilisé dans les exemples

N° GRADE NOM PRÉNOM FONCTION SERVICE SITE


cléP clé S clé S clé S clé S clé S clé S

3246 sch MIRAMON/DEVI. damiene . superviseur . détachemen. Cesson-sévigné.


3310 maj JAOUEN . bernard . officier m c. dgar/cs/sa. Cesson-sévigné.
3320 p1 ADAM . michel . brocheur-en-. dgar/cs/sa. Cesson-sévigné.
3328 sgt LABAT . eric . cellule effe. dgar/cs/b.. Cesson-sévigné.
3362 cch ANDRE/MARTIN. emilienn. services tec. dgar/cs/st. Cesson-sévigné.
3363 maj ALLAIN . louis . adjoint ante. dgar/cs/st. Cesson-sévigné.
3375 adc LATEUR . jean-pie. chef service. dgar/cs/sg. Cesson-sévigné.
3376 gv KARMANN . daniel . plombier . dgar/cs/sg. Cesson-sévigné.
3402 adc LAVOISIER . ronald . cellule stag. dgf /cs/bf. Cesson-sévigné.
3487 adc BELMONTE . jean-man. moniteur epm. dgf /cs/ds. Cesson-sévigné.
3522 adj MEAU . marie-pa. instructeur . dgar/cs/dr. Cesson-sévigné.
3537 adj MADEC . alain . instructeur . dgf /cs/ds. Cesson-sévigné.
3539 sch ALLAIN . patrick . instructeur . dgf /cs/ds. Cesson-sévigné.
3552 cne LE DARZ . patrick . instructeur . dgf /cs/ds. Cesson-sévigné.
3556 sch LE DAIN . jean-luc. instructeur . dgf /cs/ds. Cesson-sévigné.
3558 adc LE DAIN . dominiqu. instructeur . dgf /cs/ds. Cesson-sévigné.
3644 cne L'HUILLIER . marcel . instructeur . dgf /cs/ds. Cesson-sévigné.
3650 adc MARTIN . yves . instructeur . dgf /cs/ds. Cesson-sévigné.
3651 is LAFARGUE . jean-pie. instructeur . dgf /cs/ds. Cesson-sévigné.
3671 cba LAVALLARD . michel . instructeur . dgf /cs/ds. Cesson-sévigné.
3695 cce BENOIT . claude . chef-section. dgf /cs/df. Cesson-sévigné.
3696 ate ALLAN . yvan . section appa. dgf /cs/df. Cesson-sévigné.
3869 ccn LE DAIN . michèle . chef de site. dgf /cs/ds. Cesson-sévigné.
5203 cne MAHIEU . jacques . officiersupé. cdt /lvl/o. Laval .
5206 aa AMBROIS . isabelle. secrétariat . cdt /lvl . Laval .
5261 sch ANGIBAULT . patrick . centre nodal. 2cie/lvl . Laval .
5263 sgt MERCERON . thierry . centre nodal. 2cie/lvl . Laval .
5330 adj ANEN . patrick . gérant cercl. dgar/lvl/s. Laval .
5364 adc ANDREI . jean-fra. chef atelier. dgar/lvl/s. Laval .
5374 cch LE BOUBENNEC. claudine. sectétaire a. dgar/lvl/a. Laval .
5428 adc ANDRE . marcel . instructeur . dgf /lvl/d. Laval .
5567 sgt ANGIBAUD . pierre . armurier . ucl /lvl . Laval .

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 36


ESAT-DI [LRE] page XV-37
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.2 consultation en mode séquentiel à partir d’une clé secondaire

IDENTIFICATION DIVISION.
PROGRAM-ID. listind.
AUTHOR. IC lre.

environment division.
input-output section.
file-control.
select fimpri assign to "c:\laf\cobol\indexe\resu1.txt".

select fcadres assign to "c:\laf\cobol\indexe\cadres.don"


organization indexed
access sequential
record key is btph
alternate record key bnom with duplicates
alternate record key bgrade with duplicates
alternate record key bfonction with duplicates
alternate record key bservice with duplicates
alternate record key bsite with duplicates
file status wst.

DATA DIVISION.
file section.
fd fimpri linage is 30.
1 sligne pic x(80).

fd fcadres.
1 benreg.
3 btph pic xxxx.
3 bgrade pic xxxx.
3 bnom pic x(25).
3 bprenom pic x(20).
3 bfonction pic x(30).
3 bservice pic x(30).
3 bsite pic x(20).

WORKING-STORAGE SECTION.
77 wctf pic 9 value 0.
88 ff value 1.
77 wchoix pic x(25) value "LAG".

1 wst.
3 wstk1 pic x.
3 wstk2.
5 wstkbin pic 99 comp-x.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 37


ESAT-DI [LRE] page XV-38
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

PROCEDURE DIVISION.
debut.
open input fcadres output fimpri
move "liste des personnes dont le nom est >= à" to sligne
move wchoix to sligne(43:)
write sligne move spaces to sligne write sligne after 3
move wchoix to bnom
start fcadres key is >= bnom
invalid key
display "je n'ai trouvé personne"
" avec un nom > = " wchoix
not invalid key
read fcadres next record
at end
set ff to true
end-read
perform until ff
move bnom to sligne
move bprenom to sligne(30:)
write sligne
read fcadres next record
at end
set ff to true
end-read
end-perform
end-start
move "fin de fichier" to sligne
move "file status = " to sligne(15:)
move wst to sligne(30:)
write sligne after 3
close fcadres fimpri
stop run.

résultat obtenu :

liste des personnes dont le nom est >= à LAG

LATEUR jean-pierre
LAVALLARD michel
LAVOISIER ronald
LE BOUBENNEC claudine
LE DAIN michèle
LE DAIN jean-luc
LE DAIN dominique
LE DARZ patrick
MADEC alain
MAHIEU jacques
MARTIN yves
MEAU marie-paule
MERCERON thierry
MIRAMON/DEVILLE damiene

fin de fichier file status = 10

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 38


ESAT-DI [LRE] page XV-39
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.3 création d’un séquentiel-indéxé (avec SPLIT KEY)

IDENTIFICATION DIVISION.
PROGRAM-ID. creind .
AUTHOR. IC LAFARGUE.
environment division.
input-output section.
file-control.
select fentree assign to "c:\laf\cobol\indexe\cadres.dat".

select fcadres assign to "c:\laf\cobol\indexe\person.don"


organization indexed
access sequential
record key is btph
alternate record key bnom with duplicates
alternate record key bgrade with duplicates
alternate record key split-k1 = bgrade bfonction
with duplicates
alternate record key split-k2 = bgrade bdeb-nom
with duplicates
alternate record key bservice with duplicates
alternate record key bsite with duplicates
file status wst.
SELECT Ftri ASSIGN TO disk
sort STATUS wst.

DATA DIVISION.
fd fentree.
1 eenreg pic x(133).
fd fcadres.

1 benreg.
3 btph pic xxxx.
3 bgrade pic xxxx.
3 bnom.
5 bdeb-nom pic xx.
5 pic x(23).
3 bprenom pic x(20).
3 bfonction pic x(30).
3 bservice pic x(30).
3 bsite pic x(20).

sd ftri.
1 tenreg.
3 ttph pic xxxx.
3 tgrade pic xxxx.
3 tnom pic x(25).
3 tprenom pic x(20).
3 tfonction pic x(30).
3 tservice pic x(30).
3 tsite pic x(20).

WORKING-STORAGE SECTION.
77 wctf pic 9 value 0.
88 ff value 1.
77 wstk2-9 pic z(3) value 0.

1 wst.
3 wstk1 pic x.
3 wstk2.
5 wstkbin pic 99 comp-x.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 39


ESAT-DI [LRE] page XV-40
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

PROCEDURE DIVISION.
tri section.
debut.
sort ftri on ascending key ttph
using fentree
output procedure creation-sans-giving
stop run.

creation-sans-giving section.
debut.
open output fcadres

return ftri
at end
set ff to true
display "fichier tri vide ??"
end-return

perform until ff
write benreg from tenreg
invalid key
display "erreur de création pour "
ttph " " tnom " " tprenom
move wstk2 to wstk2-9
display "avec file status = " wst(1:1) "-" wstk2-9
end-write

return ftri
at end set ff to true
end-return

end-perform
close fcadres.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 40


ESAT-DI [LRE] page XV-41
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.4 création d’un séquentiel-indexé (directement par un tri USING-GIVING)

IDENTIFICATION DIVISION.
PROGRAM-ID. cregiv .
AUTHOR. IC LAFARGUE.
environment division.
input-output section.
file-control.
select fentree assign to "c:\laf\cobol\indexe\cadres.dat".

select fcadres assign to "c:\laf\cobol\indexe\cadres.don"


organization indexed
access sequential
record key is btph
alternate record key bnom with duplicates
alternate record key bgrade with duplicates
alternate record key bfonction with duplicates
alternate record key bservice with duplicates
alternate record key bsite with duplicates.

SELECT Ftri ASSIGN TO disk.

DATA DIVISION.
file section.

fd fentree.
1 eenreg pic x(133).

fd fcadres.
1 benreg.
3 btph pic xxxx.
3 bgrade pic xxxx.
3 bnom.
5 bdeb-nom pic xx.
5 pic x(23).
3 bprenom pic x(20).
3 bfonction pic x(30).
3 bservice pic x(30).
3 bsite pic x(20).

sd ftri.
1 tenreg.
3 ttph pic xxxx.
3 pic x(129).
PROCEDURE DIVISION.
tri section.

debut.
sort ftri on ascending key ttph
using fentree
giving fcadres
stop run.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 41


ESAT-DI [LRE] page XV-42
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.5 exemples de START (mode séquentiel)

IDENTIFICATION DIVISION.
PROGRAM-ID. start1.
AUTHOR. IC lre.

environment division.
input-output section.
file-control.

select fimpri assign to wresu.

select fcadres assign to "c:\laf\cobol\indexe\cadres.don"


organization indexed
access sequential
record key is btph
alternate record key bnom with duplicates
alternate record key bgrade with duplicates
alternate record key bfonction with duplicates
alternate record key bservice with duplicates
alternate record key bsite with duplicates
file status wst.

DATA DIVISION.
file section.
fd fimpri linage is 30.
1 sligne pic x(80).

fd fcadres.
1 benreg.
3 btph.
5 bdebut-cle-primaire pic xx.
5 pic xx.
3 bgrade pic xxxx.
3 bnom.
5 bdebut-nom pic xxx.
5 pic x(22).
3 bprenom pic x(20).
3 bfonction pic x(30).
3 bservice pic x(30).
3 bsite pic x(20).

WORKING-STORAGE SECTION.
77 wctf pic 9 value 0.
88 ff value 1.
77 wchoix pic x(25) value "LAG".
1 wzone-test-start pic 9 value 0.
1 wresu pic x(65) value "c:\laf\cobol\indexe\restart?.txt".
1 werreur-start pic 9 value 0.
88 erreur-start value 1.
1 wbnum1 pic xxxx value "3500".
1 wbnum2 pic x(6) value "36".
1 wst.
3 wstk1 pic x.
3 wstk2.
5 wstkbin pic 99 comp-x.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 42


ESAT-DI [LRE] page XV-43
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

PROCEDURE DIVISION.
debut.
display "donnez un n° (0,1,2,3)" at line 24 col 1
accept wzone-test-start at line 24 col 40
move wzone-test-start to wresu(28:1)
open input fcadres output fimpri
write sligne from " liste des cas sélectionnés"
move spaces to sligne
write sligne after 3
evaluate wzone-test-start
when 0
move wchoix to bnom
start fcadres key is > bnom
invalid key
set erreur-start to true
end-start
when 1
move "LE " to bdebut-nom
start fcadres key is < bdebut-nom
invalid key
set erreur-start to true
end-start
when 2
move "53" to bdebut-cle-primaire
start fcadres key is = bdebut-cle-primaire
invalid key
set erreur-start to true
end-start
when 3
move "52" to btph
start fcadres key is > btph
invalid key
set erreur-start to true
end-start
end-evaluate
if not erreur-start
then
read fcadres next record
at end
set ff to true
end-read
perform until ff
move "n° de téléphone=" to sligne
move btph to sligne(17:4)
move bnom to sligne(22:)
move bprenom to sligne(58:)
write sligne
read fcadres next record
at end
set ff to true
end-read
end-perform
move "fin de fichier" to sligne
move "file status = " to sligne(15:)
move wst to sligne(30:)
write sligne after 3
else
display "erreur avec le start-cas-" wzone-test-start
end-if
close fcadres fimpri
stop run.

résultats obtenus dans le fichier restart0.txt :


liste des cas sélectionnés

n° de téléphone=3375 LATEUR jean-pierre


n° de téléphone=3671 LAVALLARD michel
n° de téléphone=3402 LAVOISIER ronald
n° de téléphone=5374 LE BOUBENNEC claudine
n° de téléphone=3556 LE DAIN jean-luc
n° de téléphone=3558 LE DAIN dominique
n° de téléphone=3869 LE DAIN michèle
n° de téléphone=3552 LE DARZ patrick
n° de téléphone=3537 MADEC alain
n° de téléphone=5203 MAHIEU jacques
n° de téléphone=3650 MARTIN yves
n° de téléphone=3522 MEAU marie-paule

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 43


ESAT-DI [LRE] page XV-44
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

n° de téléphone=5263 MERCERON thierry


n° de téléphone=3246 MIRAMON/DEVILLE damiene
fin de fichier file status = 10

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 44


ESAT-DI [LRE] page XV-45
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

résultats obtenus dans le fichier restart1.txt :

liste des cas sélectionnés

n° de téléphone=3402 LAVOISIER ronald


n° de téléphone=5374 LE BOUBENNEC claudine
n° de téléphone=3556 LE DAIN jean-luc
n° de téléphone=3558 LE DAIN dominique
n° de téléphone=3869 LE DAIN michèle
n° de téléphone=3552 LE DARZ patrick
n° de téléphone=3537 MADEC alain
n° de téléphone=5203 MAHIEU jacques
n° de téléphone=3650 MARTIN yves
n° de téléphone=3522 MEAU marie-paule
n° de téléphone=5263 MERCERON thierry
n° de téléphone=3246 MIRAMON/DEVILLE damiene

fin de fichier file status = 10

résultats obtenus dans le fichier restart2.txt :

liste des cas sélectionnés

n° de téléphone=5330 ANEN patrick


n° de téléphone=5364 ANDREI jean-françois
n° de téléphone=5374 LE BOUBENNEC claudine
n° de téléphone=5428 ANDRE marcel
n° de téléphone=5567 ANGIBAUD pierre

fin de fichier file status = 10

résultats obtenus dans le fichier restart3.txt :

liste des cas sélectionnés

n° de téléphone=5203 MAHIEU jacques


n° de téléphone=5206 AMBROIS isabelle
n° de téléphone=5261 ANGIBAULT patrick
n° de téléphone=5263 MERCERON thierry
n° de téléphone=5330 ANEN patrick
n° de téléphone=5364 ANDREI jean-françois
n° de téléphone=5374 LE BOUBENNEC claudine
n° de téléphone=5428 ANDRE marcel
n° de téléphone=5567 ANGIBAUD pierre

fin de fichier file status = 10

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 45


ESAT-DI [LRE] page XV-46
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.6 restructuration d’un séquentiel-indexé

IDENTIFICATION DIVISION.
PROGRAM-ID. restruc.
AUTHOR. IC LAFARGUE.

environment division.
input-output section.
file-control.

select fcadres assign to "c:\laf\cobol\indexe\cadres.don"


organization indexed
access sequential
record key is btph
alternate record key bnom with duplicates
alternate record key bgrade with duplicates
alternate record key bfonction with duplicates
alternate record key bservice with duplicates
alternate record key bsite with duplicates
file status wst.
SELECT Ftri ASSIGN TO disk
sort STATUS wst.

DATA DIVISION.
file section.

fd fcadres.
1 benreg.
3 btph pic xxxx.
3 bgrade pic xxxx.
3 bnom.
5 bdeb-nom pic xx.
5 pic x(23).
3 bprenom pic x(20).
3 bfonction pic x(30).
3 bservice pic x(30).
3 bsite pic x(20).

sd ftri.
1 tenreg.
3 ttph pic xxxx.
3 tgrade pic xxxx.
3 tnom pic x(25).
3 tprenom pic x(20).
3 tfonction pic x(30).
3 tservice pic x(30).
3 tsite pic x(20).

WORKING-STORAGE SECTION.
77 wctf pic 9 value 0.
88 ff value 1.
77 wstk2-9 pic z(3) value 0.
1 wst.
3 wstk1 pic x.
3 wstk2.
5 wstkbin pic 99 comp-x.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 46


ESAT-DI [LRE] page XV-47
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

PROCEDURE DIVISION.
tri section.
debut.

sort ftri on ascending key ttph


input procedure vidage
output procedure recreation
stop run.

vidage section.
debut.
open input fcadres
read fcadres next record
at end
set ff to true
display "fichier indexé vide ??"
end-read
perform until ff
display benreg
release tenreg from benreg
read fcadres next record
at end set ff to true
end-read
end-perform
close fcadres.

recreation section.
debut.
move 0 to wctf
open output fcadres
return ftri
at end
set ff to true
display "fichier-tri vide"
end-return
perform until ff
write benreg from tenreg
invalid key
display "erreur de création pour "
ttph " " tnom " " tprenom
move wstk2 to wstk2-9
display "avec file status = " wst(1:1) "-" wstk2-9
end-write
return ftri
at end set ff to true
end-return
end-perform
close fcadres.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 47


ESAT-DI [LRE] page XV-48
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.7 exemple de START avec split-key

IDENTIFICATION DIVISION.
PROGRAM-ID. start2.
AUTHOR. IC lre.

environment division.
input-output section.
file-control.

select fimpri assign to wresu.

select fcadres assign to "c:\laf\cobol\indexe\person.don"


organization indexed
access sequential
record key is btph
alternate record key bnom with duplicates
alternate record key bgrade with duplicates
alternate record key split-k1 = bgrade bfonction
with duplicates
alternate record key split-k2 = bgrade bdeb-nom
with duplicates
alternate record key bservice with duplicates
alternate record key bsite with duplicates
file status wst.

DATA DIVISION.
file section.
fd fimpri linage is 30.
1 sligne pic x(80).

fd fcadres.
1 benreg.
3 btph.
5 bdebut-cle-primaire pic xx.
5 pic xx.
3 bgrade pic xxxx.
3 bnom.
5 bdeb-nom pic xx.
5 pic x(23).
3 bprenom pic x(20).
3 bfonction pic x(30).
3 bservice pic x(30).
3 bsite pic x(20).

WORKING-STORAGE SECTION.
77 wctf pic 9 value 0.
88 ff value 1.

1 wz-test-split pic 9 value 0.


1 wresu pic x(65) value "c:\laf\cobol\indexe\resplit?.txt".
1 werreur-start pic 9 value 0.
88 erreur-start value 1.

1 wst.
3 wstk1 pic x.
3 wstk2.
5 wstkbin pic 99 comp-x.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 48


ESAT-DI [LRE] page XV-49
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

PROCEDURE DIVISION.
debut.
display "donnez un n° (0,1)" at line 24 col 1
accept wz-test-split at line 24 col 40

move wz-test-split to wresu(28:1)


open input fcadres output fimpri
write sligne from " liste des cas sélectionnés"
move spaces to sligne
write sligne after 3
evaluate wz-test-split

when 0
move "cne" to bgrade
move "instructeur" to bfonction
start fcadres key is >= split-k1
invalid key
set erreur-start to true
end-start

when 1
move "A" to bdeb-nom
move "cne" to bgrade
start fcadres key is >= split-k2
invalid key
set erreur-start to true
end-start

end-evaluate

if not erreur-start
then
read fcadres next record
at end
set ff to true
end-read

perform until ff
move "n°=" to sligne
move btph to sligne(5:4)
move bgrade to sligne(10:4)
move bnom to sligne(15:)
move bprenom to sligne(41:)
write sligne
read fcadres next record
at end
set ff to true
end-read
end-perform
move "fin de fichier" to sligne
move "file status = " to sligne(15:)
move wst to sligne(30:)
write sligne after 3
else
display "erreur avec le start-cas-" wz-test-split
end-if
close fcadres fimpri
stop run.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 49


ESAT-DI [LRE] page XV-50
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

résultats obtenus dans le fichier resplit0.txt :

liste des cas sélectionnés

n°= 3552 cne LE DARZ patrick


n°= 3644 cne L'HUILLIER marcel
n°= 5203 cne MAHIEU jacques
n°= 3376 gv KARMANN daniel
n°= 3651 is LAFARGUE jean-pierre
n°= 3363 maj ALLAIN louis
n°= 3310 maj JAOUEN bernard
n°= 3320 p1 ADAM michel
n°= 5261 sch ANGIBAULT patrick
n°= 3556 sch LE DAIN jean-luc
n°= 3539 sch ALLAIN patrick
n°= 3246 sch MIRAMON/DEVILLE damiene
n°= 5567 sgt ANGIBAUD pierre
n°= 3328 sgt LABAT eric
n°= 5263 sgt MERCERON thierry

fin de fichier file status = 10

résultats obtenus dans le fichier resplit1.txt :

liste des cas sélectionnés

n°= 3644 cne L'HUILLIER marcel


n°= 3552 cne LE DARZ patrick
n°= 5203 cne MAHIEU jacques
n°= 3376 gv KARMANN daniel
n°= 3651 is LAFARGUE jean-pierre
n°= 3363 maj ALLAIN louis
n°= 3310 maj JAOUEN bernard
n°= 3320 p1 ADAM michel
n°= 3539 sch ALLAIN patrick
n°= 5261 sch ANGIBAULT patrick
n°= 3556 sch LE DAIN jean-luc
n°= 3246 sch MIRAMON/DEVILLE damiene
n°= 5567 sgt ANGIBAUD pierre
n°= 3328 sgt LABAT eric
n°= 5263 sgt MERCERON thierry

fin de fichier file status = 10

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 50


ESAT-DI [LRE] page XV-51
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.8 mise à jour

Liste des modifications à apporter au fichier (listé en C1)


n° 1 C 3255 adj PINOUFLET Jules-Edouard instructeur dgf/dmsi/ps Cesson-sévigné
n° 2 C 2812 sac PIGNOUX Zidor instructeur dgf/dmsi/ps Cesson-sévigné
n° 3 C 5512 is PIGRALOUP Etienne instructeur dgf/dmsi/ps Cesson-sévigné
n° 4 M 3651 ipe chef de projet dgf/dmsi/ps Cesson-sévigné
n° 5 M 3363 cne chef-adjoint en second dgar/cs Cesson-sévigné
n° 6 S 3362
n° 7 S 3363
n° 8 S 3487
n° 9 S 5567
n° 10 C 3256 ctr PIZOU-LATRONCHE Marcel instructeur dgf/dmsi/ps Cesson-sévigné
n° 11 C 3257 lcl PICOTIN Emile instructeur dgf/dmsi/ps Cesson-sévigné
n° 12 C 3258 cne PIGEON-LAFLEUR Arthur instructeur dgf/dmsi/ps Cesson-sévigné
n° 13 S 5330

NB : dans cet exercice , les seules modifications prévues sont celles du grade , de la fonction,du service ou
du site : c’est pourquoi , les articles avec un code modification « M » ne contiennent que ces rubriques.

Pseudo-code du programme de mise à jour du fichier séquentiel-indexé

début programme de mise à jour


ouvrir les fichiers
lecture du fichier des modifications
faire tant que non fin de fichier (des modifications)
remplir la clé primaire avec le n° lu (du fichier des modifications)
lire (directement par la clé primaire ) le fichier séquentiel indexé
si l’article n’existe pas
alors
si le code modification = « C »
alors
MZS dans le fichier seq-ind des informations lues
écrire le nouvel article (WRITE)
sinon
afficher un message d’erreur
fin-si
sinon
si le code modification = « M »
alors
MZS dans la zone du fichier seq-ind des informations lues(service,fonction,grade,site)
ré-écriture de l’article sur le séq-ind (REWRITE)
sinon
si le code modification = « S »
alors
effacer l’article (DELETE) sur le seq-indexé
sinon
afficher message d’erreur
fin-si
fin-si
fin-si
lire le fichier des modifications
fin faire
fermer les fichiers
arrêt du programme.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 51


ESAT-DI [LRE] page XV-52
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

Programme cobol

IDENTIFICATION DIVISION.
PROGRAM-ID. maj.
AUTHOR. IC LAFARGUE.
environment division.
input-output section.
file-control.
select fmodif assign to "c:\laf\cobol\indexe\modif.dat".
select fcadres assign to "c:\laf\cobol\indexe\cadres.don"
organization indexed
access dynamic
record key is btph
alternate record key bnom with duplicates
alternate record key bgrade with duplicates
alternate record key bfonction with duplicates
alternate record key bservice with duplicates
alternate record key bsite with duplicates
file status wst.
DATA DIVISION.
file section.
fd fmodif.
1 menreg.
3 mcode pic x.
3 mzone.
5 mtph pic xxxx.
5 mgrade pic xxxx.
5 mfonction pic x(30).
5 mservice pic x(30).
5 msite pic x(20).
5 pic x(45).

fd fcadres.
1 benreg.
3 btph pic xxxx.
3 bgrade pic xxxx.
3 bnom.
5 bdeb-nom pic xx.
5 pic x(23).
3 bprenom pic x(20).
3 bfonction pic x(30).
3 bservice pic x(30).
3 bsite pic x(20).
working-storage section.
77 wctf pic 9 value 0.
88 ff value 1.
77 wer9 pic zzz.
1 wst.
3 wstk1 pic x.
3 wstk2.
5 wstk2-9 pic 99 comp-x.

1 wmsg pic x(50) value spaces.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 52


ESAT-DI [LRE] page XV-53
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

PROCEDURE DIVISION.
debut.
open input fmodif I-O fcadres
read fmodif
at end
set ff to true
end-read
perform until ff
move mtph to btph
read fcadres record
invalid key
if mcode = "C" or "c"
then
write benreg from mzone
invalid key
move "erreur création" to wmsg
perform erreur-i-o
end-write
else
move "article inexistant" to wmsg
perform erreur-i-o
end-if
not invalid key
if mcode = "M" or "m"
then
move mfonction to bfonction
move mservice to bservice
move mgrade to bgrade
move msite to bsite
rewrite benreg
invalid key
move "erreur modification" to wmsg
perform erreur-i-o
end-rewrite
else
if mcode = "S" or "s"
then
delete fcadres record
invalid key
move "erreur suppression" to wmsg
perform erreur-i-o
end-delete
else
move "erreur code modification" to wmsg
perform erreur-i-o
end-if
end-if
end-read
read fmodif
at end
set ff to true
end-read
end-perform
close fcadres fmodif
stop run.

erreur-i-o.
display "code modification = " mcode
display " pour n° = " mtph " => " wmsg
if wstk1 = "9"
then
move wstk2-9 to wer9
display "file-status=9-" wer9
else
display "file-status=" wst
end-if.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 53


ESAT-DI [LRE] page XV-54
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

Résultat obtenu

2812 sac PIGNOUX . Zidor . instructeur . dgf/dmsi/p. Cesson-sévigné.


3246 sch MIRAMON/DEVI. damiene . superviseur . détachemen. Cesson-sévigné.
3255 adj PINOUFLET . Jules-Ed. instructeur . dgf/dmsi/p. Cesson-sévigné.
3256 ctr PIZOU-LATRON. Marcel . instructeur . dgf/dmsi/p. Cesson-sévigné.
3257 lcl PICOTIN . Emile . instructeur . dgf/dmsi/p. Cesson-sévigné.
3258 cne PIGEON-LAFLE. Arthur . instructeur . dgf/dmsi/p. Cesson-sévigné.
3310 maj JAOUEN . bernard . officier m c. dgar/cs/sa. Cesson-sévigné.
3320 p1 ADAM . michel . brocheur-en-. dgar/cs/sa. Cesson-sévigné.
3328 sgt LABAT . eric . cellule effe. dgar/cs/b.. Cesson-sévigné.
3375 adc LATEUR . jean-pie. chef service. dgar/cs/sg. Cesson-sévigné.
3376 gv KARMANN . daniel . plombier . dgar/cs/sg. Cesson-sévigné.
3402 adc LAVOISIER . ronald . cellule stag. dgf /cs/bf. Cesson-sévigné.
3522 adj MEAU . marie-pa. instructeur . dgar/cs/dr. Cesson-sévigné.
3537 adj MADEC . alain . instructeur . dgf /cs/ds. Cesson-sévigné.
3539 sch ALLAIN . patrick . instructeur . dgf /cs/ds. Cesson-sévigné.
3552 cne LE DARZ . patrick . instructeur . dgf /cs/ds. Cesson-sévigné.
3556 sch LE DAIN . jean-luc. instructeur . dgf /cs/ds. Cesson-sévigné.
3558 adc LE DAIN . dominiqu. instructeur . dgf /cs/ds. Cesson-sévigné.
3644 cne L'HUILLIER . marcel . instructeur . dgf /cs/ds. Cesson-sévigné.
3650 adc MARTIN . yves . instructeur . dgf /cs/ds. Cesson-sévigné.
3651 ipe LAFARGUE . jean-pie. chef de proj. dgf/dmsi/p. Cesson-sévigné.
3671 cba LAVALLARD . michel . instructeur . dgf /cs/ds. Cesson-sévigné.
3695 cce BENOIT . claude . chef-section. dgf /cs/df. Cesson-sévigné.
3696 ate ALLAN . yvan . section appa. dgf /cs/df. Cesson-sévigné.
3869 ccn LE DAIN . michèle . chef de site. dgf /cs/ds. Cesson-sévigné.
5203 cne MAHIEU . jacques . officiersupé. cdt /lvl/o. Laval .
5206 aa AMBROIS . isabelle. secrétariat . cdt /lvl . Laval .
5261 sch ANGIBAULT . patrick . centre nodal. 2cie/lvl . Laval .
5263 sgt MERCERON . thierry . centre nodal. 2cie/lvl . Laval .
5364 adc ANDREI . jean-fra. chef atelier. dgar/lvl/s. Laval .
5374 cch LE BOUBENNEC. claudine. sectétaire a. dgar/lvl/a. Laval .
5428 adc ANDRE . marcel . instructeur . dgf /lvl/d. Laval .
5512 is PIGRALOUP . Etienne . instructeur . dgf/dmsi/p. Cesson-sévigné.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 54


ESAT-DI [LRE] page XV-55
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.C.9 consultation en mode DYNAMIC

programme menu pour choisir le type d’acces pour la consultation :


consulta.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. consulta initial.
AUTHOR. IC LAFARGUE.
DATA DIVISION.
file section.
01 gconsultation.
WORKING-STORAGE SECTION. . .
1 winfo value spaces . . .
3 wtitinfo pic x(38). VALUE " entrez le n° correspondant à votre choix ===>".
3 winfo1 pic x(70). 03 COL 59 BACKGROUND-COLOR 7 FOREGROUND-COLOR 1 VALUE " ".
3 winfo2 pic x(70). 03 COL 61 BACKGROUND-COLOR 7 FOREGROUND-COLOR 1 VALUE " ".
3 winfo3 pic x(70). 03 COL 63 HIGHLIGHT VALUE "¦".
3 winfo4 pic x(70). 03 LINE 24 COL 10 HIGHLIGHT VALUE "+--------------------------
1 wvalid pic x. -"--------------------------+".
03 g1-6 LINE 23 COL 60 BACKGROUND-COLOR 1 FOREGROUND-COLOR 7
1 wrep pic x. HIGHLIGHT PIC X USING w1-6 AUTO.
1 w1-6 pic x.
88 bonrep value "1" thru "8".
*linkage section.
SCREEN SECTION.
COPY "c:\laf\annu\srn\consul.ss".
* COPY "c:\laf\annu\srn\choixtyp.ss".
COPY "c:\laf\annu\srn\ginfo.ss".
PROCEDURE DIVISION.
tri section.
debut.
move 0 to w1-6
display gconsultation
accept g1-6
perform until w1-6 = "8"
if bonrep
then
evaluate w1-6
when 1
call "ac-nom" using wrep
cancel "ac-nom"
when 2
call "ac-num" using wrep
cancel "ac-num"
when 3
call "ac-serv" using wrep
cancel "ac-serv"
when 4
call "ac-fonc" using wrep
cancel "ac-fonc"
when 5
call "ac-grad" using wrep
cancel "ac-grad"
when 6
call "ac-site" using wrep
cancel "ac-site"
when 7
call "ac-multi" using wrep
cancel "ac-multi"
else
move spaces to winfo
move " warning !!!!!!" to wtitinfo
move
"savez-vous compter jusqu'à 8 ???" to winfo2
display ginfo
accept gvalid
end-if
move 0 to w1-6
display gconsultation
accept g1-6
end-perform.
exit program.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 55


ESAT-DI [LRE] page XV-56
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

consultation (accès par la fonction) : ac-fonc.cbl

IDENTIFICATION DIVISION.
PROGRAM-ID. ac-fonc initial.
AUTHOR. IC LAFARGUE.
environment division.
input-output section.
file-control.
select fcadres assign to wpath-don
organization indexed
access sequential
record key is ttph
alternate record key tnom with duplicates
alternate record key tgrade with duplicates
alternate record key tfonction with duplicates
alternate record key tservice with duplicates
alternate record key tsite with duplicates
file status wst.
DATA DIVISION. 01 gmessage.
file section. 02 LINE 8 COL 53 BACKGROUND-COLOR 4 BLINK HIGHLIGHT VALUE " "
fd fcadres. .
1 benreg. 02 COL 76 BACKGROUND-COLOR 4 BLINK HIGHLIGHT VALUE " ".
3 ttph pic xxxx. 02 gmsgfin LINE 8 COL 56 BACKGROUND-COLOR 4 BLINK HIGHLIGHT
3 tgrade pic xxxx. PIC X(20) USING wmsgfin.
3 tnom pic x(25).
3 tprenom pic x(20).
3 tfonction pic x(30) .
01 gsaisiefonc.
3 tservice pic x(30). . .
3 tsite pic x(20). . . -"----------------------------------------+".
WORKING-STORAGE SECTION. 03 gsaisifonc LINE 13 COL 29 HIGHLIGHT PIC X(30) USING
1 wflecheg pic xxx value x"11cdcd". tfonction.
1 wzondate.
3 zdate.
5 za pic 9999.
5 zm pic 99. 01 gfiche.
5 zj pic 99. . .
3 zheure pic 9(8). . .
3 zjour pic x(8) . 02 COL 80 BACKGROUND-COLOR 1 BLINK FOREGROUND-COLOR 6 HIGHLIGHT
3 ztailj pic 9. VALUE " ".
02 LINE 25 COL 1 BACKGROUND-COLOR 1 BLINK FOREGROUND-COLOR 6
3 zmois pic x(9). HIGHLIGHT VALUE "
3 ztailm pic 9. -" ".
3 zbeldate pic x(29). 02 gtyprech LINE 2 COL 39 BACKGROUND-COLOR 1 BLINK
3 ztaille pic 99. FOREGROUND-COLOR 6 HIGHLIGHT PIC X(40) USING wtyprech.
77 wctf pic 9 value 0. 02 gbeldate LINE 4 COL 50 BACKGROUND-COLOR 7 FOREGROUND-COLOR 1
88 ff value 1. HIGHLIGHT PIC X(29) USING zbeldate.
77 i pic 99 value 0. 02 gtph LINE 5 COL 19 FOREGROUND-COLOR 6 HIGHLIGHT PIC X(4)
1 winfo value spaces. USING ttph.
02 ggrade LINE 7 COL 19 FOREGROUND-COLOR 6 HIGHLIGHT PIC X(4)
3 wtitinfo pic x(38). USING tgrade.
3 winfo1 pic x(70). 02 gnom LINE 9 COL 19 FOREGROUND-COLOR 6 HIGHLIGHT PIC X(25)
3 winfo2 pic x(70). USING tnom.
3 winfo3 pic x(70). 02 gprenom LINE 11 COL 19 FOREGROUND-COLOR 6 HIGHLIGHT
3 winfo4 pic x(70). PIC X(20) USING tprenom.
1 wpath-don pic x(60) value 02 gfonction LINE 13 COL 19 FOREGROUND-COLOR 6 HIGHLIGHT
"c:\laf\annu\don\cadres.don". PIC X(30) USING tfonction.
02 gsite LINE 15 COL 19 HIGHLIGHT PIC X(20) USING tsite.
1 wvalid pic x.
02 gservice LINE 19 COL 36 BACKGROUND-COLOR 7 FOREGROUND-COLOR
1 wmsgfin pic x(20) value spaces. 0 PIC X(30) USING tservice.
1 wst pic xx. 02 gchoix LINE 24 COL 79 HIGHLIGHT PIC X USING wchoix AUTO.
1 wchoix PIC X.
1 wtyprech pic x(40).
linkage section .
1 lrep pic x.
SCREEN SECTION.
copy "c:\laf\annu\srn\msgfin.ss".
copy "c:\laf\annu\srn\saisifo.ss".
COPY "c:\laf\annu\srn\ficheno.ss".
COPY "c:\laf\annu\srn\ginfo.ss".

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 56


ESAT-DI [LRE] page XV-57
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

PROCEDURE DIVISION using lrep.


tri section.
debut.
initialize wzondate
call "newdate" using wzondate
cancel "newdate"
move "[fonctions classées par ordre alphabétique]"
to wtyprech
open i-o fcadres
display gsaisiefonc
accept gsaisifonc
call "cbl_tolower" using tfonction by value 30
start fcadres key is >= tfonction
invalid key
inspect tfonction replacing all " " by "."
move ttph to winfo1
move "n'existe pas" to winfo1(31:)
move "il n'y a pas de suivant par ordre alhabétique"
to winfo3
move "[enter]" to winfo4(50:)
display ginfo
accept gvalid
not invalid key
read fcadres next record
at end set ff to true
end-read
move spaces to wchoix
display gfiche
perform until ff or wchoix not = " "
* display gfiche
* pour éviter les sauts-image => j'essaie n displays
display gtph gnom gprenom ggrade gservice gsite
display tfonction at line 13 col 19
with highlight
foreground-color 7
background-color 2
end-display
display " fonction " at line 13 col 7
with highlight
foreground-color 7
background-color 2
end-display
display wflecheg at line 13 col 50
with highlight
foreground-color 7
background-color 12
end-display
read fcadres next record
at end
set ff to true
end-read
accept gchoix
end-perform
if ff
then
move "fin de fichier" to wmsgfin
else
move "fin recherche" to wmsgfin
end-if
display gmessage
accept gchoix
end-start
close fcadres.
exit program.

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 57


ESAT-DI [LRE] page XV-58
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

Résultat obtenu [exemples d’écrans de consultation en conversationnel]

cet écran s’affiche lorsqu’on a fait le choix ‘’4’’ dans le menu précédent

premier article trouvé avec une fonction >= à ‘’ins’’

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 58


ESAT-DI [LRE] page XV-59
Cours CBL-85 CHAPÎTRE 15 Les fichiers en organisation séquentielle-
indexée
ANS85/m-focus 11/10/2009 -
11/10/2009

XV.D Vidage physique

XV.D.1 le format IDXFORMAT »4 »

[ sera traité ultérieurement ]

XV.D.2 Les problèmes de compression

[ sera traité ultérieurement ]

Cours de COBOL-85 L’organisation séquentielle-indexée Chapître XV - page 59

Vous aimerez peut-être aussi