par , 01/04/2021 à 10h30 (51 Affichages)
Public :
- étudiants
- débutants
- et pourquoi pas, enseignants
Contenu :
- la pédagogie LCP
- la structure complexe
- la structure itérative
- la structure alternative
TUTORIEL
Un cas classique comme sujet de discussion sur le forum COBOL
■ ■ ■ SOMMAIRE DU BILLET ■ ■ ■
- le sujet : Une mise à jour 0,n Mouvements pour 0,1 Permanent
- L'Algorigramme LCP
- Le Programme source COBOL
- Transposition de la version COBOL en version SGBD Informix-SQL
- SQL de création des tables de la BDD Informix
- L'algorigramme Informix-SQL
- Le programme source Informix-SQL
- Les requêtes SQL
- Les statistiques Word
■ § 1. le sujet : Une mise à jour 0,n Mouvements pour 0,1 Permanent
Discussion : Une mise à jour 0,n Mouvements pour 0,1 Permanent
Le cas traité est classique : un fichier mouvement met à jour un fichier permanent.
Les deux sont triés sur l'indicatif d'appareillage qui sera 0 ou n mouvements pour 0 ou 1 permanent.
La mise à jour est simple :
- Création du permanent si mouvement seul
- Reconduction du permanent sans mouvement
- Mise à jour du permanent si correspondance de mouvement
- Mise à jour particulière pour le premier d'un groupe
- Mise à jour générale pour tous les enregistrements du groupe
■ § 2. L’algorigramme LCP
Chaque Pavé représentant une action (un traitement) est numéroté de 10 en 10 en suivant le sens de lecture de l’algorigramme : de haut en bas et de la gauche vers la droite.
En COBOL, chacun de ces numéros correspondra à un nom de paragraphe.
Au Pavé P010 correspondra dans le source COBOL, le paragraphe P010-D-PROG, donc le titre de l’action (ou traitement) accolé au numéro de Pavé, etc.
Pour d’autres langages, il est possible de devoir adapter ces noms de paragraphes au langage.
En langage SQL, par exemple, les « DEBUT TRAITEMENT », « TRAITEMENT » et « FIN TRAITEMENT » se sont mués en clauses « BEFORE GROUP OF », « ON EVERY ROW » et « AFTER GROUP OF ».
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
|
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│FILE SECTION. │
├───────────────────────────────────┬───────────────────────────────────┬───────────────────────────────────┤
│01 MVT-ART. │01 PMT-ART. │01 OUT-ART. │
│ 05 MVT-INDICATIF PIC X(04). │ 05 PMT-INDICATIF PIC X(04). │ 05 OUT-INDICATIF PIC X(04). │
│ 05 MVT-C-MONTANT PIC X(01). │ 05 PMT-D-MAJ PIC 9(06). │ 05 OUT-D-MAJ PIC 9(06). │
│ 05 MVT-MONTANT PIC 9(05). │ 05 PMT-MONTANT-1 PIC 9(07). │ 05 OUT-MONTANT-1 PIC 9(07). │
│ │ 05 PMT-MONTANT-2 PIC 9(07). │ 05 OUT-MONTANT-2 PIC 9(07). │
├───────────────────────────────────┴───────────────────────────────────┴───────────────────────────────────┤
│SIMULATION │
├───────────────────────────────────┬───────────────────────────────────┬───────────────────────────────────┤
│Fichier MVT (0,1) │Fichier PMT (0,n) │Fichier OUT │
├───────────────────────────────────┼───────────────────────────────────┼───────────────────────────────────┤
│0005|1|00050| │0004|AAMMJJ|0001000|0000300| │0004|AAMMJJ|0001000|0000300| │
│0005|2|00150| │0025|AAMMJJ|0001111|0000333| │0005|AAMMJJ|0001100|0000360| │
│0005|1|01000| │ │0020|AAMMJJ|0001500|0000350| │
│0005|1|00050| │ │0025|AAMMJJ|0001111|0000333| │
│0005|2|00210| │ │ │
│0020|1|00500| │ │ │
│0020|2|00350| │ │ │
│0020|1|01000| │ │ │
└───────────────────────────────────┴───────────────────────────────────┴───────────────────────────────────┘
┌───────┐ 0,1┌───────┐
│ MVT ├─────────────┤ PMT │
└───┬───┘0,n └───┬───┘
┌─┴─────────────────────┴─┐
│ APP01P0 │
└────────────┬────────────┘
┌───┴───┐
│ OUT │
MAIN-PROC SECTION. └───────┘
P010-D-PROG. ┌─────────────────────────┐
P020-D-INDICATIF. │ D-PROG │
P030-T-PMTLU. │ │
P040-D-MVTLU. P010 │ ACCEPT DATE │
P050-T-MVT-C-MONTANT. │ READ PMT │
P060-F-MVTLU. │ READ MVT │
P070-D-PMTLU-ET-MVTLU. └────────────┬────────────┘
P080-T-MVT-C-MONTANT. ├◄───────────────────────────────────────────────────┐
P090-F-PMTLU-ET-MVTLU. ┌────────────┴────────────┐ │
P100-F-INDICATIF. │ D-INDICATIF │ │
P110-F-PROG P020 │ │ │
│ PMT-INDIC :: MVT-INDIC │ │
└────────────┬────────────┘ │
┌───────────────────────────────────◊───────────────────────────────────┐ │
│ < │ > = │ │
│ ┌────────────┴────────────┐ ┌────────────┴────────────┐ │
│ P040 │ D-MVT │ P070 │ D-MVT-PMT │ │
│ └────────────┬────────────┘ └────────────┬────────────┘ │
│ ├◄─────────────┐ ├◄─────────────┐ │
┌────────────┴────────────┐ ┌────────────┴────────────┐ │ ┌────────────┴────────────┐ │ │
│ T-PMT │ │ T-C-MONTANT │ │ │ T-C-MONTANT │ │ │
P030 │ WRITE OUT │ P050 │ READ MVT │ = P080 │ READ MVT │ = │
│ READ PMT │ │ MVT-INDIC :: OUT-INDIC │ │ │ MVT-INDIC :: OUT-INDIC │ │ │
└────────────┬────────────┘ └────────────┬────────────┘ │ └────────────┬────────────┘ │ │
│ ◊──────────────┘ ◊──────────────┘ │
│ ┌────────────┴────────────┐ ┌────────────┴────────────┐ │
│ │ F-MVT │ │ F-MVT-PMT │ │
│ P060 │ WRITE OUT │ P090 │ WRITE OUT │ │
│ │ │ │ READ PMT │ │
│ └────────────┬────────────┘ └────────────┬────────────┘ │
└──────────────────────────────────►┼◄──────────────────────────────────┘ │
┌────────────┴────────────┐ │
P100 │ F-INDICATIF │ │
└────────────┬────────────┘ non │
◊────────────────────────────────────────────────────┘
┌────────────┴────────────┐
P110 │ F_PROG │
└─────────────────────────┘ |
■ § 3. Le programme source COBOL
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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
|
┌───── IDENTIFICATION DIVISION.
│
│ PROGRAM-ID. APP01P0N.
│ AUTHOR. OBELIX84.
│ *OBJET. Création d’un OUT depuis le permanent PMT et le Mouvement MVT.
│
│ *==============================================================================*
│ * *
│ * - Sur PC (DOS) liens aux fichiers réels par variables envt *
│ * *
│ * Exemple : *
│ * *
│ * set FICPMT=E:\FIC\FICPMT1 *
│ * set FICMVT=E:\FIC\FICMVT1 *
│ * *
│ * rem appel au pgm (display sur E:\FIC\APP1.LST) *
│ * app01P0n > E:\FIC\APP1.LST *
│ * *
│ * - Gestion des erreurs fichiers par déclaratives *
│ * *
│ *==============================================================================*
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── ENVIRONMENT DIVISION.
│
│ CONFIGURATION SECTION.
│ SOURCE-COMPUTER. PC WITH DEBUGGING MODE.
│ OBJECT-COMPUTER. PC.
│
│ INPUT-OUTPUT SECTION.
│
│ FILE-CONTROL.
│
│ SELECT OPTIONAL
│ FICPMT ASSIGN TO EXTERNAL PMT
│ ORGANIZATION IS LINE SEQUENTIAL
│ FILE STATUS IS FS-PMT.
│
│ SELECT FICMVT ASSIGN TO EXTERNAL MVT
│ ORGANIZATION IS LINE SEQUENTIAL
│ FILE STATUS IS FS-MVT.
│
│ SELECT FICOUT ASSIGN TO EXTERNAL OUT
│ ORGANIZATION IS LINE SEQUENTIAL
│ FILE STATUS IS FS-OUT.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── DATA DIVISION.
│
├───── FILE SECTION.
│
│ FD PMT RECORD CONTAINS 24 CHARACTERS.
│ 01 PMT-ART.
│ 05 PMT-INDICATIF PIC X(04).
│ 05 PMT-D-MAJ PIC 9(06).
│ 05 PMT-MONTANT-1 PIC 9(07).
│ 05 PMT-MONTANT-2 PIC 9(07).
│
│ FD MVT RECORD CONTAINS 10 CHARACTERS.
│ 01 MVT-ART.
│ 05 MVT-INDICATIF PIC X(04).
│ 05 MVT-C-MONTANT PIC X(01).
│ 05 MVT-MONTANT PIC 9(05).
│
│ FD OUT RECORD CONTAINS 24 CHARACTERS.
│ 01 OUT-ART.
│ 05 OUT-INDICATIF PIC X(04).
│ 05 OUT-D-MAJ PIC 9(06).
│ 05 OUT-MONTANT-1 PIC 9(07).
│ 05 OUT-MONTANT-2 PIC 9(07).
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── WORKING-STORAGE SECTION.
│
│ 01 FS-PMT PIC X(02) VALUE SPACES.
│ 01 FS-MVT PIC X(02) VALUE SPACES.
│ 01 FS-OUT PIC X(02) VALUE SPACES.
│
│ 01 NOM-PMT PIC X(08) VALUE "FICPMT".
│ 01 NOM-MVT PIC X(08) VALUE "FICMVT".
│ 01 NOM-OUT PIC X(08) VALUE "FICOUT".
│
│ 01 GESTFST PIC X(07) VALUE "GESTFST".
│ 01 RC PIC S9(05) VALUE ZERO.
│ 01 D-TODAY PIC 9(06) VALUE ZERO.
│
│ 01 PMTLU-ART.
│ 05 PMTLU-INDICATIF PIC X(04).
│ 05 PMTLU-D-MAJ PIC 9(06).
│ 05 PMTLU-MONTANT-1 PIC 9(07).
│ 05 PMTLU-MONTANT-2 PIC 9(07).
│
│ 01 MVTLU-ART.
│ 05 MVTLU-INDICATIF PIC X(04).
│ 05 MVTLU-C-MONTANT PIC X(01).
│ 05 MVTLU-MONTANT PIC 9(05).
│
│ 01 MVTST-ART.
│ 05 MVTST-INDICATIF PIC X(04).
│ 05 MVTST-C-MONTANT PIC X(01).
│ 05 MVTST-MONTANT PIC 9(05).
│
│ 01 OUTWS-ART.
│ 05 OUTWS-INDICATIF PIC X(04).
│ 05 OUTWS-D-MAJ PIC 9(06).
│ 05 OUTWS-MONTANT-1 PIC 9(07).
│ 05 OUTWS-MONTANT-2 PIC 9(07).
│
│ 01 NB_BILANS.
│ 05 NB-PMT-LU PIC S9(06) COMP VALUE ZERO.
│ 05 NB-PMT-ADD PIC S9(06) COMP VALUE ZERO.
│ 05 NB-PMT-MAJ PIC S9(06) COMP VALUE ZERO.
│ 05 NB-MVT-LU PIC S9(06) COMP VALUE ZERO.
│ 05 NB-OUT PIC S9(06) COMP VALUE ZERO.
│
│ 01 LIB-ERREUR.
│ 05 C-ERREUR PIC 9(02).
│ 05 FILLER PIC X(01).
│ 05 L-ERREUR PIC X(70).
│
│ 01 DSP-ERREUR.
│ 05 DSP-ERREUR-1 PIC X(13).
│ 05 FILLER PIC X(01) VALUE SPACE.
│ 05 DSP-ERREUR-2 PIC X(70).
│
│ 01 ERR-NAT.
│ 05 ERR-NAT1 PIC X(13) VALUE "---APP01P0N--".
│ 05 ERR-NAT8 PIC X(13) VALUE "...........LU".
│ 05 ERR-NAT9 PIC X(13) VALUE "***APP01P0N**".
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── PROCEDURE DIVISION.
│
├───── DECLARATIVES.
│
│ ERREUR-PMT SECTION.
│ USE AFTER STANDARD ERROR PROCEDURE ON PMT.
│ IF FS-PMT NOT = ""
│
│ CALL GESTFST USING "PMT" FS-PMT RC
│ END-IF.
│
│ ERREUR-MVT SECTION.
│ USE AFTER STANDARD ERROR PROCEDURE ON MVT.
│ IF FS-MVT NOT = ""
│ CALL GESTFST USING "MVT" FS-MVT RC
│ END-IF.
│
│ ERREUR-OUT SECTION.
│ USE AFTER STANDARD ERROR PROCEDURE ON OUT.
│ IF FS-OUT NOT = ""
│ CALL GESTFST USING "OUT" FS-OUT RC
│ END-IF.
│
│ END DECLARATIVES.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── MAIN-PROC SECTION.
│
├───── P010-D-PROG.
│ MOVE ZERO TO RC.
│ ACCEPT D-TODAY FROM DATE.
│
│ OPEN INPUT PMT.
│ IF FS-PMT NOT = ""
│ MOVE "90 PROBLEME A L'OPEN PMT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│
│ OPEN INPUT MVT.
│ IF FS-MVT NOT = ""
│ MOVE "90 PROBLEME A L'OPEN MVT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│
│ OPEN OUTPUT OUT.
│ IF FS-OUT NOT = ""
│ MOVE "90 PROBLEME A L'OPEN OUT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│
│ PERFORM READ-PMT.
│ PERFORM READ-MVT.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── P020-D-INDICATIF.
│ PERFORM WITH TEST BEFORE UNTIL PMTLU-INDICATIF = MVTLU-INDICATIF
│ AND PMTLU-INDICATIF = HIGH-VALUE
│ EVALUATE TRUE
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P030-T-PMTLU.
│ WHEN PMTLU-INDICATIF < MVTLU-INDICATIF
│ MOVE PMTLU-ART TO OUTWS-ART
│ PERFORM WRITE-OUT
│ PERFORM READ-PMT
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P040-D-MVTLU.
│ WHEN PMTLU-IDICATIF > MVTLU-INDICATIF
│ MOVE MVTLU-INDICATIF TO OUTWS-INDICATIF
│ MOVE D-TODAY TO OUTWS-D-MAJ
│ MOVE ZERO TO OUTWS-MONTANT-1
│ OUTWS-MONTANT-2
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P050-T-MVT-C-MONTANT.
│ PERFORM UNTIL MVTLU-INDICATIF = OUTWS-INDICATIF
│ EVALUATE MVTLU-C-MONTANT
│ WHEN "1" ADD MVTLU-MONTANT TO OUTWS-MONTANT-1
│ WHEN "2" ADD MVTLU-MONTANT TO OUTWS-MONTANT-2
│ END-EVALUATE
│ PERFORM READ-MVT
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P060-F-MVTLU.
│ ELSE
│ PERFORM WRITE-OUT
│ ADD 1 TO NB-PMT-ADD
│ END-IF
│
│ END-PERFORM.
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P070-D-PMTLU-ET-MVTLU.
│ WHEN PMTLU-INDICATIF = MVTLU-INDICATIF
│ MOVE PMTLU-ART TO OUTWS-ART
│ MOVE D-TODAY TO OUTWS-D-MAJ
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P080-T-MVT-C-MONTANT.
│ PERFORM UNTIL MVTLU-INDICATIF = OUTWS-INDICATIF
│ EVALUATE MVTLU-C-MONTANT
│ WHEN "1" ADD MVTLU-MONTANT TO OUTWS-MONTANT-1
│ WHEN "2" ADD MVTLU-MONTANT TO OUTWS-MONTANT-2
│ END-EVALUATE
│ PERFORM READ-MVT
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P090-F-PMTLU-ET-MVTLU.
│ ELSE
│ PERFORM WRITE-OUT
│ ADD 1 TO NB-PMT-MAJ
│ END-IF
│ END-PERFORM.
│
│ PERFORM READ-PMT.
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────*P100-F-INDICATIF.
│ END-EVALUATE
│ END-PERFORM.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── P110-F-PROG.
│ MOVE ZERO TO RC.
│
│ CLOSE PMT.
│ IF FS-PMT NOT = ""
│ MOVE "91 PROBLEME AU CLOSE FICPMT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│
│ CLOSE MVT.
│ IF FS-MVT NOT = ""
│ MOVE "91 PROBLEME AU CLOSE FICMVT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│
│ CLOSE OUT.
│ IF FS-OUT NOT = ""
│ MOVE "91 PROBLEME AU CLOSE FICMVT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│
│ DISPLAY ERR-NAT1 " NB ENREG PMT LUS =" NB-PMT-LU.
│ DISPLAY ERR-NAT1 " NB ENREG PMT CREES =" NB-PMT-ADD.
│ DISPLAY ERR-NAT1 " NB ENREG PMT M-A-J =" NB-PMT-MAJ.
│ DISPLAY ERR-NAT1 " NB ENREG MVT LUS =" NB-MVT-LU.
│ DISPLAY ERR-NAT1 " NB ENREG PMT ECRITS =" NB-OUT.
│
│ GO TO RETOUR.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── READ-PMT.
│ MOVE SPACES TO PMTLU-ART.
│ READ PMT INTO PMTLU-ART
│ AT END MOVE HIGH-VALUE TO PMTLU-INDICATIF.
│ IF FS-PMT NOT = "" AND NOT = "10"
│ MOVE "93 PROBLEME AU READ PMT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│ IF PMTLU-INDICATIF NOT = HIGH-VALUE
│ ADD 1 TO NB-PMT-LU
│ END-IF.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── READ-MVT.
│ MOVE SPACES TO ART-MVT-LU.
│ READ FICMVT INTO ART-MVT-LU
│ AT END MOVE HIGH-VALUE TO MVTLU-INDIC.
│ IF FS-MVT NOT = "" AND NOT = "10"
│ MOVE "93 PROBLEME AU READ MVT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│ IF MVTLU-INDICATIF NOT = HIGH-VALUE
│ ADD 1 TO NB-MVTLU
│ END-IF.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── WRITE-OUT.
│ WRITE OUT-ART FROM OUTWS-ART.
│ IF FS-OUT NOT = ""
│ MOVE "93 PROBLEME AU WRITE OUT " TO L-ERREUR
│ PERFORM DISPLAY-ERR
│ END-IF.
│ ADD 1 TO NB-OUT.
└─────*───────────────────────────────────────────────────────────────────────────────
┌─────DISPLAY-ERR.
│ MOVE SPACES TO DSP-ERREUR.
│ MOVE L-ERREUR TO DSP-ERREUR-2.
│
│ EVALUATE C-ERREUR
│
│ *==============================================================================*
│ * *
│ * C-ERREUR (COD-ERR) est testé mais jamais renseigné. Est-ce normal ? *
│ * *
│ *==============================================================================*
│
│ WHEN 01 THRU 09
│ MOVE ERR-NAT1 TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR
│ MOVE SPACES TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR-1
│ "/ MVTLU-ART =" MVTLU-ART
│
│ WHEN 10 THRU 19
│ MOVE ERR-NAT9 TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR
│ MOVE SPACES TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR-1
│ "/MVTLU-ART =" MVTLU-ART
│ GO TO RETOUR
│
│ WHEN 20 THRU 29
│ MOVE ERR-NAT1 TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR
│ MOVE SPACES TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR-1
│ "/PMTLU-ART =" PMTLU-ART
│
│ WHEN 30 THRU 39
│ MOVE ERR-NAT9 TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR
│ MOVE SPACES TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR-1
│ "/PMTLU-ART =" PMTLU-ART
│ GO TO RETOUR
│
│ WHEN 40 THRU 49
│ MOVE ERR-NAT9 TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR
│ MOVE SPACES TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR-1
│ "/OUTWS-ART =" OUTWS-ART
│ GO TO RETOUR
│
│ WHEN OTHER
│ MOVE ERR-NAT9 TO DSP-ERREUR-1
│ DISPLAY DSP-ERREUR
│ GO TO RETOUR
│
│ END-EVALUATE.
└─────*───────────────────────────────────────────────────────────────────────────────
┌───── RETOUR. GOBACK.
│
│ END PROGRAM APP01P0N.
└─────*─────────────────────────────────────────────────────────────────────────────── |
■ § 4. Transposition de le version COBOL en version SGBD Informix-SQL
■ § 4.1. SQL de création des tables de la BDD Informix
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
|
{------------------------------------------------------------------------------}
{
create_bdd.sql
}
{------------------------------------------------------------------------------}
{
sql de création de toutes les tables de la BDD "mabase"
Les attributs les plus courants sont codifiés par un radical suivi du nom de la
table à laquelle ils appartiennent ou du nom de leur table référente.
Les attributs retenus sont les suivants :
+------------+----+------------------------------------------------------------+
| Numéro | n_ | l'attribut "n_pec" se lit "Numéro de la table pec" |
| Code | c_ | l'attribut "c_ec" se lit "Code de la table ec" |
| Type | t_ | etc. |
| Session | s_ | |
| Libellé | l_ | |
| Mnémonique | m_ | |
+------------+----+------------------------------------------------------------+
{ pmt (permanent) -----------------------------------------------------------}
create table pmt
(
indicatif integer,
d_maj date,
montant_1 integer,
montant_2 integer
) ;
grant all on pmt to public;
{ pmt (permanent) -----------------------------------------------------------}
lock table pmt in exclusive mode;
{
drop index indicatif;
}
create unique cluster index pmt_indicatif on pmt (indicatif);
alter index pmt_indicatif to cluster;
unlock table pmt;
{ mvt (mouvements) ----------------------------------------------------------}
create table mvt
(
indicatif integer,
c_montant smallint,
montant_1 integer,
montant_2 integer
) ;
grant all on pmt to public;
{ mvt (mouvements) ----------------------------------------------------------}
lock table mvt in exclusive mode;
{
drop index indicatif;
}
create index mvt_indicatif on mvt (indicatif);
alter index mvt_indicatif to cluster;
unlock table mvt;
{------------------------------------------------------------------------------} |
■ § 4.2. L’algorigramme Informix-SQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
┌───────┐ 0,1┌───────┐
│ MVT ├─────────────┤ PMT │
└───┬───┘0,n └───┬───┘
┌─┴─────────────────────┴─┐
│ APP01P0 │
└────────────┬────────────┘
┌───┴───┐
│ OUT │
└───────┘
┌─────────────────────────┐
│BEFORE GROUP OF indicatif│
└────────────┬────────────┘
├◄──────────────┐
┌────────────┴────────────┐ │
│ ON EVERY ROW │ │
└────────────┬────────────┘ │
◊───────────────┘
┌────────────┴────────────┐
│AFTER GROUP OF indicatif│
└─────────────────────────┘ |
■ § 4.3. Le programme source Informix-SQL
Tout ce qui est entre accolades est du commentaire. Attention ! Les clauses obligatoires servent également de commentaires. Certaines clauses inutilisées sont réellement en commentaires mais restent présentes dans le programme par compatibilité avec tous mes programmes.
Le programme ne traite pas les totalisations (bilans) qui s’obtiennent facilement via des requêtes SQL (voir juste après le programme).
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
|
{================================== APP01P0N ==================================}
{ }
{ ACE : APP01P0N.ace }
{ }
{ SHELL : ../shell/APP01P0N (en commentaire en fin de programme) }
{ }
{ AUTEUR : IFA2377 }
{ }
{ Objet : Création d’un OUT depuis le permanent PMT et le Mouvement MVT }
{ }
{ Date : 12/12/2019 }
{ }
{==============================================================================}
{========================}
{===========================} DATABASE mabase END {=========================}
{========================}
{================================} DEFINE {==================================}
{} {}
{} PARAM[1] p_logname CHAR(8) {}
{} {}
{==================================} END {===================================}
{================================} OUTPUT {==================================}
{} {}
{} REPORT TO PIPE "cat > ${LOGNAME}.out" {}
{} TOP MARGIN 0 {}
{} BOTTOM MARGIN 0 {}
{} LEFT MARGIN 0 {}
{} PAGE LENGTH 1000 {}
{} TOP OF PAGE "^L" {}
{} {}
{==================================} END {===================================}
{=================================} SELECT {=================================}
pmt.indicatif tmp_indicatif
pmt.d-maj tmp_d_maj
0 tmp_c_montant
pmt.montant-1 tmp_montant_1
pmt.montant-2 tmp_montant_2
FROM OUTER pmt
{=============================} UNION SELECT {==============================}
mvt.indicatif tmp_indicatif
TODAY tmp_d_maj
mvt.c_montant tmp_c_montant
mvt.montant tmp_montant_1
mvt.montant tmp_montant_2
FROM mvt
{============================} INTO TEMP tmp; {=============================}
{=================================} SELECT {=================================}
tmp.*
FROM tmp
{===============================} ORDER BY {================================}
tmp_indicatif
{==================================} END {===================================}
{=================================} FORMAT {=================================}
{----------------------} BEFORE GROUP OF tmp_indicatif {---------------------}
LET out_indicatif = tmp_indicatif
LET out_montant_1 = 0
LET out_montant_2 = 0
{---------------------------- FIRST PAGE HEADER ----------------------------}
{------------------------------- PAGE HEADER -------------------------------}
{------------------------------- PAGE TRAILER -------------------------------}
{------------------------------} ON EVERY ROW {------------------------------}
IF tmp_c_montant = 0
THEN LET out_d_maj = tmp_d_maj
LET out_montant_1 = tmp_montant_1
LET out_montant-2 = tmp_montant_2
ELSE
IF tmp_c_montant = 1
THEN LET out_d_maj = tmp-d-maj
LET out_montant_1 = tmp_montant_1 + out_montant_1
ELSE LET out_d-maj = tmp-d-maj
LET out_montant_2 = tmp_montant_2 + out_montant_2
{-------------------------- TRAITEMENT FIN DE PAGE --------------------------}
{------------------------ TRAITEMENT EN-TETE DE PAGE ------------------------}
{------------------------ TRAITEMENT LIGNE COURANTE ------------------------}
{-----------------------} AFTER GROUP OF tmp_indicatif {-----------------------}
PRINT out_indicatif,
out_d-maj,
out_montant_1,
out_montant_2
{------------------------------- ON LAST ROW --------------------------------}
{ - Réinitialisation de l'imprimante "HP LASER III SI" }
{ PRINT ESC,"E"}
{===================================} END {==================================} |
■ § 4.4. Le shell unix
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
| {=================================== SHELL ====================================}
{
# APP01P0N
clear
echo "┌LISTE DES TABLES───────────────────────────────────────────────────────┐"
echo "│ │"
echo "│TRAITEMENT ? [ <──┘ ]=OK │"
echo "│ [Suppr]=Abandon │"
echo "└───────────────────────────────────────────────────────────────────────┘"
echo ""
cd ../shell
if test -f ${LOGNAME}.out
then rm ${LOGNAME}.out
fi
SMSO=`tput smso`
RMSO=`tput rmso`
# TRAITEMENT
tput cup 2 14
echo $SMSO" "$RMSO
tput cup 2 14
read REPONSE
tput cup 2 14
echo " "
tput cup 5 0
echo " Traitement en cours... \c"
sacego -q ../ace/ APP01P0N $LOGNAME
echo " TERMINE !"
}
{==============================================================================} |
■ § 4.5. ■ Les requêtes SQL
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
|
{------------------------------------------------------------------------------}
{
Nombre d’articles pmt lus
}
{------------------------------------------------------------------------------}
select count(*) nb_pmt_lu
from pmt;
{------------------------------------------------------------------------------}
{
Nombre d’articles pmt ajoutés
Nombre d’articles pmt modifiés
}
{------------------------------------------------------------------------------}
select unique
pmt.indicatif pmt_indicatif,
mvt.indicatif mvt_indicatif
from
outer pmt,
mvt
where pmt.indicatif = mvt.indicatif
into tmp;
select count(*) nb_pmt_add
from tmp
where tmp.pmt_indicatif is null;
select count(*) nb_pmt_maj
from tmp
where tmp.pmt_indicatif = tmp.mvt_indicatif;
{------------------------------------------------------------------------------}
{
MAJ_pmt.sql
}
{------------------------------------------------------------------------------}
delete
from pmt
where pmt.indicatif is not null;
load from "logname.out" insert into pmt;
alter index pmt.indicatif to cluster;
{------------------------------------------------------------------------------}
{
Nombre d’articles out
}
{------------------------------------------------------------------------------}
select count(*) nb_out
from pmt;
{------------------------------------------------------------------------------} |
■ § 4.6. Les statistiques Word
APP01P0 |
Obelix84 |
IFA2377 |
SGBD/SQL |
Pages
Mots
Caractères (espaces non compris)
Caractères (espaces compris)
Paragraphes
Lignes
Lectures
Écritures
PERFORM |
8
2415
16605
20480
508
508
6
2
32 |
8
1033
6003
9750
280
349
6
2
24 |
2
319
2979
4975
82
115
0
1
0 |
Si l’on prend le temps de jeter un œil attentif au programme SQL que j’ai proposé, je pense que n’importe qui peut le lire et le comprendre tel qu’il est, sans davantage de commentaires et sans avoir de connaissances particulières du SQL. De même d’ailleurs que ma version COBOL. Encore que j’aurais préféré programmer cette version avec des GO TO plutôt que des PERFORM. Les GO TO rendent la lecture plus fluide et pour moi, c’est ce qui importe. La profusion de PERFORM rassure peut-être mais c’est au détriment de la lisibilité. Indispensables, les noms-paragraphes du COBOL ou les clauses du SQL constituent à eux-seuls des commentaires suffisants.
Une précision tout de même concernant ma version SQL : dans la séquence « SELECT… FROM OUTER pmt… », l’option « OUTER » signifie au compilateur que la table pmt peut être vide.