Kikoo les gens,
Dans ce petit tutoriel, je vais montrer une application concrète des niveaux 88, et histoire de donner un exemple passe-partout, je vais montrer comme vérifier qu'une année est bissextile via un niveau 88. (NB : Ce n'est pas forcement le choix le plus pertinent d'algo que je vais montrer, mais juste une application concrète).
NB : Ce n'est pas un tuto pour les débutants en Cobol, hein..., toutefois, un petit rappel :
Un niveau 88 est un niveau de "condition". Il se déclare sous un niveau 01 ou autre. Je donne un exemple simple :
Ici je déclare une variable année, et cette variable dispose d'un "booléen" EST-BISSEXTILE qui a pour valeur 0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 01 ANNEE. 88 EST-BISSEXTILE VALUE 0.
Pour tester si l'année est bissextile, il suffit simplement de faire : IF EST-BISSEXTILE. Aussi simple que ça.
Comment je fais pour calculer si mon année est bissextile ???
Tout d'abord un petit programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 Identification division. ************************* Program-ID. NIV88. / Data division. *************** / Working-storage section. *========================* 01 DATEC. 05 DATE-C-SA. 10 DATEC-SS PIC 99. 10 DATEC-AA PIC 99. 05 DATE-C-MM PIC 99. 05 DATE-C-JJ PIC 99. 77 DATE-C-DIV PIC 99. 77 DATE-C-RES PIC 99. ***- ***- LISTE DES MOIS DE 30 ET 31 JOURS + FEVRIER ***- 01 TYPE-DATE. 05 JOUR-PAR-MOIS PIC 99. 88 EST-MOIS-31 VALUE 01 03 05 07 08 10 12. 88 EST-MOIS-30 VALUE 04 06 09 11. 88 FEVRIER VALUE 02. 01 ANNEE. 88 EST-BISSEXTILE VALUE 0. 88 TARTANPION VALUE 1. PROCEDURE DIVISION. ******************** * Mettre une date quelconque dans DATEC, ici la date du jour ACCEPT DATEC FROM DATE. Perform Controle-date THRU Controle-date-fin. STOP RUN. Controle-date SECTION. *====================== * Controle si le mois est valide * sinon : exit CD-MOIS. If DATE-C-MM < 01 OR > 12 go to Controle-date-fin end-if. CD-JOUR. Move DATE-C-MM to JOUR-PAR-MOIS. ***- TEST SI MOIS DE 31 JOURS ***- vérifie que jour compris entre 1 et 31 ***- sinon : Exit if EST-MOIS-31 if DATE-C-JJ < 1 OR > 31 go to Controle-date-fin end-if end-if. ***- TEST SI MOIS DE 30 JOURS ***- vérifie que jour compris entre 1 et 30 ***- sinon : Exit If EST-MOIS-30 if DATE-C-JJ < 1 OR > 30 go to Controle-date-fin end-if end-if. ***- TEST SI MOIS DE FEVRIER If FEVRIER ***- Vérifie que le jour est > 0 if DATE-C-JJ > 0 PERFORM CTR-DAT-TRT-FEV if EST-BISSEXTILE if DATE-C-JJ <= 29 go to Controle-date-fin else display "Erreur sur le jour" go to Controle-date-fin end-if else if DATE-C-JJ <= 28 go to Controle-date-fin else display "Erreur sur le jour" go to Controle-date-fin end-if end-if else go to CTR-DAT-REJ end-if end-if. Controle-date-fin. EXIT. *================== Fonction SECTION. *================= ***--------------------------------------------------------*** ***- Verifier si année bissextile (simplifié) -*** ***--------------------------------------------------------*** Controle-Fevrier. Set EST-BISSEXTILE to FALSE. divide DATE-C-SA by 4 giving DATE-C-DIV remainder DATE-C-RES. If CTR-DAT-RES = 0 Set EST-BISSEXTILE to TRUE. End-if.
Ici, je déclare une zone TYPE-DATE qui est un ensemble de niveau 88 que je découpe en mois de 30 jours, 31 jours et février pour finir.
J'ai créé en PROCEDURE DIVISION un programme qui permet d'appeler une fonction de calcul d'année bissextile. Je vais juste m'arrêter sur les passages intéressants.
Voici une des façons d'initialiser un niveau 88, je mets une valeur dans son niveau supérieur (ici, je mets le mois, mais je pourrais mettre des patates), Cobol va automatiquement choisir les indicateurs qui sont activés et ceux qui ne le sont pas. Si par exemple, nous sommes en mars (mois 03), Cobol va activer EST-MOIS-30.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Move DATE-C-MM to JOUR-PAR-MOIS.
Ensuite, on vérifie si EST-MOIS-31 est activé ou non (si on est en mars, il ne l'est pas...), dans ce cas, ici, on vérifie que le jour dans le mois est compris entre 1 et 30, sinon ==> on sort de la boucle (je n'ai pas géré d'erreur ici pour la simplification).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if EST-MOIS-31 if DATE-C-JJ < 1 OR > 31 go to Controle-date-fin end-if end-if.
Ensuite, si on est en février (IF FEVRIER), on va vérifier si l'année est bissextile.
Ici c'est un algo simplifié qui vérifie que l'année est divisible par 4.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Controle-Fevrier. Set EST-BISSEXTILE to FALSE. divide DATE-C-SA by 4 giving DATE-C-DIV remainder DATE-C-RES. If CTR-DAT-RES = 0 Set EST-BISSEXTILE to TRUE. End-if.
Voici la deuxième façon d'initialiser un niveau 88, faire un SET xxxx TO FALSE (ou TRUE suivant). Dans notre cas, la variable EST-BISSEXTILE est à TRUE, et la variable TARTANPION à FALSE du coup.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Set EST-BISSEXTILE to FALSE.
Un truc à éviter ??
Attention, les niveaux 88 peuvent rendre le code particulièrement peu lisible :
Le type qui va passer derrière ce code risque de ne pas s'apercevoir que TARTANPION et EST-BISSEXTILE sont liées et que l'un basculant à TRUE fait basculer l'autre à FALSE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Controle-Fevrier. Set TARTANPION to TRUE. divide DATE-C-SA by 4 giving DATE-C-DIV remainder DATE-C-RES. If CTR-DAT-RES = 0 Set EST-BISSEXTILE to TRUE. End-if.
Un autre exemple ???
Les niveaux 88 permettent de se sortir de panades extrêmes de façon très simple. Mettons que vous ayez des indicateurs, mais qui histoire de se compliquer la vie peuvent exister en version simple et en version détaillée et (histoire de ne pas se faciliter la tâche) que l'on utilise soit l'un ou soit l'autre, mais pas les deux... Rigolez pas, je l'ai eu.
La façon traditionnelle de faire ça est :
Pas des plus lisibles, et je ne raconte pas le désastre si la version non simplifiée devient A ou B ou C...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 If (SIMPLIFIE = "OUI" AND IND = "A") or (SIMPLIFIE = "NON" AND (IND = A OR "B"))
Les niveaux 88 résolvent facilement ce problème :
On déclare une variable simplifié, et on la met à true ou false (suivant).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 01 SIMPLE. 88 SIMPLIFIE VALUE 1. set SIMPLIFIE to TRUE.
Voici un tas d'indicateurs dans leur double version.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 01 INDICATEUR PIC X. 88 IND1 VALUE "A". 88 IND1B VALUE "A" "B". 88 IND2 VALUE "E". 88 IND2B VALUE "E" "F" "G".
Et des exemples d'appel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Move "A" to INDICATEUR. If IND1 and simplifie display "Indicateur 1" end-if. set IND2 to TRUE. If IND2 and simplifie display "Indicateur 2" end-if. Move "F" to INDICATEUR. If IND2B and not simplifie display "Indicateur 2b" end-if.
Si maintenant votre MOA préférée décide que la version non simplifiée c'est A B C :
C'est tout ce qui a à modifier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 88 IND1B VALUE "A" "B" "C".
Tout ceci pour montrer que les niveaux 88 ne servent pas uniquement à tester des conditions de sortie de boucle, mais peuvent être utilisés partout y compris comme des sortes de liste.
Voili voilu pour le tuto du jour.
Partager