Bonjour!
Je suis à la recherche d'un tuto sur les fichiers relatifs, j'ai des connaissance très minime en cobol et c'est la première fois que je dois utiliser et créer des fichiers autres que séquentiel. Merci d'avance
Voiçi quelques explications sur les différents types de fichiers pour le COBOL.
Fichiers indexés
Dans un fichier d'organisation indexée, les enregistrements sont identifiés par la valeur de leur clé. La clé est un champ de l'enregistrement.
Trois modes d'accès sont possibles avec les fichiers indexés
• accès aléatoire (random) : l'accès (read, write, rewrite, delete) se fait en précisant la clé de l'enregistrement.
• accès séquentiel (séquential) l'accès se fait dans l'ordre des enregistrements. L'instruction start permet de se repositionner sur un enregistrement dont on connait la clé.
• accès dynamique (dynamic) combinaison des deux modes ci-dessus.
3.1 Déclaration d'un fichier
environment division.
input-output-section.
file-control.
select F-VOITURES
assign to "/donnees/voitures"
organization indexed
access random
record key PLAQUE.
...
data division.
file section.
fd F-VOITURES.
01 ENR-VOITURE.
02 PLAQUE pic X(10).
02 MARQUE pic X(10).
02 MODELE pic X(10).
02 COULEUR pic X(10).
3.2 Accès aléatoire (random)
open
Un fichier indexé peut être ouvert dans un des modes suivants : input, output, ou i-o (abréviation de input-output). Exemple:
open i-o F-VOITURES.
read
move "123 ABC 45" to PLAQUE.
read F-VOITURES
invalid key
display "pas de voiture dans le fichier"
not invalid key
display "modele = " MODELE
end-read
write
move "123 ABC 45" to PLAQUE.
move "SIMCA" to MARQUE.
move "1000" to MODELE.
...
write ENR-VOITURE
invalid key
display "voiture deja enregistree."
not invalid key
display "ok."
end-write.
rewrite
move "123 ABC 45" to PLAQUE.
read F-VOITURES
invalid key
display "voiture absente"
not invalid key
move "BLEU" to COULEUR
rewrite ENR-VOITURE
invalid key
display "*** ERREUR INTERNE (rewrite)"
not invalid-key
display "ok."
end-rewrite
end-read.
delete
move "123 ABC 45" to PLAQUE.
delete F-VOITURES
invalid key
display "voiture absente"
not invalid key
display "ok"
end-delete.
close
close F-VOITURES.
3.3 Accès séquentiel (séquential)
En accès séquentiel, l'ouverture peut se faire dans l'un des 4 modes : input, output, i-o, extend. Start permet de se positionner sur un enregistrement. L'instruction delete n'est pas autorisée.
read
read F-VOITURES next
at end
....
not at end
....
end-read.
Les enregistrements sont lus dans l'ordre dans lequel ils sont stockés dans le fichier. Cet ordre dépend de l'implémentation, ce n'est pas forcément l'ordre des clés.
write, rewrite
write ENR-VOITURE.
Le rewrite ne peut se faire que si on a lu préalablement un enregistrement.
start
move "123 XY 89" to PLAQUE.
start F-VOITURES, key = PLAQUE
invalid key
move FAUX to TROUVE
not invalid key
read F-VOITURES next
at end
move FAUX to TROUVE
not at end
move VRAI to TROUVE
end-read
end-start.
Le critère de comparaison peut être =, > ou >=.
3.4 Accès dynamique (dynamic)
Un fichier dynamic ne peut pas être ouvert en mode extend.
Instructions disponibles
• open fichier mode
• start fichier key .... invalid key ...
• read fichier next at end ...
• read fichier invalid key ...
• write enregistrement invalid key ...
• rewrite enregistrement invalid key ...
• delete fichier invalid key ...
• close fichier
3.5 Clés multiples
Exemple:
environment division.
input-output-section.
file-control.
select F-VOITURES
assign to "/donnees/voitures"
organization indexed
access random
record key PLAQUE
alternate record key MARQUE with duplicates.
...
procedure division.
...
move "PEUGEOT" to MARQUE.
start F-VOITURES key = MARQUE
invalid key
display "Pas de Peugeot"
not invalid key
move FAUX to FIN-FICHIER
perform until FIN-FICHIER = VRAI
read F-VOITURES next
at end
move VRAI to FIN-FICHIER
not at end
if MODELE = "403" then
display PLAQUE, MODELE
end-if
end-read
end-perform
end-start.
4. Fichiers relatifs
Un fichier d'organisation relative est une sorte de tableau dont les cases, indicées de 1 à n, contiennent un enregistrement ou rien.
Les fichiers relatifs ont beaucoup de points communs avec les fichiers indexés : modes d'accès (aléatoire, séquentiel, dynamique), modes d'ouverture (lecture, ecriture, lecture-écriture, extension).
Les différences principales sont que :
• la clé est nécessairement numérique (c'est le numéro de l'enregistrement),
• la clé n'est pas un champ de l'enregistrement,
• il n'y a pas de clé secondaire.
4.1 Déclaration d'un fichier
environment division.
input-output-section.
file-control.
select F-ARTICLES
assign to "/donnees/catalogue"
organization relative
access random
relative key NUMERO-ARTICLE.
...
data division.
file section.
fd F-ARTICLES.
01 ENR-ARTICLE.
02 DESIGNATION pic X(10).
02 PRIX-UNITAIRE pic 9(6)v99.
...
working-storage section.
77 NUMERO-ARTICLE pic 9(3).
4.2 Accès aléatoire (random)
Se fait en renseignant la clé, puis en lançant l'opération (READ, WRITE, REWRITE, DELETE) avec (obligatoirement) la clause INVALID KEY.
4.3 Accès séquentiel (sequential)
Les opérations autorisées sont
• READ fichier NEXT, AT END ...
• WRITE enregistrement
• REWRITE enregistrement
• START KEY condition clé, INVALID KEY ...
4.4 Accès dynamique (dynamic)
Combinaison des modes séquentiel et aléatoire:
• READ fichier, INVALID KEY ...
• READ fichier NEXT, AT END ...
• WRITE enregistrement INVALID KEY ...
• REWRITE enregistrement INVALID KEY
• START KEY condition clé, INVALID KEY ...
Cordialement
HULK77
__________________________
Ma fabrique de chemises tourne à plein régime !!!
merci beaucoup Hulk77, tu as répondu à ma question et même d'autres questions que je me posais sur les fichiers indexés ainsi que les différents modes de lecture possible, merci beaucoup pour ton aide.
biz
salut hulk77, j'ai bien avancé dans mon projet grâce à tes infos.
Là je suis un peu bloqué pour le moment, je n'arrive pas à recommencer une lecture d'un enregistrement à partir du début de mon fichier relatif. Existe-t-il une instruction qui permet de recommencer la lecture à partir du debut d'un fichier relatif (ainsi que pour indexé et relatif?). Je souhaite pas fermer mon fichier et le reouvrire juste après, c'est un moyen je pense mais c'est pas tres propre.