Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Toute référence à nom-donnée-2 en procédure division exige la présence de la clause SUM dans sa
description.
exemple
{ REPORT HEADING
RH }
{ PAGE HEADING
PH }
{ CONTROL HEADING
CH } { nom-donnée-1
FINAL }
TYPE { DE
DETAIL }
{ CONTROL FOOTING
CF } { nom-donnée-1
FINAL }
{ PAGE FOOTING
PF }
{ REPORT FOOTING
RF }
Règles
Un groupe d’édition est un ensemble d’informations composé d’une ou plusieurs lignes qui se
différencient des autres par la cause de leur impression ; celle-ci pouvant être indépendante de
l’utilisateur ( => automatique : rupture de contrôle, saut de page,..) ou au contraire être
provoquée par l’utilisateur (à l’aide d’instructions spéciales).
Les sigles RH,PH,DE,CF,PF,RF sont les abréviations autorisées des mots réservés cités dans la
même accolade.
L’ordre provoquant l’impression des groupes est fonction de leur type et de certaines
instructions utilisées à cet effet dans la procédure division.
L’option REPORT HEADING (ou RH) indique un groupe d’édition de type « début d’état » qui n’est
imprimé qu’une fois , au moment de l’instruction INITIATE.
Un seul groupe de ce type peut être défini pour un état donné (mais on peut ne pas en définir).
L’option PAGE HEADING (ou PH) indique un groupe d’édition de type « début de page » qui est
imprimé au début de chaque page.
Un seul groupe de ce type peut être défini pour un état donné (mais ce n’est pas obligatoire).
L’option CONTROL HEADING (ou CH) indique un groupe d’édition de type « début de contrôle » qui
●est imprimé à chaque fois qu’il y a une rupture de contrôle pour le niveau (ou pour la zone)
spécifié (c’est-à-dire quand nom-donnée-1 change de valeur ou qu’on arrive en fin de programme et
qu’on a indiqué FINAL).
remarques importantes :
il y a aussi rupture de contrôle quand on change de niveau supérieur.
exemple :
dans notre cas étudié précédemment (page 5) , si en lisant le fichier en entrée , on
obtient une nouvelle usine et que le service ne change pas => on a changé de niveau => il
y a rupture de contrôle => les groupes de contrôles seront édités dans cet ordre :
Un seul groupe de ce type peut être défini pour un niveau de contrôle donné dans la clause
CONTROL de la description de l’état concerné (cette clause est alors obligatoire ); inversement ,
il n’est pas obligatoire de définir un groupe de ce type pour tout niveau de contrôle défini par
la clause CONTROL.
L’option DETAIL (ou DE) indique un groupe d’édition de type « détail » qui est imprimé à chaque
exécution du verbe GENERATE se référant à ce groupe (par l’intermédiare du nom-donnée décrit en
en niveau 1).
L’option PAGE FOOTING (ou PF) indique un groupe d’édition de type « fin de page » qui est imprimé
à la fin de chaque page.
Un seul groupe de ce type peut être défini pour un état donné (mais ce n’est pas obligatoire).
L’option REPORT FOOTING (ou RF) indique un groupe d’édition de type « fin d’état » qui est
imprimé à la fin de l’état , au moment de l’instruction TERMINATE .
Un seul groupe de ce type peut être défini pour un état donné (mais ce n’est pas obligatoire).
Quand tous les groupes sont mentionnés , le générateur les imprime dans l’ordre suivant :
CONTROL FOOTING
PAGE FOOTING
REPORT FOOTING (une seule fois)
Les groupes d’édition de contrôle début (HEADING) doivent être présentés dans l’ordre
hiérarchique suivant (cf le principe étudié sur un exemple pages 7 et 8 ) :
CONTROL HEADING
. .
majeur
. ⇒ début usine
. . .
. . .
Les groupes d’édition de contrôle fin (FOOTING) doivent être présentés dans l’ordre hiérarchique
suivant (cf le principe étudié sur un exemple pages 7 et 8 ) :
.
.
.
.
. ⇒ fin usine
autre exemple :
Si , sur un état , on a à éditer des bilans (totaux ) journaliers puis mensuels puis
pour l’ensemble des dates traitées , on aura les clauses suivantes dans le programme
cobol :
Une rupture de contrôle au niveau des jours provoquera l’impression des groupes :
Une rupture de contrôle au niveau des jours provoquera l’impression des groupes :
}
entier-1
NEXT GROUP { PLUS entier-2
NEXT PAGE
Règles
Entier-1 et entier-2 sont strictement positifs et en outre , entier-1 doit être compatible avec
la clause PAGE LIMIT.
La clause NEXT GROUP ne peut apparaître qu’au niveau 1 et ne sera effective que lorsque le
groupe dans lequel elle est spécifiée sera totalement édité.
Entier-1 indique le numéro absolu de la ligne sur laquelle le prochain groupe pourra commencer
son édition.
PLUS indique un numéro relatif de la ligne par rapport au contenu du compteur LINE-COUNTER ,
lequel est incrémenté de entier-2.
NEXT PAGE indique un saut automatique à la page suivante (avec impression des groupes PAGE
FOOTING et PAGE HEADING s’ils existent).
Cette option , dans un groupe de type « début d’état » spécifie que ce groupe peut s’étendre sur
toute la page logique.
Cette clause n’a pas lieu d’être choisie dans un groupe de type « haut-de-page » ou « bas-de-
page » ni dans un groupe « fin-d’état ».
3 LINE { entier-1
PLUS entier-2 } ●
Format n° 2
Règles
entier-1 et entier-2 sont strictement positifs ; en outre entier-1 doit être compris dans la zone
de valeurs spécifiée par la clause PAGE LIMIT.
La clause LINE est obligatoire dans un groupe d’édition ; la ligne d’édition d’une donnée est
définie par la clause LINE appartenant à sa description au niveau 3.
Dans un groupe , toute indication absolue doit se faire dans l’ordre strictement croissant des
numéros de ligne et une indication relative (PLUS) ne peut être suivie par une absolue.
format n° 1
Entier-1 donne le n° absolu de la ligne sur laquelle l’impression à venir sera effectuée (elle
provoque l’initialisation du compteur LINE-COUNTER à cette valeur).
PLUS donne le n° relatif de la ligne par rapport au contenu de LINE-COUNTER (lequel est
incrémenté de entier-2.)
Le n° absolu résultant peut être fonction du type de groupe en cours de définition :
par exemple avec l’option HEADING 22 dans la clause PAGE LIMIT et la clause LINE PLUS 2
dans une description de type CONTROL HEADING , le n° absolu de la ligne sera 24 (si cette
clause line est la première du groupe).
format n° 2
Le format n° 2 indique un saut automatique à la page suivante (avec impression des groupes
PAGE FOOTING et PAGE HEADING ...s’ils existent).
Cette option ne peut être choisie que pour la première apparition de la clause LINE dans un
groupe et le N° absolu de la première ligne est alors indiqué par entier-1.
3 GROUP INDICATE
Règles
Cette clause sert à indiquer qu’une donnée ne doit être imprimée que lors de la première
apparition de son groupe d’édition après une rupture de contrôle ou un changement de page.
Si les clauses PAGE et CONTROL sont absentes , cette donnée ne sera éditée qu’une fois dans
l’état (à la première présentation du groupe dans l’état).
Cette clause ne peut apparaître que pour une donnée élémentaire en niveau 5.
3 COLUMN entier
Règles
Les clauses COLUMN d’une même ligne doivent être citées dans l’ordre croissant des positions.
Cette clause COLUMN ne peut apparaître qu’au niveau élémentaire (nbre niveau 5).
SOURCE nom-donnée
Règles
Cette clause sert à indiquer la valeur que prendra une donnée lors de son impression en citant la
zone qui l’initialisera.
La donnée comportant cette clause prendra une valeur conforme au transfert implicite qui
s’effectuera avant l’édition entre la zone nom-donnée et la donnée à éditer , d’après les règles
du verbe MOVE.
[ UPON nom-donnée-3 ]
RESET ON [ { nom-donnée-4
FINAL }]
Règles
Cette clause sert à définir une donnée accumulateur dans laquelle seront cumulées automatiquement
les données citées.
Cette clause ne peut apparaître que dans un groupe de type CONTROL FOOTING.
Cette clause déninit une donnée accumulateur à laquelle l’utilisateur peut se référer dans la
procédure division et éventuellemnt dans la report section (CF clause SOURCE).
Les données citées à la suite de SUM sont additionnées à la donnée-accumulateur (de classe
numérique : les caractéristiques d’édition n’étant prises en compte que lors de l’impression).
Nom-donnée-1,2,.. doivent être cités dans une clause SOURCE de groupe de type « détail » ou
encore dans la report section comme donnée-accumulateur d’un groupe d’édition.
Si l’opérande est lui-même une donnée-accumulateur définie dans un groupe CONTROL FOOTING à
un niveau inférieur : il est additionné avant chaque impression du groupe d’édition.
Si l’opérande est une donnée-accumulateur définie dans ce même groupe d’édition, il est
additionné avant chaque impression de celui-ci.
Si l’opérande n’est pas une donnée-accumulateur , il est additionné avant chaque demande
d’impression de tout groupe DETAIL comportant cet opérande dans une clause SOURCE.
L’option UPON permet de spécifier d’autres règles d’incrémentation : nom-donnée-3 est le nom d’un
groupe de type DETAIL; dans ce cas , les opérandes ne doivent pas être des données-accumulateurs.
L’addition a lieu à chaque demande d’impression du groupe DETAIL spécifié , tout opérande étant
obligatoirement cité dans une clause SOURCE de ce groupe DETAIL.
VALUE IS littéral
Règles
pour les règles d’utilisation : CF la clause VALUE (initialisation) étudiée dans le chapître sur
la DATA DIVISION (et plus précisément en working-storage setcion).
PICTURE IS chaîne-de-caractères
Règles
pour les règles d’utilisation : CF la clause PICTURE étudiée dans le chapître sur la DATA
DIVISION.
Règles
cette clause sert à remplir une donnée avec des espaces quand la valeur qu’on y transfère est
nulle.
pour les règles d’utilisation : CF la clause BLANK étudiée dans le chapître sur la DATA DIVISION.
JUSTIFIED RIGHT
Règles
cette clause sert à spécifier le cadrage des informations transférées dans la zone décrite.
pour les règles d’utilisation : CF la clause JUSTIFIED étudiée dans le chapître sur la DATA
DIVISION.
Règles
Fonction:
Permet d’initialiser les compteurs, les contrôles et amorcer le traitement d’un état.
Chaque nom d‘état doit être défini en REPORT SECTION ; l’instruction INITIATE s’applique à chaque
état spécifié.
INITIATE réalise les fonctions suivantes :
Emploi :
Cette instruction est obligatoire avant de commencer toute édition; elle peut être répétée
pour un état donné à condition que le traitement de celui-ci se soit terminé par l’instruction
TERMINATE et par la fermeture des fichiers.
format n° 1
format n° 2
GENERATE nom-donnée
Règles
Format n° 1 :
L’instruction GENERATE assure toutes les opérations automatiques nécéssaires , met à jour les
groupes d’édition de type FOOTING , mais ne produit aucun groupe d’édition de type DETAIL.
Avec ce format , il s’agit de l’édition abrégée pour l’état concerné : les accumulateurs sont
mis à jour à chaque exécution de l’instruction même si elle ne provoque aucune impression.
Format n° 2 :
GENERATE reconnaît les ruptures de contrôle et produit les groupes d’édition CONTROL
HEADING et CONTROL FOOTING appropriés.
GENERATE assure les cumuls nécéssaires (définis par SUM) , réinitialise les accumulateurs
lors d’une rupture de contrôle , met à jour les accumulateurs d’un niveau de contrôle à
l’autre (du niveau mineur vers le niveau de rupture de contrôle).
GENERATE fait progresser et teste les compteurs LINE-COUNTER et PAGE-counter pour provoquer
éventuellement l’édition des groupes « haut-de-page » et « bas-de-page ».
la première instruction GENERATE produit l’impression des groupes d’édition (s’ils sont
spécifiés) dans l’ordre suivant :
lors d’une rupture de contrôle , l’exécution de GENERATE provoque l’impression des groupes
d’édition de contrôle dans l’ordre suivant :
Règles
TERMINATE termine le traitement des états spécifiés (qui doivent être décrits en REPORT SECTION).
TERMINATE provoque l’impression des groupes d’édition de contrôle (CONTROL FOOTING) du niveau le
plus bas (mineur) vers le niveau le plus haut (majeur ou FINAL s’il existe).
Emploi :
L’instruction TERMINATE , pour un état donné doit avoir été précédée d’une instruction INITIATE
et peut être répétée à condition d’être séparée du TERMINATE par une instruction INITIATE (ainsi
que par les ordre de fermeture et ouverture des fichiers).
Règles
Spécifie le traitement à exécuter avant impression d’un groupe d’édition (CF le cours sur
l’emploi des déclaratives).
Le traitement est constitué par la section suivant la déclaration et est exécuté par le
générateur d’états immédiatemment avant la création du groupe d’édition spécifié dans la phrase
USE (c’est-à-dire après tous les calculs de sommes mais avant le transfert des données dans
l’image de la ligne d’édition).
PROCEDURE DIVISION.
declaratives.
premiere-page section.
use before reporting debut-etat.
faire-moins-un.
subtract 1 from page-counter.
end declaratives.
suite section.
debut.
open input fentree output finf ftrs fgnd fimpri
* subtract 1 from page-counter => nok => declaratives
accept wdate from date
Nom-donnée représente un groupe d’édition de type autre que DETAIL ; il ne doit pas être nommé
dans plus d’une déclaration USE.
Emploi :
Dans le traitement qui suit la déclaration , il est permis d’utiliser l’instruction qui supprime
l’édition du groupe spécifié : « SUPPRESS PRINTING ».
(il existe également un registre nommé PRINT-SWITCH , mis à zéro par INITIATE qui permet de
supprimer l’édition du groupe spécifié : pour ce faire , il suffit de le mettre à 1).
A27 exemple simple commenté : écriture du programme du cas « Halhamantte » (cf parag
A24)
IDENTIFICATION DIVISION.
PROGRAM-ID. halhama.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
select fimpri assign to "c:\laf\cobol\report-w\listemp.txt".
select fentree assign to "c:\laf\cobol\docu\jeu1.txt".
DATA DIVISION.
FILE SECTION.
fd fentree.
1 enreg.
3 e-usine pic xx.
3 e-service pic x(3).
3 pic x(7).
3 e-nom pic x(20).
3 e-prenom pic x(20).
3 pic x(19).
3 e-note pic 99v99.
3 pic x(5).
fd fimpri report is dans-quel-etat-j-erre.
1 sligne pic x(80).
WORKING-STORAGE SECTION.
77 wctf pic 9 value 0.
88 fin-fichier value 1.
77 wusi pic xx.
77 wserv pic xxx.
report section.
rd dans-quel-etat-j-erre
controls are final e-usine e-service
page limit is 66 lines
heading 1
first detail 9
last detail 50
footing 64.
3 line plus 1.
5 column 5 pic x(14) value all x"c4".
3 line plus 1.
5 column 1 pic x value " ".
PROCEDURE DIVISION.
debut.
open input fentree output fimpri
initiate dans-quel-etat-j-erre
subtract 1 from page-counter
read fentree
at end
set fin-fichier to true
end-read
perform until fin-fichier
move e-usine to wusi
perform until e-usine not = wusi or fin-fichier
move e-service to wserv
perform until e-service not = wserv or e-usine not = wusi or fin-fichier
generate ma-ligne-detail
read fentree
at end
set fin-fichier to true
end-read
end-perform
end-perform
end-perform
terminate dans-quel-etat-j-erre
close fentree fimpri
stop run.
dossier
Liste du Personnel
de la société
HALHAMANTTE
--------------------------------------------------------------------------------
page : 1 haut de page
--------------------------------------------------------------------------------
service ATE
-------------- résultat de la présence du groupe CONTROL HEADING e-service
--------------------------------------------------------------------------------
page : 2
--------------------------------------------------------------------------------
service DIR
--------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
liste des employés de la société Halhamantte
--------------------------------------------------------------------------------
page : 3
--------------------------------------------------------------------------------
service ETU
--------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
liste des employés de la société Halhamantte
--------------------------------------------------------------------------------
page : 4
--------------------------------------------------------------------------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
liste des employés de la société Halhamantte
--------------------------------------------------------------------------------
page : 5
--------------------------------------------------------------------------------
usine n° 02
-----------
service ATE
--------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
liste des employés de la société Halhamantte
--------------------------------------------------------------------------------
. page : 7
--------------------------------------------------------------------------------
.
. dernière page (de données) avant la fin d’état
.
service ETU
--------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
liste des employés de la société Halhamantte
fin de liste
1 => Général
PS / CBL85
2 => Colonel
3 => Lieutenant-Colonel
4 => Commandant
5 => etc..
c:\stat.txt
c:\trs.txt c:\inf.txt résultat du cross 97 Page 1
ARME abc
TRS INF
vitesse vitesse Marcel 1825
Lcl Dugenou
> 14kmh > 18kmh
Pinouflet Hector 1928
Danlepan Emile 2183
temps moyen 1978 , 66
. .
Fichiers des bons . .
pour l'arme "TRS" , il faut avoir . .
couru à une vitesse >= à 14 kmh
. .
pour l'arme "INF" , il faut avoir
Sgt Dupont Mahomed 1324
couru à une vitesse >= à 18 kmh
Ricochet Richard 1437
pour l'arme "GND" , il faut avoir Pabot léon 1650
couru à une vitesse >= à 12 kmh temps moyen 1470 , 33
début programme.
ouvrir les fichiers.
lecture du fichier en entrée (nom : FENTREE ; zone entrée : ZE)
récupérer la date système + MZM de l’année en ligne titre
faire tant que non FF(FENTREE)
total-arme(ZM), ca(ZM) 0 (ca = compteurs du nbre de personnes par arme)
compteur page(ZM) = compteur page(ZM) + 1
MZS du compteur de page(ZM) (ZS = zone de sortie du fichier imprimante)
écriture de la ligne titre avec saut de page (ZS-TRS = zone de sortie du fichier c:\trs.txt
MZS et MZM du code-arme(ZE) (ZS-INF = zone de sortie du fichier c:\inf.txt
écriture de la ligne « arme » (ZS-GND = zone de sortie du fichier c:\gnd.txt)
faire tant que même arme et non FF(FENTREE)
MZM ET MZS DU grade(ZE) (grade(ZE) => grade lu dans FENTREE)
total-temps(ZM), cg(ZM) 0 (cg = compteurs du nbre de personnes par grade et arme)
faire tant que même grade , même arme et non FF(FENTREE)
MZS (nom,prénom,temps)(ZE)
écriture de la ligne « détail » + MEI de la ZS
cg(ZM) = cg(ZM) + 1
total-temps(ZM) = total-temps(ZM) + temps(ZE)
au cas ou
l’arme(ZE) = "trs"
si le temps(ZE) <= temps limite trs(ZM)
alors
MZS-TRS (matricule,temps)(ZE) , distance(ZM)
écriture sur le fichier FTRS (c:\trs.txt)
fin si
l’arme(ZE) = "inf"
si le temps(ZE) <= temps limite inf(ZM)
alors
MZS-INF (matricule,temps)(ZE) , distance(ZM)
écriture sur le fichier FINF (c:\inf.txt)
fin si
l’arme(ZE) = "gnd"
si le temps(ZE) <= temps limite gnd(ZM)
alors
MZS-GND (matricule,temps)(ZE) , distance(ZM)
écriture sur le fichier FGND (c:\gnd.txt)
fin si
fin au cas ou
lecture du fichier FENTREE
fin faire
calcul temps moyen(ZM) = total temps(ZM) / cg(ZM)
MEI de la ZS + MZS de « temps moyen » et temps moyen(ZM)
écriture de la ligne temps moyen par grade
calcul total arme(ZM) = total arme(ZM) + total temps(ZM)
ca(ZM) = ca(ZM) + cg(ZM)
fin faire
calcul temps moyen(ZM) = total arme(ZM) / ca(ZM)
MZS « temps moyen » + arme(ZM) + temps moyen (ZM)
écriture de la ligne temps moyen par arme
fin faire
fermer les fichiers
arrêt du programme.
IDENTIFICATION DIVISION.
PROGRAM-ID. cross.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
select fimpri assign to "c:\stat.txt".
select ftrs assign to "c:\trs.txt".
select finf assign to "c:\inf.txt".
select fgnd assign to "c:\gnd.txt".
select fentree assign to "c:\resultat.txt".
DATA DIVISION.
FILE SECTION.
fd fentree.
1 enreg.
3 ematri pic x(6).
3 enom pic x(20).
3 eprenom pic x(20).
3 egrade pic xxx.
3 earme pic xxx.
3 pic x(7).
3 etemps pic 9(8).
fd finf.
1 sinf.
3 smatri pic x(6).
3 stemps pic 9(8).
3 sdist pic 9999.
fd ftrs.
1 strs pic x(18).
fd fgnd.
1 sgnd pic x(18).
WORKING-STORAGE SECTION.
77 wctf pic 9 value 0.
88 fin-fichier value 1.
1 wtitre.
3 pic x(10) value spaces.
3 pic x(18) value "resultat du cross".
3 wa pic x(40).
3 pic x(5) value "page".
3 wpage pic zz9.
PROCEDURE DIVISION.
debut.
open input fentree output finf ftrs fgnd fimpri
read fentree
at end
set fin-fichier to true
display "pb fentree vide"
end-read
perform until fin-fichier
accept wdate from date
move wdate(1:2) to wa
move 0 to wtotalarme wca
add 1 to wcpage
move wcpage to wpage
write sligne after page
move "arme : " to sligne
move earme to warme sligne(7:)
write sligne after 3
move spaces to sligne
write sligne after 4
perform until earme not = warme or fin-fichier
move egrade to wgrade wgra
move 0 to wtotaltemps wcg
perform until egrade not = wgrade or earme not = warme
or fin-fichier
move enom to wnom
move eprenom to wprenom
move etemps to wtemps
write sligne from wdetail
add 1 to wcg
compute wtotaltemps = wtotaltemps + etemps
evaluate earme
when "trs"
if etemps <= wdist * 3600 / wvit-trs
then
move ematri to smatri
move wdist to sdist
move etemps to stemps
write strs from sinf
end-if
when "inf"
if etemps <= wdist * 3600 / wvit-inf
then
move ematri to smatri
move wdist to sdist
move etemps to stemps
write sinf
end-if
when "gnd"
if etemps <= wdist * 3600 / wvit-gnd
then
move ematri to sgnd(1:6)
move wdist to sgnd(15:4)
move etemps to sgnd(7:8)
write sgnd
end-if
end-evaluate
read fentree
at end
set fin-fichier to true
end-read
end-perform
move spaces to wdetail
move "temps moyen" to wprenom
compute wtempsmoyen = wtotaltemps / wcg
add wtotaltemps to wtotalarme
add wcg to wca
write sligne from wdetail after 2
end-perform
move "temps moyen" to wprenom
move warme to wprenom(13:)
compute wtempsmoyen = wtotalarme / wca
write sligne from wdetail after 2
end-perform
close fentree fimpri finf ftrs fgnd
stop run.
IDENTIFICATION DIVISION.
PROGRAM-ID. cross.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
select fimpri assign to "c:\stat-rw.txt".
select ftrs assign to "c:\trs.txt".
select finf assign to "c:\inf.txt".
select fgnd assign to "c:\gnd.txt".
select fentree assign to "c:\resultat.txt".
DATA DIVISION.
FILE SECTION.
fd fentree.
1 enreg.
3 ematri pic x(6).
3 enom pic x(20).
3 eprenom pic x(20).
3 egrad pic xxx.
3 earme pic xxx.
3 pic x(38).
3 etemps pic 9(8).
fd finf.
1 sinf.
3 smatri pic x(6).
3 stemps pic 9(8).
3 sdist pic 9999.
fd ftrs.
1 strs pic x(18).
fd fgnd.
1 sgnd pic x(18).
fd fimpri report is dans-quel-etat-j-erre.
1 sligne pic x(80).
WORKING-STORAGE SECTION.
77 n pic 99 value 0.
77 wlin pic 99 value 0.
77 wpc1 pic 99 value 0.
77 wpc2 pic 99 value 0.
77 wpage-arme pic 99 value 0.
77 wctf pic 9 value 0.
88 fin-fichier value 1.
77 wdist pic 9999 value 8.
77 wvit-inf pic 99v99 value 18.
77 wvit-trs pic 99v99 value 14.
77 wvit-gnd pic 99v99 value 12.
77 wcpage pic 999 value 0.
77 wcp pic 999 value 0.
77 wca pic 999 value 0.
77 wcg pic 999 value 0.
77 wtempsmoyen pic 9(10)v99 value 0.
77 wtot-grade pic 9(9).
77 wtot-arme pic 9(9).
77 wgrade pic xxx.
77 warme pic xxx.
77 wbuf pic xx.
1 wdate pic x(6).
1 wtabarme.
3 pic x(20) value "artl'Artillerie".
3 pic x(20) value "genle Génie".
3 pic x(20) value "gndLa Gendarmerie".
3 pic x(20) value "infl'Infanterie".
3 pic x(20) value "trsLes Transmissions".
3 pic x(22) value " Arme inconnue 06".
1 wtabarm redefines wtabarme.
3 occurs 6.
5 wcodarm pic xxx.
5 wclair pic x(17).
3 a pic 9.
3 amax pic 9.
REPORT SECTION.
rd dans-quel-etat-j-erre
controls are final earme egrad
page limit is 66 lines
heading 1
first detail 8
last detail 60
footing 64.
PROCEDURE DIVISION.
declaratives.
premiere-page section.
use before reporting debut-etat.
faire-moins-un.
subtract 1 from page-counter.
end declaratives.
suite section.
debut.
open input fentree output finf ftrs fgnd fimpri
* subtract 1 from page-counter => nok => declaratives
accept wdate from date
move wdate to wbuf
move wdate(5:2) to wdate(1:2)
move wbuf to wdate(5:2)
initiate dans-quel-etat-j-erre
* move 3 to page-counter ==> çà marche
read fentree
at end
set fin-fichier to true
display "pb fentree vide"
end-read
move 0 to wca
perform recherche-clair-arme
perform until fin-fichier
add 1 to wca
move earme to warme
move page-counter to wpc1
move 1 to wpage-arme
move 0 to wcg wtot-arme
perform until earme not = warme or fin-fichier
add 1 to wcg
move egrad to wgrade
move zero to wcp wtot-grade
perform until egrad not = wgrade or earme not = warme
or fin-fichier
add 1 to wcp
add etemps to wtot-grade
move page-counter to wpc2
generate ma-ligne-detail
if page-counter not = wpc2
then
compute wpage-arme = page-counter - wpc1 + 1
end-if
evaluate earme
when "trs"
if etemps <= wdist * 3600 / wvit-trs
then
move ematri to smatri
move wdist to sdist
move etemps to stemps
write strs from sinf
end-if
when "inf"
if etemps <= wdist * 3600 / wvit-inf
then
move ematri to smatri
move wdist to sdist
move etemps to stemps
write sinf
end-if
when "gnd"
if etemps <= wdist * 3600 / wvit-gnd
then
move ematri to sgnd(1:6)
move wdist to sgnd(15:4)
move etemps to sgnd(7:8)
write sgnd
end-if
end-evaluate
read fentree
at end
set fin-fichier to true
end-read
end-perform
* compute wtempsmoyen = tot-temps / wcp => nok
compute wtempsmoyen = wtot-grade / wcp
add wtempsmoyen to wtot-arme
add wcg to wca
end-perform
compute wtempsmoyen = wtot-arme / wcg
* perform les-bidouilles
perform recherche-clair-arme
generate ruse-supreme
end-perform
close fentree fimpri finf ftrs fgnd
terminate dans-quel-etat-j-erre
stop run.
recherche-clair-arme.
call "cbl_tolower" using earme by value 3
move 1 to a
perform until earme = wcodarm(a) or a >= amax
add 1 to a
end-perform.
les-bidouilles.
if line-counter < 60
then
* move 61 to line-counter
* move all x"04" to sligne *> pour visualiser
* write sligne
* nok on ne peut pas le forcer => érciture ligne suivante
* ==> essai de la ruse suivante
* move all x"05" to sligne *> pour visualiser
* compute n = 60 - line-counter
* write sligne after n
* nok écriture encore ligne suivante
* set line-counter to 61
* move all x"04" to sligne *> pour visualiser
* write sligne
generate ma-ligne-detail-magouille
end-if.
résultat obtenu
--------------------------------------------------------------------------------
ESAT-DMSI à Rennes le 20/08/97 page 01
Av de la Touraudais
35335 Cesson-Sévigné résultats du cross-97 pour l'Artillerie
--------------------------------------------------------------------------------
+--------+
¦arme=art¦
+--------+
<==
col PORCINET MARCEL 1202
BOUCEROT JEAN 1621
POURCEROT JEAN 1623
MORCINET MARCEL 1901
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cours cobol-85 cross-ESAT par arme et grade page-art-01
--------------------------------------------------------------------------------
ESAT-DMSI à Rennes le 20/08/97 page 02
Av de la Touraudais
35335 Cesson-Sévigné résultats du cross-97 pour l'Artillerie
--------------------------------------------------------------------------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cours cobol-85 cross-ESAT par arme et grade page-art-02
--------------------------------------------------------------------------------
ESAT-DMSI à Rennes le 20/08/97 page 03
Av de la Touraudais
35335 Cesson-Sévigné résultats du cross-97 pour l'Artillerie
--------------------------------------------------------------------------------
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cours cobol-85 cross-ESAT par arme et grade page-art-03
--------------------------------------------------------------------------------
ESAT-DMSI à Rennes le 20/08/97 page 04
Av de la Touraudais
35335 Cesson-Sévigné résultats du cross-97 pour le Génie
--------------------------------------------------------------------------------
+--------+
¦arme=gen¦
+--------+
<==
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cours cobol-85 cross-ESAT par arme et grade page-gen-01
--------------------------------------------------------------------------------
ESAT-DMSI à Rennes le 20/08/97 page 05
Av de la Touraudais
35335 Cesson-Sévigné résultats du cross-97 pour La Gendarmerie
--------------------------------------------------------------------------------
+--------+
¦arme=gnd¦
+--------+
<==
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cours cobol-85 cross-ESAT par arme et grade page-gnd-01
.
.
.
.
etc