IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Au Pied Levé - À Main Levée

[TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent

Noter ce billet
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 ■ ■ ■

  1. le sujet : Une mise à jour 0,n Mouvements pour 0,1 Permanent
  2. L'Algorigramme LCP
  3. Le Programme source COBOL
  4. Transposition de la version COBOL en version SGBD Informix-SQL
    1. SQL de création des tables de la BDD Informix
    2. L'algorigramme Informix-SQL
    3. Le programme source Informix-SQL
    4. Les requêtes SQL
    5. 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 ».

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
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│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

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
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

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
{------------------------------------------------------------------------------}
{
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

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
      ┌───────┐          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).

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
{================================== 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

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
{=================================== 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

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
{------------------------------------------------------------------------------}
{
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.


Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog Viadeo Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog Twitter Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog Google Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog Facebook Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog Digg Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog Delicious Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog MySpace Envoyer le billet « [TUTORIEL] Une mise à jour 0,n Mouvements pour 0,1 Permanent » dans le blog Yahoo

Mis à jour 24/02/2024 à 08h17 par APL-AML

Tags: algorithmie
Catégories
■ ALGORITHMIQUE