Bonsoir ,
Je dispose d'une BDD avec une client de 1,2 millions de lignes. Dans un fichier a côté je dispose de 600 000 code client repartie en 5 lot (lot A,B,C,D,E).
Je dois :
* interroger la BDD pour m'assurer que j'ai bien le code client dans la BDD et le fichier
* remplacer la civilité 1/2/3/vide par Monsieur/Madame/Mr ou Mme
* tous les clients présent dans le fichier des 600 000 ne sont par ordonnées
* j'ai exactement 301 000 client du lot A
* Mes clients étant tous mélangés , au fur et a mesure de mon parcours du fichier je dois compter un pas de 15 uniquement sur les clients du lot "A" , dès que mon compteur arrive a 15 je dois remplacer A par Z , remettre le compteur a 0 puis recommencer avec le 30 ème A rencontré , le 45 ème A rencontré etc ...
* si le client est un A est que le compteur n'est pas à 15 on garde la valeur A
Au vu de l'opération qui est demandé voici 2 structures if/else if VS evaluate (dit case) , problème mon compilateur n'a pas l'aire de connaitre les "when" ... Compilateur trop vieux ?
Voici le code du programme avec "if/else if" :
Code cobol : 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 IDENTIFICATION DIVISION. PROGRAM-ID. 19314. *programme ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. * declaratif du fichier de resultat SELECT ficsortie ASSIGN TO DISK. SELECT ficentree1 ASSIGN TO DISK. DATA DIVISION. FILE SECTION. FD ficsortie LABEL RECORD STANDARD VALUE OF FILE-ID "/wrk/19314.csv". 01 lineexit. 02 lineexit-lot PIC X(5). 02 sep1 PIC X(1). 02 lineexit-cc PIC X(5). 02 sep2 PIC X(1). 02 lineexit-cle PIC X(8). 02 sep3 PIC X(1). 02 lineexit-civ PIC X(15). 02 sep4 PIC X(1). 02 lineexit-nom PIC X(40). 02 sep5 PIC X(1). 02 lineexit-pnom PIC X(40). 02 sep6 PIC X(1). 02 lineexit-voie PIC X(100). 02 sep7 PIC X(1). 02 lineexit-ldit PIC X(100). 02 sep8 PIC X(1). 02 lineexit-dpt PIC X(2). 02 sep9 PIC X(1). 02 lineexit-cocom PIC X(3). 02 sep10 PIC X(1). 02 lineexit-city PIC X(50). 02 sep11 PIC X(1). * 02 lineexit-chariot PIC X(1). FD ficentree1 LABEL RECORD STANDARD VALUE OF FILE-ID "/marketing/Fsaison88/TESTFQ". 01 ENR-LOTZ. 02 LOTZ-NOTE PIC 9(5)V99. 02 LOTZ-CLI PIC X(8). 02 LOTZ-CP Pic 9(5). 02 LOTZ-CC PIC XXX. 02 LOTZ-LOT PIC X. WORKING-STORAGE SECTION. * bibliotheque sql pour cobol Exec sql include sqlca end-exec. Exec sql begin declare section end-exec. exec sql include '/fr/cobol/fichier/client' end-exec. * debut des declaratifs sql * wdbase pour ouverture bdd et environnement de travail 01 wdbase pic x. * pour avoir message erreur avec debugage 01 ws-erreur pic -(6)9. 01 where-error pic x(72). * wscli pour numero client du fichier lot Z 01 wscli pic X(8) value space. 01 CODE-RET pic s9(9) comp-5 value 0. 01 lot PIC X(5). 01 cluck PIC X(5). * customer pour numero client de la BDD 01 customer PIC X(8). 01 civil PIC X(15). 01 famname PIC X(40). 01 firstname PIC X(40). 01 way PIC X(100). 01 lieudit PIC X(100). 01 dpt PIC X(2). 01 zip PIC X(3). 01 city PIC X(50). * fin de declaratif sql Exec sql end declare section end-exec. * declaratif des variables autres que sql 77 numcli pic x(8). 77 compteur pic 9(8) value 0 . 77 compteur2 pic 9(8) value 0 . 77 modulo pic 9(8) value 0 . 77 megachaine PIC X(2500). * debut du programme PROCEDURE DIVISION. GENERAL. * ouverture d'environnement de la bdd MOVE "R" TO WDbASE. call "opendb" using wdbase. open input ficentree1. open output ficsortie. * programme principal BLOC-MAIN. READ ficentree1 at end go to FIN-GENERAL. add 1 to compteur. display compteur. move LOTZ-CLI to wscli . display " test 2 ". PARTIESQL. * execution de code sql exec sql select * into :pclt from fr.client where pcle = :wscli end-exec. display " test 3 ". if sqlcode = 100 display " cette cliente n existe pas " wscli go to bloc-main. if sqlcode not = 0 display "erreur requete sql" go to fin-general. display " test 4 " . looping. display " test 5 ". evallot. if (LOTZ-LOT = "A") add 1 to compteur2 go to evalcomp else move LOTZ-LOT to lineexit-lot go to evalcomp. evalcomp. if (compteur2 = 15) move "Z" to lineexit-lot move 0 to compteur2 go to evalciv else move "A" to lineexit-lot go to evalciv. evalciv. if (ptit = "2" or ptit = "3") move "Madame" to lineexit-civ go to insertfic else if (ptit = "1") move "Monsieur" to lineexit-civ go to insertfic else "Mr ou Mme" to lineexit-civ go to insertfic. insertfic. move ";" to sep1 move LOTZ-CC to lineexit-cc move ";" to sep2 move pcle to lineexit-cle move ";" to sep3 move ";" to sep4 move c-nom to lineexit-nom move ";" to sep5 move c-prenom to lineexit-pnom move ";" to sep6 move prue to lineexit-voie move ";" to sep7 move pldit to lineexit-ldit move ";" to sep8 move pdpt to lineexit-dpt move ";" to sep9 move pcpres to lineexit-cocom move ";" to sep10 move ploca to lineexit-city move ";" to sep11 go to BLOC-MAIN. display " test 6 ". go to BLOC-MAIN. display " test 7 ". end-looping. go to BLOC-MAIN. display " test 8 ". FIN-BLOC-MAIN. FIN-GENERAL. CLOSE ficentree1. STOP RUN.
Avec evaluate :
Code cobol : 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 IDENTIFICATION DIVISION. PROGRAM-ID. 19314. *programme ENVIRONMENT DIVISION. CONFIGURATION SECTION. SPECIAL-NAMES. DECIMAL-POINT IS COMMA. INPUT-OUTPUT SECTION. FILE-CONTROL. * declaratif du fichier de resultat SELECT ficsortie ASSIGN TO DISK. SELECT ficentree1 ASSIGN TO DISK. DATA DIVISION. FILE SECTION. FD ficsortie LABEL RECORD STANDARD VALUE OF FILE-ID "/wrk/19314.csv". 01 lineexit. 02 lineexit-lot PIC X(5). 02 sep1 PIC X(1). 02 lineexit-cc PIC X(5). 02 sep2 PIC X(1). 02 lineexit-cle PIC X(8). 02 sep3 PIC X(1). 02 lineexit-civ PIC X(15). 02 sep4 PIC X(1). 02 lineexit-nom PIC X(40). 02 sep5 PIC X(1). 02 lineexit-pnom PIC X(40). 02 sep6 PIC X(1). 02 lineexit-voie PIC X(100). 02 sep7 PIC X(1). 02 lineexit-ldit PIC X(100). 02 sep8 PIC X(1). 02 lineexit-dpt PIC X(2). 02 sep9 PIC X(1). 02 lineexit-cocom PIC X(3). 02 sep10 PIC X(1). 02 lineexit-city PIC X(50). 02 sep11 PIC X(1). * 02 lineexit-chariot PIC X(1). FD ficentree1 LABEL RECORD STANDARD VALUE OF FILE-ID "/marketing/Fsaison88/TESTFQ". 01 ENR-LOTZ. 02 LOTZ-NOTE PIC 9(5)V99. 02 LOTZ-CLI PIC X(8). 02 LOTZ-CP Pic 9(5). 02 LOTZ-CC PIC XXX. 02 LOTZ-LOT PIC X. WORKING-STORAGE SECTION. * bibliotheque sql pour cobol Exec sql include sqlca end-exec. Exec sql begin declare section end-exec. exec sql include '/fr/cobol/fichier/client' end-exec. * debut des declaratifs sql * wdbase pour ouverture bdd et environnement de travail 01 wdbase pic x. * pour avoir message erreur avec debugage 01 ws-erreur pic -(6)9. 01 where-error pic x(72). * wscli pour numero client du fichier lot Z 01 wscli pic X(8) value space. 01 CODE-RET pic s9(9) comp-5 value 0. 01 lot PIC X(5). 01 cluck PIC X(5). * customer pour numero client de la BDD 01 customer PIC X(8). 01 civil PIC X(15). 01 famname PIC X(40). 01 firstname PIC X(40). 01 way PIC X(100). 01 lieudit PIC X(100). 01 dpt PIC X(2). 01 zip PIC X(3). 01 city PIC X(50). * fin de declaratif sql Exec sql end declare section end-exec. * declaratif des variables autres que sql 77 numcli pic x(8). 77 compteur pic 9(8) value 0 . 77 compteur2 pic 9(8) value 0 . 77 modulo pic 9(8) value 0 . 77 megachaine PIC X(2500). * debut du programme PROCEDURE DIVISION. GENERAL. * ouverture d'environnement de la bdd MOVE "R" TO WDbASE. call "opendb" using wdbase. open input ficentree1. open output ficsortie. * programme principal BLOC-MAIN. READ ficentree1 at end go to FIN-GENERAL. add 1 to compteur. display compteur. move LOTZ-CLI to wscli . display " test 2 ". PARTIESQL. * execution de code sql exec sql select * into :pclt from fr.client where pcle = :wscli end-exec. display " test 3 ". if sqlcode = 100 display " cette cliente n existe pas " wscli go to bloc-main. if sqlcode not = 0 display "erreur requete sql" go to fin-general. display " test 4 " . looping. display " test 5 ". evallot. EVALUATE LOTZ-LOT when LOTZ-LOT = "A" add 1 to compteur2 go to evalcomp when other move LOTZ-LOT to lineexit-lot go to evalcomp end-evaluate. evalcomp. EVALUATE compteur2 when compteur2 = 15 move "Z" to lineexit-lot move 0 to compteur2 go to evalciv when other move "A" to lineexit-lot evalciv end-evaluate. evalciv. EVALUATE ptit when ptit = "2" or ptit = "3" move "Madame" to lineexit-civ go to insertfic when ptit = "1" or ptit = "3" move "Monsieur" to lineexit-civ go to insertfic when other move "Mr ou Mme" to lineexit-civ go to insertfic end-evaluate. insertfic. move ";" to sep1 move LOTZ-CC to lineexit-cc move ";" to sep2 move pcle to lineexit-cle move ";" to sep3 move ";" to sep4 move c-nom to lineexit-nom move ";" to sep5 move c-prenom to lineexit-pnom move ";" to sep6 move prue to lineexit-voie move ";" to sep7 move pldit to lineexit-ldit move ";" to sep8 move pdpt to lineexit-dpt move ";" to sep9 move pcpres to lineexit-cocom move ";" to sep10 move ploca to lineexit-city move ";" to sep11 go to BLOC-MAIN. display " test 6 ". go to BLOC-MAIN. display " test 7 ". end-looping. go to BLOC-MAIN. display " test 8 ". FIN-BLOC-MAIN. FIN-GENERAL. CLOSE ficentree1. STOP RUN.
Merci de m'aiguiller
Partager