Notes de cobol

Transcription

Notes de cobol
IEPSCF Uccle
Section informatique
Langage orienté gestion
D’après les notes prises au cours de
Mme Dominguez
2002
Feyaerts prod
TABLE DES MATIÈRE
1. Structure d'un programme Cobol .................................................................................2
Convention .......................................................................................................................4
Environnement .................................................................................................................4
2. Les déclarations .............................................................................................................5
Les zones.........................................................................................................................5
Les sous zones ................................................................................................................5
Les variables ....................................................................................................................5
Les données.....................................................................................................................5
Les tables.........................................................................................................................5
3. Les instructions ..............................................................................................................5
L'exécution .......................................................................................................................6
L'affichage........................................................................................................................6
Instructions arythmétiques ...............................................................................................6
L'addition ......................................................................................................................6
La multiplication............................................................................................................7
La soustraction .............................................................................................................7
La division.....................................................................................................................7
Les instructions de transfert .............................................................................................8
La lecture......................................................................................................................8
L'affectation à une variable...........................................................................................8
Les instructions de test ....................................................................................................8
L'alternative ..................................................................................................................8
4. L'arithmétique signée.....................................................................................................9
Introduction ......................................................................................................................9
Les nombres réels Problème de la virgule......................................................................9
Rappel ..........................................................................................................................9
Méthode........................................................................................................................9
L'arithmétique Signée ......................................................................................................9
Rappel ..........................................................................................................................9
Méthode......................................................................................................................10
Et pour plus de précision !..............................................................................................10
Le décimal condensé..................................................................................................10
La virgule flottante ......................................................................................................10
Pour plus de rapidité ......................................................................................................10
Déclaration en binaire pur ..........................................................................................10
5. Les caractères d'insertions .........................................................................................11
Introduction ....................................................................................................................11
Les zones d'édition ........................................................................................................11
Les zones numériques ...................................................................................................11
Le signe décimal : la virgule .......................................................................................11
Le signe ......................................................................................................................11
Le signe monétaire .....................................................................................................12
Les caractères de remplacement...................................................................................12
6. Les fichiers standards..................................................................................................13
Description du ficher physique .......................................................................................13
Description du ficher physique .......................................................................................14
Ouverture, lecture, écriture, fermeture de fichiers..........................................................14
Ouverture....................................................................................................................14
Lecture........................................................................................................................14
Ecriture .......................................................................................................................14
Fermeture ...................................................................................................................15
Un exemple ....................................................................................................................16
La clause redefines ........................................................................................................17
la clause justify...............................................................................................................18
L’essentiel sur le Cobol
page 2
Feyaerts Prod
La clause corresponding ................................................................................................18
Conséquence importante. ..........................................................................................18
7. Les tables ......................................................................................................................19
Tables à 1 dimension .....................................................................................................19
Accès / affichage ........................................................................................................19
Tables à 2 dimensions (ou tableaux) ..........................................................................19
Déclaration table de structure.....................................................................................19
Déclaration d'une structure de tableau.......................................................................20
Accès et utilisation......................................................................................................20
Initialisation d'une table..................................................................................................20
A la compilation ..........................................................................................................20
Pendant le traitement .................................................................................................21
Les tables indexées .......................................................................................................22
Déclaration d'index .....................................................................................................22
Déclaration d'un index indépendant.(Qui n'est pas associé à une table) ...................22
Sauvegarde d'un index...............................................................................................22
Liste des comparaison entre index.............................................................................22
Manipulation d'index...................................................................................................22
L'instruction set .............................................................................................................23
Addition / incrémentation d'index................................................................................23
La recherche séquentielle en cobol. ..............................................................................23
La recherche dichotomique en cobol. ............................................................................23
8. Et pour terminer… ........................................................................................................25
L'instruction compute. ....................................................................................................25
L'instruction evaluate .....................................................................................................26
La clause rounded..........................................................................................................26
La clause size error........................................................................................................26
9. La fusion de fichiers.....................................................................................................27
Méthode......................................................................................................................27
Exemple......................................................................................................................27
Exercice......................................................................................................................29
L’essentiel sur le Cobol
page 3
Feyaerts Prod
1. STRUCTURE D'UN PROGRAMME COBOL
4 divisions :
Identification Division
Permet l’identification du programme et de son auteur.
Environment division
Tout ce qui est extérieur au programme : on y déclare
les fichiers de données.
Data division
Partie la plus longue. On y déclare les variables. C’est
l’inconvénient du Cobol… il faut tout déclarer.
Procedure division.
Instruction du traitement des données.
Exemple
IDENTIFICATION DIVISION.
PROGRAM-ID RECTANGL.
AUTHOR. FEYAERTS.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 LO PIC 99 VALUE 18.
77 LA PIC 99 VALUE 15.
77 PER PIC 99.
77 SURF PIC 999.
PROCEDURE DIVISION.
PROG.
ADD LO LA GIVING PER.
MULTIPLY 2 BY PER.
MULTIPLY LA BY LO GIVING SURF.
DISPLAY "PERIMETRE = " PER.
DISPLAY "SURFACE = " SURF.
STOP RUN.
CONVENTION
Toutes les lignes se terminent par un point
Tout le programme est écrit en Majuscule
On indique le titre de la division même si elle ne comporte rien.
ENVIRONNEMENT
On utilise l’environement Roscoe
Les tabulations. De 0 à 7 vide
A partir de 8 déclaration des divisions
des sections
des fichiers
des données
des paragraphes
A partir de 12 Réservé aux Instructions
On peut écrire jusqu’à la colonne 72. Au delà plus rien n’est pris en compte par le
compilateur. Æ on s’arrête au dernier mot complet et on continue à la ligne suivante
colonne 12.
L’essentiel sur le Cobol
page 4
Feyaerts Prod
2. LES DÉCLARATIONS
LES ZONES
77 Zone indépendante pour les variables du programme
01 Zone des Structures Fichiers ou tables.
LES SOUS ZONES
Exemples :
01
ENR.
02 NOM PIC X(20)
02 DATENAIS
03 JJ PIC 99
03 MM PIC 99
03 AA PIC 00
02 ADRESS
03 NUM PIX X(10)
03 RUE PIC X(20)
Jamais de PIC en 01.
La sous zone porte un numéro supérieur mais pas nécessairement immédiatement
supérieur.
Les Sous zones de même niveau ont le même numéro
LES VARIABLES
Toujours dans la WORKING-STORAGE de la DATA DIVISION
Format : Leur nom débutent toujours par une lettre et ne comportent pas d’espace trait
d’union permis pas de caractères spéciaux.
Variables numériques: Cadrées à droite permettent les calculs.
77..NOMVAR PIC 9(longueur en chiffre) [VALUE Valeur initiale] .
Variables Alphanumérique : Cadrées à gauche
77
NOMVAR PIC X(Nb de caractères) [VALUE "Valeur"].
RMQ Longueur maximale 16
LES DONNÉES
Immédiatement sous les variables
01
NOMFICHIER.
02 NOMVAR1 PIC X/9(longueur).
02 NOMVAR2 PIC X/9(longueur).
LES TABLES
Immédiatement sous les données
01
TAB.
02 ELEM OCCURS (Nb d'éléments).
03 TNOMVAR1 PIC X/9(longueur).
03 TNOMVAR2 PIC X/9(longueur).
3. LES INSTRUCTIONS
Les dernières variables sont dites réceptrices car elles reçoivent le résultat de l'instruction.
K = constante ou littéral
Var = Ident ou Variable
L’essentiel sur le Cobol
page 5
Feyaerts Prod
L'EXÉCUTION
Convention : § = paragraphe
PERFORM §1 [THROUGH/THRU § 2].
PERFORM §1 [THROUGH/THRU § 2] K/Var TIMES.
PERFORM §1 [THROUGH/THRU § 2] UNTIL condition.
Exemple :
PROG.
PERFORM DEBUT.
PERFORM TR1 UNTIL ENR = "*".
PERFORM INTER.
PERFORM TR2 2 TIMES.
PERFORM FIN.
STOP RUN.
STOP RUN Indique au programme qu'il doit s'arrêter
Exemple 2 :
PROG.
PERFORM A
PERFORM B UNTIL ENR "*".
PERFORM C.
STOP RUN
A.
B.
PERFORM D.
PERFORM E 3 TIMES.
PERFORM F
C.
D.
...
L'AFFICHAGE
DISPLAY K/Var1 [K2/Var2] ... .
Les constantes sont affichées comme telle
Seul le contenu des variables est affiché
Exemple : DISPLAY "J'ai_"age"_ans" Æ J'ai 024 ans
INSTRUCTIONS ARYTHMÉTIQUES
L'addition
1ère forme
ADD K/Var [K2/Var2] ... TO Var3 [Var4]....
Le contenu de la variable réceptrice est implémenté du résultat de l'addition.
Exemple
ADD A TO B.
B=B+A
ADD A B TO C.
C = C + (A + B)
ADD A TO B C.
C= C + A & B = B + A
L’essentiel sur le Cobol
page 6
Feyaerts Prod
2ème Forme
ADD K/Var [K2/Var2] ... GIVING Var3 [Var4]....
Le contenu de la variable réceptrice est écrasé et reçoit le résultat de l'addition.
C'est l'addition traditionnelle
Exemple
ADD A TO B GIVING C.
C=A+B
La multiplication
1ère forme
MULTIPLY K/Var BY Var2 [Var3]....
Le contenu de la variable réceptrice est implémenté du résultat de la multiplication.
Exemple
MULTIPLY A B BY C
C = (A + B) * A
MULTIPLY A BY B C
C=C*A
B=B*A
RMQ pour A = A * B * C on a besoin de deux étapes
MULTIPLY B BY A
MULTIPLY C BY A
2ème Forme
MULTIPLY K/Var BY K2Var2 GIVING Var3 [Var4]....
Le contenu de la variable réceptrice est écrasé et reçoit le résultat de la multiplication.
Exemple
MULTIPLY A BY B GIVING C
C= A * B
La soustraction
1ère forme
SUBTRACT K/Var [K2/VAR2]... FROM Var3 [Var4]....
Exemple
SUBTRACT A FROM B
A= A – B
SUBTRACT A B FROM C
C = C – (A + B)
2ème forme
SUBTRACT K/Var [K2/VAR2]... FROM Var3... GIVING Var4.
C'est la soustraction traditionnelle
Exemple
SUBTRACT A FROM B GIVING C
C=A–B
La division
1ère forme
DIVIDE K/Var INTO Var2 [Var3]....
Le diviseur précède
La zone réceptrice est le dividende
Exemple
DIVIDE A INTO B
B=B:A
L’essentiel sur le Cobol
page 7
Feyaerts Prod
2ème forme
DIVIDE K/Var BY Var2 GIVING Var3 [Var4] ...
Le diviseur suit
Exemple
DIVIDE B BY C GIVING A.
A=B:C
RMQ on peut aussi traduire DIVIDE C INTO B GIVING A.
Mais alors le diviseur précède
LES INSTRUCTIONS DE TRANSFERT
La lecture
ACCEPT Ident .
Cette instruction lit séquentiellement les enregistrements d'un fichier et vient en ranger
une copie dans ident. Ident que l'on aura pris soin de déclarer et dont on aura décrit
l'image.
Exemple
ACCEPT ENR.
L'affectation à une variable
MOVE K/Var TO Var2 [Var3]....
La constante ou le contenu de la variable sera transféré dans la ou les variables
réceptrice(s).
La règle de cadrage est bien sur d'application le cadrage dépend du gabarit (de l'image).
Exemple
MOVE 0 TO CPT.
ÆCPT = 0
MOVE A TO B C.
ÆB = A et C = A
LES INSTRUCTIONS DE TEST
L'alternative
IF condition THEN Série d'instructions 1 [ELSE Série d'instruction 2] .
Ou
IF condition THEN Série d'instructions 1[ ELSE Série d'instruction 2] END-IF.
Exemple :
IF CPT = 0
THEN display "fichier vide"
ELSE DISPLAY "non vide".
pas de point
pas de point
point = fin de IF
Remarque le ELSE est facultatif si la 2ème branche de l'alternative est vide; dans ce cas le
THEN est aussi facultatif.
L’essentiel sur le Cobol
page 8
Feyaerts Prod
4. L'ARITHMÉTIQUE SIGNÉE.
INTRODUCTION
La plupart de langages ont été développes aux Etats-Unis qui utilisent le point comme
séparateur décimal et la virgule comme séparateur de millier.
Monde francophone
11.000.000
3,1416
Monde anglophone
11,000,000
3.1416
On peut configurer la ENVIRONMENT DIVISION de façon à contourner ce problème ainsi
que le signe de la monnaie. en y incluant
ENVIRONMENT DIVISION
CONFIGURATION SECTION
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
CURRENCY SIGN IS €.
LES NOMBRES RÉELS Problème de la virgule
Rappel
En cobol les nombres sont stockés en mémoire sous forme décimal codé binaire soit un
Octet par chiffre.
Exemple
1950 est codé F1 F9 F5 F0
Méthode
On doit d'abord déclarer travailler avec des nombres réels par une variable sur laquelle on
peut effectuer des calculs (avec une virgule virtuelle notée V).
Ensuite prévoir une variable uniquement pour afficher le chiffre. Sur cette variable, on ne
peut effectuer de calculs.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 NOMVAR
PIC 99V99. nomvar est codé sur 4 octets (1 octet par chiffre)
77 NOMVARAFF PIC 99,99. nomvaraff est codé sur 5 octets (1 / chiffre +1 virgule)
…
MOVE 15,25 TO NOMVAR
MOVE NOMVAR TO NOMVARAFF.
DISPLAY NOMVARAFF.
En ce qui concerne le cadrage il est centré sur la virgule
77 CPT PIC 99V99
MOVE 234,375 TO CPT
MOVE CPT TO CPTAFF
DISPLAY CPTAFF Æ 34,37
L'ARITHMÉTIQUE SIGNÉE
Rappel
En cobol les nombres signés sont stockés en mémoire sous forme décimal étendu codé
binaire soit un Octet par chiffre.
Exemple
1950 est codé F1 F9 F5 C0
C pour +
Exemple
-950 est codé F9 F5 d0
D pour -
L’essentiel sur le Cobol
page 9
Feyaerts Prod
Méthode
On doit d'abord déclarer travailler avec des nombres signés par une variable sur laquelle
on peut effectuer des calculs. au moyen du signe S
Ensuite prévoir une variable uniquement pour afficher le chiffre. Sur cette variable, on ne
peut effectuer de calculs.
DATA DIVISION.
WORKING-STORAGE SECTION.
POS
PIC S9999.
codé sur 4 octets
POSAFF PIC +9999.
codé sur 5 octets
NEG
PIC S999.
NEGAFF PIC –999.
MOVE +1678 TO POS.
codé F1 F6 F7 C8
MOVE POS TO POSAFF.
MOVE –123 TO NEG.
MOVE NEG TO NEGAFF.
DISPLAY POSAFF NEGAFF.Æ +1678 -123
ET POUR PLUS DE PRÉCISION !
Par défaut le cobol utilise le cade décimal étendu des plus gourmand en espace mémoire.
Le décimal condensé
est plus économe
On le déclare comme suit :
77 DECOND PIC 9(3) COMP-3 VALUE 423
- La variable DECOND est déclarée
- Une zone de 3 octets [9(3)] lui est réservée.(L/2 )+1
- Elle est codée en décimal condensé COMP-3
- En mémoire 423 est donc stocké sous forme de 00 42 3C
- En mémoire - 423 est stocké 00 42 3C
La virgule flottante
Pour encore plus de précision.
Se déclare comp-1 en simple précision sur 8 octets
comp-2 en double précision sur 18 octets
POUR PLUS DE RAPIDITÉ
Déclaration en binaire pur
Le cobol traduit du décimal Æ binaire Æ hexadécimal pour le stockage des données en
mémoire.
Ensuite de l'hexadécimal Æ binaire Æ décimal pour l'affichage.
La déclaration en binaire permet d'éviter 2 étapes
binaire Æhexadécimal Æ binaire
On l'utilise pour les variables sur lesquelles on effectue beaucoup de calcul et dont les
résultats intermédiaires ne doivent pas être affichés. Par exemple les compteurs.
CPT PIC 9(3) COMP VALUE 0.
CPTAFF PIC 9(3).
…
DISPLAY CPTAFF Æ 100
L’essentiel sur le Cobol
page 10
Feyaerts Prod
5. LES CARACTÈRES D'INSERTIONS
INTRODUCTION
Pour plus de lisibilité, il peut être utile de pouvoir insérer des caractères
B
/
0
zones d'édition
insère un blanc (espace)
utile pour les dates
insère un 0 (zéro)
zones numériques
, utile pour les décimale + indique le signe + ou .
- indique - si nég
$ currency
LES ZONES D'ÉDITION
WORKING-STORAGE SECTION.
77 A
PIC X(7) VALUE BONJOUR.
77 AED
PIC XXXBXXXX.
77 DAT
PIC X(6)99 VALUE 280202.
77 DATED PIC XX/XX/XX.
. . .
DISPLAY AED.
BON JOUR
DISPLAY DATED.
28/02/02
LES ZONES NUMÉRIQUES
Le signe décimal : la virgule
D'abord il faut déclarer le nouvel environnement dans la CONFIGURATION SECTION de
l'ENVIRONMENT DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID NOMPROG.
AUTHOR. MOI.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
DECIMAL-POINT IS COMA.
CURRENCY SIGNE IS "€"
ne pas oublier les " car € est alphanumérique
DATA DIVISION.
WORKING-STORAGE SECTION.
77 PRIX
PIC 9(3)V99 VALUE 103,45. 5 octets en mémoire
77 PRIXED PIC 9(3),9(2).
6 octets en mémoire
.
PROCEDURE DIVISION.
DISPLAY PRIXED.
103,45
Attention les 2 zones doivent être compatibles sous peine de troncature. et le V doit avoir
la même place que la, sinon le résultat d'une opération peut apparaître faux.
Le signe
S déclare un signe
+ permet l'affichage de + et –
- n'autorise l'affichage que du signe - pour les valeurs négatives.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 AA
PIC S9(3).
77 AAED PIC +9(3).
77 BB
PIC S9(2) VALUE -15.
L’essentiel sur le Cobol
3 octets en mémoire
4 octets en mémoire
2 octets en mémoire
page 11
F1D5
Feyaerts Prod
77
77
77
3 octets en mémoire
4 octets en mémoire
5 octets en mémoire
BBED PIC -9(2).
CC
PIC S9(4) VALUE 25.
CCED PIC +9(4).
.
PROCEDURE
ADD CC
MOVE AA
MOVE BB
MOVE CC
DISPLAY
DISPLAY
DISPLAY
DIVISION.
TO BB GIVING AA.
TO AAED.
TO BBED.
TO CCED.
AAED.
BBAED.
CCAED.
F0F0F2C5
FOF1F0
010
-15
25
Le signe monétaire
D'abord il faut déclarer le nouvel environnement dans la CONFIGURATION SECTION de
l'ENVIRONMENT DIVISION.
IDENTIFICATION DIVISION.
PROGRAM-ID NOMPROG.
AUTHOR. MOI.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION
SPECIAL-NAMES.
DECIMAL-POINT IS COMMA.
CURRENCY SIGN IS "€"
ne pas oublier les " car € est alphanumérique
DATA DIVISION.
WORKING-STORAGE SECTION.
77 PRIX
PIC S999V99 VALUE 100,25. 5 octets en mémoire
77 PRIXED PIC +€9(3),9(2).
8 octets en mémoire
.
PROCEDURE DIVISION.
DISPLAY PRIXED.
+€100,25
Attention : le signe + ou – doit toujours être à gauche du signe monétaire.
On peut donc avoir
+€ NOMVAR
+NOMVAR€
NOMVAR+€
mais pas
€NOMVAR+
LES CARACTÈRES DE REMPLACEMENT.
Z
*
$
+
77
77
77
77
Remplace les 0 non significatifs par des blancs
ou
€
Remplace les 0 non significatifs par des *
Remplace les 0 non significatifs par un $ ou €
Remplace les 0 non significatifs par un + ou un Remplace les 0 non significatifs par un – si la valeur est négative
VAL
VALED1
VALED1
VALED1
PIC
PIC
PIC
PIC
9(5) VALUE 10.
ZZZZ9(2).
ZZ9(3).
***9(2).
L’essentiel sur le Cobol
5 octets en mémoire
10
010
***10
page 12
Feyaerts Prod
77
77
77
**010
10
***10
VALED1 PIC **9(3).
VALED1 PIC ZZZZZ9.
VALED1 PIC *****9.
Les caractères de remplacement n'affectent pas l'affichage de valeurs significative
En règle générale, on laisse deux pic 9 de part et d'autre de la virgule.
Malgré tout le 0 qui précède la virgule est toujours significatif.
77
77
77
77
VAL
VALED1
VALED1
VALED1
77
77
77
77
PRIX
PRIXED
PRIXED
PRIXED
PIC
PIC
PIC
PIC
99V99 VALUE 4,05.
ZZ,9Z.
9(3),9ZZ.
**9,**.
PIC
PIC
PIC
PIC
4 octets en mémoire
4,05
004,05
**4,05
4 octets en mémoire
€032
€32
€32
9(6) VALUE 32.
€€€9(3).
€€€€€9.
€(6).
RMQ avec €(5) on aura un warning.
N'importe où
à droite
Insertion
à gauche
B / 0 , .
+ - $ €
+ - $ €
Remplacement
Z *
$ €
6. LES FICHIERS STANDARDS
Les fichiers physiques sont un ensemble de données stockées sur un support
Les fichiers logiques sont un ensembles de données et leur description (quelles sont-elles
où sont-elles, sous quelle forme.)
ETAPES il faut :
1. Décrire le(s) fichier(s) physiques et sa (leur) configuration dans L'ENVIRONMENT
DIVISION.
2. Décrire le(s) fichier(s) logiques et sa (leur) format d'enregistrement dans la DATA
DIVISION.. avant la WORKING-STORAGE SECTION.
3. Utiliser, traiter les données lire et écrire ouvrir fermer dans la PROCEDURE
DIVISION..
DESCRIPTION DU FICHER PHYSIQUE
IDENTIFICATION DIVISION.
PROGRAM-ID NOMPROG.
AUTHOR. MOI.
ENVIRONMENT DIVISION.
INPUT OUTPUT SECTION.
avant ou après SPECIAL-NAMES ???.
FILE CONTROL.
SELECT NOMFICH ASSIGN TO DDIN UT – S - DDIN.
Où "NOMFICH" est un nom que l'on donne au fichier et qui sera utilisé par le programme.
"DDIN" fait référence à la carte JCL.
"UT" signifie Unité lente (UR = Unité rapide)
"S" signifie fichier séquentiel
L’essentiel sur le Cobol
page 13
Feyaerts Prod
La dernière ligne du programme sera la carte JCL qui dira au programme : quand tu vois
nomfich va voir le nom du fichier physique. (carte JCL = ligne de JCL)
//GO.DDIN DD DSN=NOMPHYSIQUE,DIST=DISP=SHR
La carte JCL ne se termine pas par un point
Respecter les espace !!!
DESCRIPTION DU FICHER PHYSIQUE
data division.
file section.
FD NOMFICH RECORDING MODE F LABEL RECORD STANDARD.
Où FD signifie File Description.
Où NOMFICH est le nom que l'on a donné au fichier.
MODE F signifie que les enregistrements ont une longueur fixe.
Immédiatement sous le FD suit la déclaration du fichier.
Attention
OUVERTURE, LECTURE, ÉCRITURE, FERMETURE DE FICHIERS.
Ouverture
Avant toute action sur un fichier lecture ou écriture il faut l'ouvrir et signaler ce que l'on
veut y faire cela se fait dans la PROCÉDURE DIVISION. :
INPUT pour le lire
OUTPUT pour y écrire
OUTPUT-OUTPUT pour une mise à jour.
OPEN INPUT NOMFICH1 OUTPUT NOMFICH2 I-O NOMFICH3 .
Lecture
Une fois le fichier ouvert on peut le lire. Il faut le lire jusqu'à la fin et signaler au
programme qu'on est arrivé à la fin du fichier.
77..EOF PIC 9 COMPT VALUE 0..
dans la data division
. . .
READ NOMFICH AT END MOVE 1 TO EOF. Après AT END pas d'alternative
seulement instruction impérative.
Ecriture
WRITE ENRFICH.
Ecrit un enregistrement
WRITE ENRFICH AFTER IDENT/LITT LINES.
Ecrit un enregistrement après avoir sauté un nombre de ligne définit par ident(variable) ou
par littéral (constante).
WRITE ENRFICH BEFORE IDENT/LITT LINES
Ecrit un enregistrement puis saute un nombre de ligne définit par ident(variable) ou par
littéral (constante).
WRITE ENRFICH AFTER IDENT/LITT PAGES.
Ecrit un enregistrement après avoir sauté un nombre de page définit par ident(variable) ou
par littéral (constante).
WRITE ENRFICH BEFORE IDENT/LITT PAGES
Ecrit un enregistrement puis saute un nombre de page définit par ident(variable) ou par
littéral (constante).
L’essentiel sur le Cobol
page 14
Feyaerts Prod
Fermeture
CLOSE NOMFICH liste de tous les fichiers.
L’essentiel sur le Cobol
page 15
Feyaerts Prod
UN EXEMPLE
Input fichier profs. ANDS.READ.PROFS
MATR
4CH
NOM
20X
AN
2CH
SX
1X
ADR
60X
CP
4CH
LOC
30X
total
121
Output imprimez la liste des profs de plus de 40 ans ainsi que leur nombre.
selon le format
2 lignes
"LISTE DES PROFS" ( = titre centré)
*** souligné
2 lignes
liste des profs
2 lignes
ligne continue (----total des profs.
Sachant qu'il y a 80 colonnes et
lignes par page.
IDENTIFICATION DIVISION.
PROGRAM-ID. PROFS.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PROFS ASSIGN TO DDIN.
SELECT IMPRIM ASSIGN TO DDOUT.
DATA DIVISION.
FILE SECTION.
2 fichiers physiques : profs et imprim
FD PROFS RECORDING MODE F LABEL RECORD STANDARD.profs = fichier physique
01 ENRPROFS.
enrprofs = fichier logique.
02 MATR
PIC 9(4).
on aurait pu mettre filler.
02 NOM
PIC X(20).
02 AN
PIC 99.
02 FILLER PIC X (95).
121 – 4 – 20 – 2 = 95
FD IMPRIM MOD F.
01 ENROUT
PIC X (80).
WORKING-STORAGE SECTION.
Variables pour le traitement & l'affichage
01 LIGNTIT.
1ère ligne à imprimer
02 FILLER PICX (32).
02 TIT PIC X(15) VALUE "LISTE DES PROFS".
15 car
02 FILLER PIC X(33)
32 –15 - 33 = 80 pour centrer sur 80 col.
01 LIGNTITSOUL.
ligne qui souligne le titre
02 FILLER PICX (32).
02 TITSOUL PIC X(15) VALUE ALL "*".
15 car
02 FILLER PIC X(33).
32 –15 - 33 = 80 pour centrer sur 80 col.
01 LIGNENR.
ligne qui affiche les noms
02 FILLER PIC X(32).
02 NOMAFF PIC X(20).
02 FILLER PIC X(28).
01 LIGNE SOUL.
ligne de soulignement avant le total
02 FILLER PIC X (80) VALUE ALL "-".
01 LIGNTOT..
ligne qui affiche le total
02 FILLER PIC X(69).
02 . . . PIC X (8) VALUE "TOTAL".Le total est affiché en fin de ligne
02 TOTAFF PIC 9 (3) VALUE ZZ9.
sans 0 non significatifs.
77 TOT PIC (9)3 VALUE 0.
77 EOF PIC 9 COMP VALUE 0.
variable binaire test de fin de fichier.
PROCEDURE DIVISION.
Enfin le traitement !
PROG.
PERFORM DEBUT.
PERFORM TRTPROFS UNTIL EOF = 1.
PERFORM FIN.
STOP RUN.
DEBUT.
OPEN INPUT PROFS OUTPUT IMPRIM.
ouverture des fichiers
MOVE LIGNTIT TO ENROUT. )
WRITE ENROUT AFTER 2. OU )
=WRITE ENROUT FROM LIGNTIT AFTER 2
WRITE ENROUT FROM LIGNTITSOUL AFTER 2.
Ecriture du titre
READ PROFS AT END MOVE 1 TO EOF.
lecture jusqu'à la fin du fichier.
L’essentiel sur le Cobol
page 16
Feyaerts Prod
TRTPROFS.
IF AN>40 THEN PERFORM IMPRESSION.
ELSE NEXT SENTENCE.
READ PROFS AT END MOVE 1 TO EOF.
lecture jusqu'à la fin du fichier.
FIN.
WRITE ENROUT FROM LIGNSOUL AFTER 2.
MOVE TOT TO TOTAFF.
WRITE ENROUT FROMLIGNTOT AFTER 2.
CLOSE PROFS IMPRIM.
fermeture des fichier Fin du 1er étage.
IMPRESSION.
ADD 1 TO TOT.
incrémentation du compteur de pros
MOVE NOM TO NOMAFF.
WRITE ENROUT FROM LIGNENR.
/
//GO.DDIN DD DSN=ANDS.READ.PROFS, DISP=SHR
Carte cobol
//GO.DDOUT DD SYSOUT=Z,OUTLIM=100 où z est l'écran et 100 le nombre de fois que peut tourner le pgm s'il boucle
//
LA CLAUSE REDEFINES
Permet de redéfinir une zone
d'un data type en un autre data type et
une structure en une autre structure.
A la condition de se situer immédiatement sous la 1ère définition et que la zone redéfinie
soit exactement de la même taille.
Exemple :
77 A PIC 9(3)
77 B REDEFINES A PIC X (3)
En mémoire il n'y a qu'une fois la valeur de A.
•
•
Sur A on peut calculer et l'affichage cadrera à droite.
Sur B on ne peut calculer et l'affichage cadrera à gauche.
Utilité :Un seul fichier peut contenir des enregistrements. on les reconnaît par une variable
initiale.
Exemple :
COD
PIC X
COD
PIC X
NUMMED
PIC X(9)
NUM-SOIN
PIC X(8)
NOMPAT
PIC X(20)
ADRESSE
PIC X(60)
NUMSIS
PIC X(12)
PRIX-SOIN
PIC 9(4),9(2)
TEL
PIC 9(9)
DATE-SOIN
PIC X(8)
88
total
111
total
111
Les enregistrements se suivent chacun occupe 111 octets, ils contiennent soit les références d'un
patient, soit les références des soins donnés à ce patient. Le type de donnée est reconnaissable
par la 1ère variable COD qui est soit 1 (ref patient) soit 2 (ref soins) ou encore 3 à la fin du ficher
Dans la pratique on fait dons une rupture sur la variable COD
L’essentiel sur le Cobol
page 17
Feyaerts Prod
LA CLAUSE JUSTIFY
MOVE K/Var TO K/Var JUST.
Utilité : permet l'affichage cadré à droite d'une variable cadrée à gauche mais doit être
défini lors de la déclaration.
01 ZONE A.
02 AA PIC X(5) VALUE "MER".
|M|E|R|Ђ|Ђ|
02 BB PIC X(5) VALUE "MAR" JUST.
|M|A|R|Ђ|Ђ|
. . .
MOVE AA TO BB
DISPLAY BB.
ЂЂMAR
Corollaire. permet de convertir une variable alphanumérique en numérique.
Si une telle variable comporte une lettre il faut tronquer par le biais des images.
01 ZONE B.
02 BA PIC X(5) VALUE "1250"
|1|2|5|0|Ђ|
02 CC PIC X(5) JUST.
|Ђ|Ђ|Ђ|Ђ|Ђ|
02 DD REDEFINES CC PIC 9(5).
LA CLAUSE CORRESPONDING
Utilité permet de déplacer une ou plusieurs sous-zone d'une structure dans une autre
structure.
01 A.
01 B.
02 Z1 PIC XX.
03 Z1 PIC XX.
02 Z2 PIC(X(3).
03 N1 PIC(9(4).
02 N1 PIC99.
03 COCO PC XX.
. . .
MOVE CORR A TO B.
Condition d'utilisation :
Les variables doivent porter le même nom et
avoir le même niveau d'ordre (pas pour autant le même numéro.
Lors du move le cadrage se fait à gauche.
Conséquence importante.
Dans un même programme plusieurs variables portent le même nom. mais appartiennent
à des structure différentes.
Ö Quand on veut y accéder il faut en spécifier la structure.
MOVE 10 TO N1 IN/FROM A.
Exemple :
NOM
20
PRENOM
10
DN
2
SX
1
CP
4
PROF
20
ONSS
8
Output : NOM *** AGE*** CP***ONSS des enseignants
01 INPUT.
02 NOM PIC X(20).
02 PRE PIC X(10).
02 DN PIC 99.
02 SX PIC X.
02 PROF PIC X(20).
02 ONSS PIC X8().
01 OUTPUT.
02 NOM PIC X(20).
02 FILLER PIC X(3) VALUE "***".
02 AGE PIC 99.
L’essentiel sur le Cobol
page 18
Feyaerts Prod
02 FILLER PIC X(3) VALUE "***".
02 CP PIC X(4).
02 FILLER PIC X(3) VALUE "***".
02 ONSS PIC X'8).
. . .
PROCEDURE DIVISION.
IF PROF = "ENSEIGNANT" THEN
SUBTRACT DN FROM 102 GIVING AGE
MOVE CORR INPUT TO OUTPUT
WRITE ENROUT FROM OUTPUT.
STOP RUN
7. LES TABLES
(Table = Mot réservé en cobol)
Le premier indice est 1 <> au "C"
TABLES À 1 DIMENSION
DÉCLARATION dans la WORKING STORAGE division.
01 NOMTABLE.
02 ELT OCCURS (DIM).
Occurs toujours sous le niveau 01; dim = nb d'élément
03 TNOM PIC X(30). de la table
03 TADR PIC X(50).
03 TDAT PIC 9(6).
TNOM
TADR
TDAT
ELT (1)
1
2
TADR(1) =ZONE
3
Par commodité , par convention et pour ne pas confondre on fait précéder les noms de
zone(champ) par un T
Dans la mémoire il est bien évident que les éléments se suivent
TNOM(1) TADR(1) TDAD(1) TNOM(2) TADR(2) TDAT(2) TNOM(3) TADR(3) ETC
Accès / affichage
DISPLAY ELT(I).
DISPLAY TADR(1)
TABLES À 2 DIMENSIONS
(ou TABLEAUX)
1 2 3 4 5 6 7 8 9
Déclaration table de structure
01 NOMTABLE2.
02 LIGNE OCCURS (10).
04 ELT OCCURS (9).
TVAR PIC 9(2).
TVAR2 PIC..
ETC . . .
LIGNE(2)
ELT(4,5)
Un élément est donc désigné par 2
indice.
L'usage veut que le premier soit la ligne
l'autre la colonne.
L’essentiel sur le Cobol
page 19
1
2
3
4
5
6
7
8
9
10
Feyaerts Prod
Déclaration d'une structure de tableau
01 NOM-TABLE-DE-STRUCTURE.
02 NOMTABLE1.
03 ELT1 OCCURS 8 PIC 99.
02 NOMTABLE2.
03 ELT2 OCCURS 3 PIC X(4).
EN MÉMOIRE ON A :
TABLE1
1
2
3
4
5
6
7
8
TABLE2
1
2
3
En grisé : ELT1(5) et ELT2(2)
Accès et utilisation
L'accès à un élément se fait par son numéro d'ordre appelé indice.
L'indice est une valeur numérique comprise entre 1 et n où n est le nombre d'élément
défini par OCCURS.
L'indice est une variable qui doit être déclarée.
La déclaration de l'indice se fera en binaire (COMP) par souci d'économie de traduction
décimal > ecbdic > binaire > traitement > ecbdic .
Si le résultat du programme exige l'affichage de l'indice prévoir une variable d'affichage.
Exemples.
77 I PIC 99 COMP.
77 LI PIC 99 COMP.
77 COL PIC 99 COMP.
INITIALISATION D'UNE TABLE
A la compilation
01 TAB.
02 ELT OCCURS 7 PIC X(8).
On ne peut pas utiliser VALUE "
"
Æ On utilise REDEFINES
1
2
3
4
5
6
7
LUNDIЂЂЂ MARDIЂЂЂ MERCERDI JEUDIЂЂЂ VENDREDI SAMEDIЂЂ DIMANCHE
01 TAB.
02 ELT OCCURS 7 PIC X(8).
01 TAB REDEFINE ZONE.
02 ZONE PIC X(56) VALUE "LUNDIЂЂЂMARDIЂЂЂMERCREDIJEUDIЂЂЂVENDR
EDISAMEDIЂЂDIMANCHE".
Où 56 = 8X7
L’essentiel sur le Cobol
page 20
Feyaerts Prod
Pendant le traitement
Exemple le chargement d'un tableau.
Utilisation de VARYING : répétition et incrémentation.
Utilisation de READ INTO : READ + MOVE
Conséquence il faut soustraire 2 de I pour obtenir BS.
IDENTIFICATION DIVISION.
PROGRAM-ID CHARGEMENT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE CONTROL.
SELECT FICHIER ASSIGN TO DDIN.
DATA DIVISION.
FILE SECTION.
FD FICHIER RECORDING MODE F.
01 ENR.
02 VAR … .
. . .
WORKING STORAGE SECTION.
01 TAB.
02 ELT OCCURS 100.
03 VARX … .
. . .
77 EOF PIC 9 COMP VALUE 0.
77 I PIC 999 VALUE 1.
77 BS PIC 999 COMP.
77 BSAFF PIC999.
PROCEDURE DIVISION.
PROG.
PERFORM DEBUT
PERFORM CHARG UNTIL EOF=1
OR I>100.
IDENTIFICATION DIVISION.
PROGRAM-ID CHARGEMENT.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE CONTROL.
SELECT FICHIER ASSIGN TO DDIN.
DATA DIVISION.
FILE SECTION.
FD FICHIER RECORDING MODE F.
01 ENR.
02 VAR … .
. . .
WORKING STORAGE SECTION.
01 TAB.
02 ELT OCCURS 100.
03 VARX … .
. . .
77 EOF PIC 9 COMP VALUE 0.
77 I PIC 999 . . ..
77 BS PIC 999 COMP.
77 BSAFF PIC999.
PROCEDURE DIVISION.
PROG.
PERFORM DEBUT
PERFORM CHARG VARIYNG I 1 BY 1
UNTIL EOF=1
OR I>100.
PERFORM FIN.
STOP RUN.
DEBUT.
OPEN INPUT FICHIER.
PERFORM FIN.
STOP RUN.
DEBUT.
OPEN INPUT FICHIER.
READ FICHIER AT END MOVE 1 TO EOF.
CHARG.
CHARG.
MOVE ENR TO ELT.
MOVE ENR TO ELT.
ADD 1 TO I.
READ FICHIER AT END MOVE 1 TO EOF
READ FICHIER INTO ELT(I)
.
AT END MOVE 1 TO EOF.
FIN.
FIN.
SUBTRACT 1 FROM I GIVING BS BSAFF.
SUBTRACT 2 FROM I GIVING BS BSAFF.
DISPLAY BSAFF.
DISPLAY BSAFF.
CLOSE FICHIER.
CLOSE FICHIER.
L’essentiel sur le Cobol
page 21
Feyaerts Prod
LES TABLES INDEXÉES
Définitions :
Indice = numéro d'ordre.
Index = déplacement d'adresse.
INDEX = (I –1) * LONGUEUR D'ÉLÉMENT.
1 2 3 4 5 6 7 8
Adresse
L'index est donc le déplacement d'adresse en nombre d'octet par rapport à la 1ère entrée
dans la table.
Par convention et pour ne pas confondre avec les indices on fait suivre leur nom par un X
Sous Mainframe IX prends 4 octets sous PC 2octets.
Déclaration d'index
L'index se réfère au 1er octet de la table il est donc indissociable de celle-ci et ne
concerne que celle-ci. Par conséquent il se déclare avec elle et fait partie intégrante de
cette déclaration.
01 TAB.
02 ELT OCCURS 4 INDEXED IX [MX] PIC X(2).
On peut avoir besoin de plusieurs index, il faut les déclarer à ce moment cad das la
WORKING STORAGE division.
A
1 0
2 0
3 0
01 TAB.
02 NIV1 OCCURS 4 INDEXED IX1.
04 NIV2 OCCURS 5 INDEXED IX2 PIC(X)2.
Calcul de l'index de A selon la formule I-1X LONGUEUR.
A NIV2(3,2) (3 -1) x 10 = 20 où 10 =5X2
Lgeur ELT ss-zone x nombre de ss-zone
(2 -1) x 2 = 2
20 +2= 22
Déclaration d'un index indépendant.(Qui n'est pas associé à une table)
77 NOMINDEX.
Sauvegarde d'un index
Liste des comparaison entre index
Index dune table Å Æ index d'une autre table
Compare les n° d'ordre cad les indices.
Index d'une table Å Æ nombre.
Compare une indice avec un nombre
Index d'une table Å Æ Identificateur d'usage index (en binaire)
Compare adresse à une adresse
Identificateur d'usage index Å Æ Identificateur d'usage index
Manipulation d'index
ADD SUBTRACT interdits
L’essentiel sur le Cobol
page 22
Feyaerts Prod
Æ utilisation de SET
L'INSTRUCTION SET
SET K(indent d'usage index/Var index TO valeur.
Attention !!! la variable réceptrice est le premier membre de l'instruction.
Ne jamais mettre I à 0 sinon pointe en dehors de la table.
Addition / incrémentation d'index.
SET VARINDEX UP BY 1 pas d'incrémentation..
SET IX DOWN BY 1 pas de décrémentation.
LA RECHERCHE SÉQUENTIELLE EN COBOL.
3 Conditions.
•
Uniquement sur les tables indexées. INDEXED dans le WORKING STORAGE
•
Toujours initialiser l'index avant l'instruction. SET IX TO 1.
•
L'identificateur du SEARCH est toujours la zone associées à la clause OCCURS.
Syntaxe :
SEARCH IDENT [VARYING INDEX/IDENT]
[AT END INSTUCTION IMPERATIVE]
WHEN COND1 INSTRUCTION2 IMPERATIVE
[WHEN COND2 INSTRUCTION3 IMPERATIVE]
END SEARCH.
RmQ il faut utiliser la clause VARYING si l'on veut utiliser le 2ème index déclaré dans la
WORKING STORAGE DIVISION.
Exemple
WORKING STORAGE DIVISION.
01 TAB.
02 ELT OCCURS 200 INDEXED IX JX PIC X(4)..
. . .
PROCEDURE DIVISION.
. . .
TRT.
SET IX TO 1.
SET JX TO 1.
SEARCH ALL ELT VARYING JX.
AT END DISPLAY "PAS TROUVE"
WHEN TVAR = VALEUR PERFORM TROUVE
END SEARCH.
LA RECHERCHE DICHOTOMIQUE EN COBOL.
3 Conditions.
•
Uniquement sur les tables indexées et triées. DEPENDING ON borne sup. et
INDEXED et ASCENDING/DESCENDING KEY dans le WORKING STORAGE
•
Toujours déclare puis initialiser l'index avant l'instruction. SET IX TO 1.
•
L'identificateur du SEARCH est toujours la zone associées à la clause OCCURS.
L’essentiel sur le Cobol
page 23
Feyaerts Prod
77 BSX PIC S9(4) COMP.
01 TAB.
02 ELT OCCURS 100 DEPENDING ON BSX
BSX à déclarer
INDEXED IX
IX équivaut à une déclaration
ASCENDING/DESCENDING KEY TVAR1
04 TVAR1 PIC X(20).
04 TVAR3 PIC 9 (2).
PROCEDURE DIVISION.
PROG.
PERFORM DEBUT.
PERFORM CHARG VARYING IX FROM 1 TO 1 UNTIL IX > 100 OR
PERFORM INTER.
PERFORM TRT UNTIL EOF = 1.
PERFORM FIN.
STOP RUN.
DEBUT.
OPEN INPUT FICHIER FICH2.
CHARG.
READ FICHIER INTO ELT(IX) AT END MOVE 1 TO EOF.
INTER.
SET IX DOWN BY 2.
SET BSX TO IX.
MOVE 0 TO EOF.
READ FICH2 AT END MOVE 1 TO EOF.
TRT.
SET IX TO 1.
SEARCH ALL ELT
AT END (INSTRUCTION SI PAS TROUVÉ)
WHEN ELT(IX) = ENR (INSTRUCTION SI TROUVÉ)
END SEARCH.
READ FICH2 AT END MOVE 1 TO EOF.
FIN.
CLOSE FICHIER FICH2.
L’essentiel sur le Cobol
page 24
EOF = 1.

 Rech
 Dicho

Feyaerts Prod
8. ET POUR TERMINER…
L'INSTRUCTION COMPUTE.
Sert à combiner des opérations arithmétiques. Cette instruction permet d'introduire des
formules.
COMPUTE K/Var = Expression arithmétique.
Exemple
COMPUTE RESULT = ((A + B) * 2) /252
Attention à l'ordre de priorité des opérateurs.
()
**
*
+
/
-
ET DE G--> D
donc
RES =(((A**2 + 5)**2 + (B / (5*Y)- Z))
se fait comme suit:
A**2
+5
Le tout **2 +
5*Y
B/ le res du précédent
-Z
équivaut aux instructions suivantes.
MULTIPLY A BY A.
ADD 5 TO A
MULTIPLY 5 BY Y.
MULTIPLY A BY A.
DIVIDE Y INTO B.
SUBTRACT Z FROM B.
ADD A TO B.
MULTIPLY W BY B GIVING RES.
Les opérations arithmétiques peuvent être combinées dans un test alors l'ordre de priorité
des opérateurs logiques est :
Opérateur arithmétique
()
**
*
/
Opérateur relationnel
>
<
Opérateur logique
()
+
-
ET DE G--> D
∨
=
NOT
∨
AND
OR
Le AND est prioritaire au OR car si le 1er terme d'un test est faux le résultat l'est aussi plus
besoin de tester le 2ème.
Le compilateur reconnaît les () logiques des () arithmétiques car les premières jouxtent
au moins un opérateur logique.
L’essentiel sur le Cobol
page 25
Feyaerts Prod
L'INSTRUCTION EVALUATE
Les tests multiples
EVALUATE IDENT1 ALSO IDENT2 ALSO IDENT3
WHEN CONDITION1
ALSO CONDITION2
ALSO
WHEN CONDITION1
ALSO ANY
ALSO
WHEN ANY
ALSO ANY
ALSO
WHEN CONDITION1
ALSO CONDITION2
ALSO
WHEN OTHER INSTRUCTION IMPERATIVE
END EVALUATE
ANY INSTRUCTION IMPERATIVE
CONDITION3 INSTRUCTION IMPERATIVE
CONDITION INSTRUCTION IMPERATIVE
ANY INSTRUCTION IMPERATIVE
Exemple
EVALUATE SEX ALSO AGE
WHEN = "F" ALSO 20 THRU 25 DISPLAY "JEUNE FEMME"
WHEN = "M" ALSO > 50 DISPLAAY "HOMME"
WHEN ANY ALSO < 15 DISPLAY "ENFANT"
WHEN OTHER DISPAY "AUTRE"
END EVALUATE.
Les conditions sont évaluées selon les opérateurs relationnels <> = NOT
ALSO est optionnel et ne sert que pour les test composé
ANY signifie toute valeur possible
THRU permet d'introduire un intervalle de valeur.
LA CLAUSE ROUNDED
permet d'arrondir le résultat d'un calcul.
77 TOT PIC 9(2)V99.
ADD A B C GIVING TOT ROUNDED.
DISPLAY TOT.
Si TOT vaut 16,4444 TOT s'affiche 16,44
Si TOT vaut 16,6666 TOT s'affiche 16,67
Si TOT vaut 16,5555 TOT s'affiche 16,56
LA CLAUSE SIZE ERROR
permet de ne pas travailler avec des résultats tronqués.
DIVIDE A INTO B GIVING Q.
SIZE ERROR DISPLAY "OPERATION IMPOSSIBLE".
L’essentiel sur le Cobol
page 26
Feyaerts Prod
9. LA FUSION DE FICHIERS
Conditions :
2 fichiers triés avec la même clé de tri = Fichiers d'entrée.
1 fichier implicitement trié = Fichier de fusion = F de sortie
Le programme lit les 2 fichiers en même temps selon les clés. Il écrit 1 enregistrement à
la fois et un fichier d'erreur.
Méthode
1) 1 lire les 2 fichiers en entrée. 1er enr de Fich1 et 1er enr de fich2.
2) Compare les clés.
a) Si clé 1< clé 2 recopier 1er enr de Fich1 dans Fichier de sortie.
lire enr suivant dans Fich1.
b) Si clé 1> clé 2 recopier 1er enr de Fich2 dans Fichier de sortie.
Lire enr suivant dans Fich2
c) Si clé 1 = clé 2 fusionner les enregistrement en une seul dans le fichier de sortie.
3) Si fin de fichier rencontrée mettre la clé = à High Value
Exemple
Une chaîne de magasin doit faire son inventaire annuel Elle doit fusionner les inventaires
de ses 2 succursales.
Fichiers entrée :
Mag1 = code-article, libel article, quantité.
Mag2 = code-article, libel article, quantité.
Fichiers Sortie
Cent = code-article, libel article, quantité
Erreur =
PROGRAMME:
IDENTIFICATION DIVISION.
PROGRAM-ID FUSION.
ENVIRONMENT DIVISION.
INPUT-OUPUT SECTION.
FILE-CONTROL.
SELECT MAG1 ASSIGN TO DDIN1.
SELECT MAG2 ASSIGN TO DDIN2.
SELECT CENTR ASSIGN TO DDOUT1.
SELECT ERREUR ASSIGN TO DDOUT2.
DATA DIVISION.
FD MAG1 RECORDING MODE F.
01 ENRMAG1.
02 COD1 PIC X(10).
02 LIB1 PIC X(50).
02 QUANT1 PIC 9 (6).
FD MAG2 RECORDING MODE F.
01 ENRMAG2.
02 COD2 PIC X(10).
02 LIB2 PIC X(50).
02 QUANT2 PIC 9 (6).
FD CENTR RECORDING MODE F.
01 ENRCENT.
02 CODC PIC X(10).
02 LIBC PIC X(50).
02 QUANTC PIC 9 (6).
L’essentiel sur le Cobol
page 27
Feyaerts Prod
FD ERRREUR RECORDING MODE F.
01 ENRERR.
02 CODER PIC X(10).
02 LIBER PIC X(50).
PROCEDURE DIVISION.
PERFORM DEBUT.
PERFORM TRT-FUSION UNTIL COD1 = HIGH-VALUE
AND COD2 = HIGH-VALUE.
PERFORM FIN.
STOP RUN.
DEBUT.
OPEN INPUT MAG1 MAG2.
OPEN OUTPUT CENTR ERREUR.
PERFORM LECTURE1
PERFORM LECTURE2
TRT-FUSION.
PERFORM DEB-TRT.
IF COD1<COD2 THEN PERFORM COD1-COD2
ELSE IF COD1>COD2 THEN PERFORM COD2-COD1
ELSE PERFORM COD1=COD2
END-IF.
PERFORM FIN-TRT
FIN.
CLOSE MAG1 MAG2 CENTR ERREUR.
LECT1.
READ MAG1 AT END MOVE HIGH-VALUE TO COD1.
LECT2.
READ MAG2 AT END MOVE HIGH-VALUE TO COD2.
DEB-TRT.
EXIT.
COD1-COD2.
WRITE ENRC FROM ENRMAG1
PERFORM LECT1.
COD2-COD1.
WRITE ENRC FROM ENRMAG2
PERFORM LECT2.
COD1=COD2.
PERFORM DEB-FUS.
IF LIB1=LIB2 THEN PERFORM MAJ
ELSE PERFORM LIB1NOTLIB2
END-IF.
PERFORM FINFUS.
FIN-TRT
EXIT.
DEB-FUS.
EXIT.
MAJ.
ADD QT1 TO QT2 GIVING QTC
MOVE COD1 TO CODC
WRITE ENRCENT.
LIB1NOTLIB2.
WRITE ENRERR FROM ENRMAG1.
MOVE LIB2 TO LIBER.
WRITE ENRERR.
FINFUS.
PERFORM LECT1.
L’essentiel sur le Cobol
page 28
Feyaerts Prod
PERFORM LECT2.
Exercice
Fichiers input
a) fichier disque « soldes »
numéro-compte = CLE1
solde = SOLDEA
12 caractères
9 chiffres
numéro de compte en banque solde du compte bancaire
•
•
•
b)
trié sur numéro-compte.
un enregistrement par compte bancaire.
fichier disque « transactions »
NUMÉRO-COMPTE = CLE2
type- transaction
montant = MONTANT
12 caractères
1 caractère
9 chiffres
numéro de compte en banque R = retrait, D = dépot montant de la transaction
•
•
trié sur numéro-compte.
plusieurs enregistrements par compte.
Fichiers Output
a) nouveau fichier disque « soldes »
numéro-compte
solde = SOLDEN
12 caractères
9 chiffres
numéro de compte en banque solde du compte bancaire
•
•
trié sur numéro-compte.
un enregistrement par compte bancaire.
b) b) fichier disque « clients »
numéro-compte = CLECLI
12 caractères
numéro de compte en banque
•
•
trié sur numéro-compte.
un enregistrement par nouveau compte bancaire.
Traitement
Ancien client sans transaction : nouveau solde = ancien solde
Avec transaction :
Ancien client :nouveau solde = ancien solde + dépots - retraits
Nouveau client : créer nouveau solde ( dépots - retraits )
créer liste clients
L’essentiel sur le Cobol
page 29
Feyaerts Prod
L’essentiel sur le Cobol
page 30
Feyaerts Prod
IDENTIFICATION DIVISION.
PROGRAM-ID. BANQUE.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT SOLDE_ANC ASSIGN TO DDIN1.
SELECT TRANSACTIONS ASSIGN TO DDIN2.
SELECT SOLDE_NEW ASSIGN TO DDOUT1.
SELECT CLIENTS ASSIGN TO DDOUT2.
DATA DIVISION.
FILE SECTION.
FD SOLDE_ANC RECORDING MODE F.
01 ENR_SOLDEA.
02 CLE1
PIC X(12).
02 SOLDEA
PIC S9(9).
FD TRANSACTIONS RECORDING MODE F.
01 ENR_TRANS.
02 CLE2
PIC X(12).
02 TYPTRANS PIC X.
02 MONTANT PIC 9(9).
FD SOLDE_NEW RECORDING MODE F.
01 ENR_SOLDEN.
02 CLE1
PIC X(12).
02 SOLDEN
PIC S9(9).
FD CLIENTS RECORDING MODE F.
01 ENR_CLI.
02 CLECLI
PIC X(12).
WORKING STORAGE SECTION.
PROCEDURE DIVISION.
PROG.
PERFORM DEBUT.
PERFORM TRT_FUSION UNTIL CLE1 = HIGH VALUE AND
CLE2 = HIGH VALUE.
PERFORM FIN.
STOP RUN.
DEBUT.
OPEN SOLDE_ANC TRANSACTION INPUT.
OPEN SOLDE_NEW CLIENTS OUTPUT.
PERFORM LECT1.
PERFORM LECT2.
TRT_FUSION.
PERFORM DEB_TRT_FUS.
IF CLE1 < CLE2 PERFORM CLE1_ANC_SS_MOUV
ELSE PERFORM CLE2_AVEC_MOUV
END-IF.
PERFORM FIN_TRT_FUS.
FIN.
CLOSE SOLDE_ANC SOLDE_NEW TRANSACTIONS CLIENTS.
LECT1.
READ SOLDE_ANC AT END MOVE HIGH VALUE TO CLE1.
LECT2.
READ TRANSACTIONS AT END MOVE HIGH VALUE TO CLE2.
DEB_TRT_FUS.
EXIT.
CLE1_ CLE1_ANC_SS_MOUV.
WRITE ENR_SOLDEN FROM ENR_SOLDEA.
PERFORM LECT1.
L’essentiel sur le Cobol
page 31
Feyaerts Prod
CLE2_AVEC_MOUV.
PERFORM DEBUT_AVEC_MOUV.
IF CLE1 = CLE2 PERFORM ANCIEN_CLIENT
ELSE PERFORM NOUVEAU_CLIENT
END-IF.
PERFORM INTER.
PERFORM TRANSACTION UNTIL CLEN NOT = CLE2.
PERFORM FIN_AVEC_MOUV.
FIN_TRT_FUS.
EXIT.
DEBUT_AVEC_MOUV.
MOVE CLE2 TO CLEN.
ANCIEN_CIENT.
MOVE SOLDEA TO SOLDEN.
PERFORM LECT_1.
NOUVEAU_CLIENT.
MOVE 0 TO SOLDEN.
MOVE CLE2 TO CLECLI.
WRITE ENR_CLI.
INTER.
EXIT.
TRANSACTION.
PERFORM DEB_TRANS.
IF TYPTRANS= "D" PERFORM DEPOT
ELSE PERFOM RETRAIT
END-IF.
PERFOM FIN_TRANS.
FIN AVEC MOUV.
WRITE ENR_SOLDEN.
DEB_TRANS.
EXIT.
DEPOT.
MOVE MONTANT TO SODEN.
RETRAIT.
SUBTRACT MONTANT FROM SOLDEN.
FIN_TRANS.
PERFORM LECT2.
Et c'est tout !!!
L’essentiel sur le Cobol
page 32
Feyaerts Prod
L’essentiel sur le Cobol
page 33
Feyaerts Prod