IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Cobol Discussion :

forcer execution cobol porgramme recalcitrant


Sujet :

Cobol

  1. #1
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut forcer execution cobol porgramme recalcitrant
    Bonjour,

    Comment forcer l’exécution de d'un .eco ou d'un .cob sous linux sans avoir a recharger perpétuellement le .eco ?

    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
    215
    216
    217
    218
    219
    220
    221
    222
    223
           IDENTIFICATION DIVISION.
           PROGRAM-ID. 22rfm.
    	   
          *programme 
    	  
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaratif du fichier de resultat
    	  
              SELECT ficbrut      ASSIGN TO DISK.
    		  SELECT fictri      ASSIGN TO DISK.
    		  SELECT ficfinal      ASSIGN TO DISK.
    		  
          * declaratif du fichier d entree 
                            
           DATA DIVISION.
           FILE SECTION.   
    
    	   FD  ficbrut            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/ficbrut.csv".
           01  fb.
    	       02 fb-rfm10       pic X(4).
    		   02 filler         pic X(1).
    		   02 fb-rfm8421         pic X(4).
    		   02 filler         pic X(1).
    	       02 fb-rfmpt         pic 9(3).
    		   02 filler         pic X(1).
    		   02 fb-rfmqte         pic 9(9).
    		   
    	   SD  fictri            LABEL RECORD STANDARD.
           01  ft.
    	       02 ft-rfm10       pic X(4).
    		   02 filler2         pic X(1).
    		   02 ft-rfm8421         pic X(4).
    		   02 filler2         pic X(1).
    	       02 ft-rfmpt         pic 9(3).
    		   02 filler2         pic X(1).
    		   02 ft-rfmqte         pic 9(9).
    
    	   FD  ficfinal            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/ficfinal.csv".
           01  ff.
    	       02 ff-rfm10       pic X(4).
    		   02 filler3         pic X(1).
    		   02 ff-rfm8421         pic X(4).
    		   02 filler3         pic X(1).
    	       02 ff-rfmpt         pic 9(3).
    		   02 filler3         pic X(1).
    		   02 ff-rfmqte         pic 9(9).
    
           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/22rfm' 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).  
           01  CODE-RET        pic s9(9) comp-5 value 0.
    	   
           01 numcli   PIC x(8).
           01 cdecrt   Pic 9(1) value 0.
           01 pt8   PIC 9(1) value 0.
           01 pt4   PIC 9(1) value 0.
           01 pt2   PIC 9(1) value 0.
           01 pt1   PIC 9(1) value 0.
           01 premcde      pic 9(1) value 0.
                   
          * fin de declaratif sql
    	  
               Exec sql end declare section end-exec. 
               
          * declaratif des variables autres que sql
    	  
    	   01 i pic 9(9) value 0.
    	   01 j pic 9(9) value 0.
    	   01 somme pic 9(9) value 0.
    	   01 vp8 PIC x(1).
    	   01 vp2 PIC x(1).
    	   01 vp4 PIC x(1).
    	   01 vp1 PIC x(1).
    	   01 chainerfm         PIC X(4).
    	   
    	   01 rfm10         PIC X(4) occurs 20.
           01 rfm8421       PIC X(4) occurs 20.
           01 rfmpt         pic 9(8) occurs 20 value 0.
    	   01 rfmqte        pic 9(8) occurs 20 value 0.
                      
          * debut du programme
    	  
           PROCEDURE DIVISION.
    	   
          * ouverture d'environnement de la bdd
    	  
           ouverturebdd.
    	  
                MOVE "R" TO WDbASE.
                call "opendb" using wdbase.
                
                open output ficbrut.
                open output ficfinal.	
    
          * requete sql
    	  
    	   requetesql.
    
                exec sql declare curseur cursor for     
                select *
    			from fqtrfm22318_prfm
                END-EXEC.
    			
          * envoi des donnees sql dans un curseur
          
               exec sql open curseur end-exec.
    		   
    	   looping.
    		   
         	   exec sql fetch curseur into :numcli,:cdecrt,
    		   :pt8,:pt4,:pt2,:pt1,:premcde end-exec.
    		   
               if sqlcode = 0
    		      move numcli to 22rfm-cli
    			  move cdecrt to 22rfm-cdecrt
    			  move pt8 to 22rfm-pt8
    			  move pt4 to 22rfm-pt4
    			  move pt2 to 22rfm-pt2
    			  move pt1 to 22rfm-pt1
    			  move premcde to 22rfm-premcde
    			  go to looping
    		   else
    			  go to end-looping.
     
    	   end-looping.          
    				  
    	   looping2.
    	   
         	   move 1 to i.
    		   move 0 to somme.
    		   move " " to chainerfm.
    	   
         	   exec sql fetch curseur into :numcli,:cdecrt,
    		   :pt8,:pt4,:pt2,:pt1,:premcde end-exec.
    		   
               if sqlcode = 0
    		   
    		     add pt8 to somme
    			 add pt4 to somme
    			 add pt2 to somme
    			 add pt1 to somme
    			 
    			 if pt8 = 0
    			  move "0" to vp8
    			 else move "1" to vp8.
    			 if pt4 = 0
    			  move "0" to vp4
    			 else move "1" to vp4.
    			 if pt2 = 0
    			  move "0" to vp2
    			 else move "1" to vp2.
    			 if pt1 = 0
    			  move "0" to vp1
    			 else move "1" to vp1.
    			string vp8 vp4 vp2 vp1 delimited by size 
    			into chainerfm
    			display chainerfm " " somme.		   
    			
    	   sousbouclei.
    	   
                 if (chainerfm = rfm10(i) and i < 21)
    			  add 1 to rfmqte(i)
    			  display chainerfm " t1 " rfmqte(i) 
    			  go to looping2
    			 if (chainerfm not = rfm10(i) 
    			 and rfm10(i) = space and i < 21)
    			  move chainerfm to rfm10(i)
    			  move 1 to rfmqte(i)
    			  move somme to rfmpt(i)
    			  display chainerfm " t2 " rfmqte(i) " " rfmpt(i)
    			  go to looping2
    			 if (chainerfm not = rfm10(i) 
    			 and rfm10(i) not = space and i < 21 )
    			  add 1 to i
    			  go to sousbouclei
                 if (i >= 20)			  
    			  go to looping2.
       			  
    	   end-looping2.
    	   
         	   move 1 to i.
    	   
    	   sousbouclei2.
    	   
             display " test 4 ".
    	    
    		if (i < 21)
    		 display rfm10(i) " " rfmpt(i) " " rfmqte(i)
    		 add 1 to i
    		 go to sousbouclei2.
    		if (i = 20)
    		 display " fin ".
    		
    	   end-sousbouclei2.
    	   
           CLOSE ficbrut.
           CLOSE ficfinal.
    	   
           STOP RUN.

    Mon compilateur commence sérieusement a me casser les couille , avec une une erreur qui n'existe pas sur un soit disant "go to looping2" ou "go to looping3" ...

    D’où m'a question de forcer le compilateur a s’exécuter , qui est particulièrement récalcitrant.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    il y a beaucoup de choses à dire sur ce programme

    Déjà, un select * est le plus souvent interdit et quoi qu'il en soit très fortement déconseillé : résultat instable, transport de données inutiles pénalisant les perfs...

    Ensuite, votre WSS et votre procédure sont mal écrites : pas de commentaire, des go to à tour de bras, aucun end-if...

    C'est une mauvaise idée de nommer une variable 'i' : quand on la recherche dans le code, on récupère tous les mots qui contiennent 'i', sympa les études d'impact.
    Il suffit d'appeler les indices ii, jj etc... ca facilite tellement la vie, faites un peu de maintenance, vous verrez la différence

    Dans un programme écrit correctement, il n'y a que très très rarement besoin de GO TO !

  3. #3
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    ...
    Mon compilateur commence sérieusement a me casser les couille , avec une une erreur qui n'existe pas sur un soit disant "go to looping2" ou "go to looping3" ...
    Quels sont les messages d'erreur issus du compilateur ?

  4. #4
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Bonjour
    les tests sur SQLCODE sont incomplets et, je pense, provoquent des résultats incohérents ou faux.
    La gestion des '.' est bizarre . Avec des IF imbriqués, ca ne pardonne pas.

    Il y a du taf pour faire comprendre au compilateur comment terminer le programme, surtout en cas d'erreur.

    bonne journée

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Bonjour,

    Citation Envoyé par escartefigue Voir le message
    Déjà, un select * est le plus souvent interdit et quoi qu'il en soit très fortement déconseillé : résultat instable, transport de données inutiles pénalisant les perfs...
    La table sql ou je récupère de la donnée dispose de maxi 5 a 7 colonnes. Il s'agit d'un etat fixe créé pour justement être utilisé spécifiquement pour un programme cobol. Soit c'était une requête avec des inner join sur la table elle (résultat impossible a obtenir ... ) Oracle peinait a faire la requête !

    Citation Envoyé par escartefigue Voir le message
    Ensuite, votre WSS et votre procédure sont mal écrites : pas de commentaire, des go to à tour de bras, aucun end-if...
    Comment se passer des go to alors quand on est dans un système de boucle ??? Je vous mal comment vous voulez faire ???

    Citation Envoyé par escartefigue Voir le message
    C'est une mauvaise idée de nommer une variable 'i' : quand on la recherche dans le code, on récupère tous les mots qui contiennent 'i', sympa les études d'impact.
    Il suffit d'appeler les indices ii, jj etc... ca facilite tellement la vie, faites un peu de maintenance, vous verrez la différence
    Cette "habitude" avec les i et j vient de la fac . Je vous confirme qu'on force pas mal d'étudiant a utiliser "i, j, k" souvent pour les tableaux et compteurs. Mauvaise habitude ?

    Citation Envoyé par escartefigue Voir le message
    Dans un programme écrit correctement, il n'y a que très très rarement besoin de GO TO !
    Comment se passer des go to alors quand on est dans un système de boucle ??? Je vous mal comment vous voulez faire ???

    Citation Envoyé par Luc Orient Voir le message
    Quels sont les messages d'erreur issus du compilateur ?
    Lors du lancement du programme il y avait une erreur DVMS 7 ou 8 qui pointait sur un "go to looping".

    Citation Envoyé par bernard59139 Voir le message
    les tests sur SQLCODE sont incomplets et, je pense, provoquent des résultats incohérents ou faux.
    La gestion des '.' est bizarre . Avec des IF imbriqués, ca ne pardonne pas.
    Dans les programmes que je récupère je vois beaucoup de "if sqlcode not = 0" ou bien du " if sqlcode = 100 " . Dans de la doc ils mettent carrement " < 0 " voir " > 0 " . Je sèche ne voit pas l'utilité d'autant de code erreur ???

    J'ai refait de la maintenance avec des étiquettes et du commentaire .

    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
    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
           IDENTIFICATION DIVISION.
           PROGRAM-ID. 22rfm.
    	   
          *programme 
    	  
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
           SPECIAL-NAMES.
               DECIMAL-POINT IS COMMA.
           INPUT-OUTPUT SECTION.
           FILE-CONTROL.
    
          * declaration des fichiers en sortie
    	  
                  SELECT ficbrut      ASSIGN TO DISK.
    		      SELECT fictri      ASSIGN TO DISK.
    		      SELECT ficfinal      ASSIGN TO DISK.
    		  
          * declaration des fichiers en entree 
                            
           DATA DIVISION.
           FILE SECTION.   
    
    	   FD  ficbrut            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/ficbrut.csv".
           01  fb.
    	         02 fb-rfm10       pic X(4).
    		     02 filler         pic X(1).
    		     02 fb-rfmqte         pic 9(9).
    		   
    	   SD  fictri            LABEL RECORD STANDARD.
           01  ft.
    	         02 ft-rfm10       pic X(4).
    		     02 filler2         pic X(1).
    		     02 ft-rfmqte         pic 9(9).
    
    	   FD  ficfinal            LABEL RECORD STANDARD
               VALUE OF FILE-ID "/wrk/ficfinal.csv".
           01  ff.
    	         02 ff-rfm10       pic X(4).
    		     02 filler3         pic X(1).
    		     02 ff-rfmqte         pic 9(9).
    
           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/22rfm' end-exec.
          
          * wdbase pour ouverture de la bdd et de l environnement de 
          * travail
    	  
           01  wdbase          pic x.
    	   
          * variable de gestion des codes erreur et debugage
    	  
           01  ws-erreur       pic -(6)9.
           01  where-error     pic x(72).  
           01  CODE-RET        pic s9(9) comp-5 value 0.
           
          * variables liees a la recuperation de donnees dans 
          * des requetes sql
    	   
           01 numcli   PIC x(8).
           01 ladate   pic x(8).
           01 cdepe19 pic x.
           01 cdeah18 pic x.
           01 cdepe18 pic x.
           01 cdeah17 pic x.
           01 cdepe17 pic x.
           
          * fin des declarations sql
    	  
                Exec sql end declare section end-exec. 
               
          * declarations des variables autres que celles en lien
          * avec le sql
    	  
    	   01 i pic 9(9) value 0.
           01 chainerfm         PIC X(4).
    	   
    	   01 rfm10tab         PIC X(4) occurs 18.
    	   01 rfmqtetab        pic 9(8) occurs 18 value 0.
                      
          * debut du programme
    	  
           PROCEDURE DIVISION. 
    	   
          * ouverture d'une connexion avec la bdd
    	  
           ouverturebdd.
    	  
                MOVE "R" TO WDbASE.
                call "opendb" using wdbase.
    
          * requete sql pour recuperer les donnees dans la BDD
    	  
    	   requetesql.
    
                exec sql declare curseurcli cursor for     
                select afcli , afdatci
                from frdy.nwfmark
                where afcli is not null
                and afsdat1 > 20161231			      
                END-EXEC.
    			
          * envoi des donnees de la requete sql dans un curseur
          
                exec sql open curseurcli end-exec.
               
                if sqlcode not = 0 
                display " erreur open "
                go to stoppgm.
    			
          * creation d'une boucle de parcours du curseur
    		   
    	   looping.
          
          * parcours client apres client via un fetch pour recuperer 
    	  * la donnee du curseur
    
                 exec sql fetch curseurcli into :numcli,:ladate
                 end-exec.
                 if sqlcode = 100
                 go to end-looping.
                 if sqlcode not = 0 
                 display "erreur lecture curseur"
                 go to stoppgm.               
    
          * on regarde si le client a commande dans la periode
          * actuelle (pe19)
    
                  exec sql
                  select case when :numcli in ( select c1clte
                                                from fr.comande1
                                                where c1datcde
                                                between 
    											20190101 and 20190630) 
    											then '1'
                                                else '0'
                                                end into :cdepe19
                  from dual 
                  END-EXEC.
            
             if sqlcode not = 0
             display " erreur lecteur pe19 "
             go to stoppgm.
    
          * on regarde si le client a commande dans la periode ah18
    
                  exec sql 
                  select case when :numcli in ( select c1clte
                                                from fr.comande1
                                                where c1datcde
                                                between 
    											20180701 and 20181231) 
    											then '1'
                                                else '0'
                                                end into :cdeah18
                  from dual
                  END-EXEC.
    
             if sqlcode not = 0
             display " erreur lecteur ah18 "
             go to stoppgm.
    
          * on regarde si le client a commande dans la periode pe18  
     
                  exec sql 
                  select case when :numcli in ( select c1clte
                                                from fr.comande1
                                                where c1datcde
                                                between 
    											20180101 and 20180630) 
    											then '1'
                                                else '0'
                                                end into :cdepe18
                  from dual
                  END-EXEC.     
    
             if sqlcode not = 0
             display " erreur lecteur pe18 "
             go to stoppgm.
    
          * on regarde si le client a commande dans la periode ah17
    
                  exec sql
                  select case when :numcli in ( select c1clte
                                                from fr.comande1
                                                where c1datcde
                                                between 
    											20170701 and 20171231) 
    											then '1'
                                                else '0'
                                                end into :cdeah17
                  from dual
                  END-EXEC.
    
             if sqlcode not = 0
             display " erreur lecteur ah17 "
             go to stoppgm.
    
          * on regarde si le client a commande dans la periode pe17
    
                  exec sql
                  select case when :numcli in ( select c1clte
                                                from fr.comande1
                                                where c1datcde
                                                between 
    											20170101 and 20170630) 
    											then '1'
                                                else '0'
                                                end into :cdepe17
                  from dual
                  END-EXEC. 
        
             if sqlcode not = 0
             display " erreur lecteur pe17 "
             go to stoppgm.
    
          * concatenation des 1 et 0 pour avoir une rfm
            
              string cdeah18 cdepe18 cdeah17 cdepe17 delimited by 
    		  size into chainerfm.
    		  
          * traitement des cas des nouveaux , des relances , 
    	  * des bas de fichiers
    
             if (chainerfm = '1000')
              go to traite8.
             if (chainerfm = '0000')
              go to traite0.
    
             go to traitement.
    
           traite8.
            if ladate > 20180630
             move '8N  ' to chainerfm
            else move '8R  ' to chainerfm.
            go to traitement.
              
           traite0.
            if ladate > 20181231
             move 'NX  ' to chainerfm
            else move 'BF  ' to chainerfm.
            go to traitement.
    
           traitement.
    	   
          * mise a 1 du compteur i avec lancement d'une sous boucle	   
    
             move 1 to i.
    		 
          * sous boucle de comptage de chaque cas de la rfm			 
       
           sousbouclei.          
              
               if (chainerfm = rfm10tab(i))
                add 1 to rfmqtetab(i)
                go to end-bouclei.
               if ( rfm10tab(i) = space )
                move chainerfm to rfm10tab(i)
    			move 1 to rfmqtetab(i)
    	        go to end-bouclei.
               add 1 to i.
               if ( i > 18)
                display " erreur depasse risque boucle infini"
                go to stoppgm.
               go to sousbouclei.
                
           end-bouclei.
    	   
                go to looping.
    			
           end-looping.
    	   
          * sous boucle d'affichage du tableau de comptage de la rfm
           
             move 1 to i.
           
           sousbouclei2.
           
               if( i < 19)
                  display " rfm : " rfm10tab(i) " quantite " 
                  rfmqtetab(i)
                  add 1 to i
                  go to sousbouclei2.
               if (i >18)
                  go to end-sousbouclei2.
                
           end-sousbouclei2. 
    
           stoppgm.
    	   
           STOP RUN.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Pour remplacer les GO TO il faut faire des PERFORM paragraphe.

  7. #7
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    La table sql ou je récupère de la donnée dispose de maxi 5 a 7 colonnes. Il s'agit d'un etat fixe créé pour justement être utilisé spécifiquement pour un programme cobol. Soit c'était une requête avec des inner join sur la table elle (résultat impossible a obtenir ... ) Oracle peinait a faire la requête !
    Le truc, c'est aussi un problème de maintenance. En COBOL, on part du principe que les programmes vont durer trèèèèèès longtemps. Le jour ou on ajoute un champ à la table, tout est planté. Alors que si on sa préalablement pris la peine de choisir à la main les champs qu'on veut, le nouveau champ, on ne va même pas le remarquer. ça évite les plantages dans l'avenir.

    Citation Envoyé par tanaka59 Voir le message
    Comment se passer des go to alors quand on est dans un système de boucle ??? Je vous mal comment vous voulez faire ???
    Une boucle, ça se fait avec des PERFORM. PERFORM VARYING, PERFORM UNTIL, ou PERFORM 1000 TIMES(que je déteste, mais c'est toujours plus propre que des go to)

    Citation Envoyé par tanaka59 Voir le message
    Cette "habitude" avec les i et j vient de la fac . Je vous confirme qu'on force pas mal d'étudiant a utiliser "i, j, k" souvent pour les tableaux et compteurs. Mauvaise habitude ?
    à la fac, ils n'ont pas l'habitude de gérer des applis aussi massives qu'en production. Moi, j'en suis arrivé à faire des variables de comptage spécifiques par tableau. C'est lourdingue, mais à la maintenance, on sait de quoi ça parle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PERFORM VARYING client_pos FROM client_min BY 1 UNTIL client_pos GREATER THAN client_max
    (.../...)
    END-PERFORM
    C'eszt verbeux, chiant à écrire, mais bien plus lisible qu'un misérable for(i=1,i++,9999), quand on retombe dessus 5 ans plus tard.

    Citation Envoyé par tanaka59 Voir le message
    Comment se passer des go to alors quand on est dans un système de boucle ??? Je vous mal comment vous voulez faire ???
    Le seul Go To qui est parfois autorisé, c'est le GO TO FIN_DE_PARAGRAPHE. Tu triches un peu dans ta nouvelle version avec le GO TO FIN_DE_PROGRAMME, qui est une rupture du flux du traitement, mais quand même bien plus acceptable que tes GO TO de boucle.

    Idéalement, en fait, un programme bien structuré, commence par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE DIVISION.
        PERFORM INITIALISATIONS
        PERFORM TRAITEMENT_PRINCIPAL
        PERFORM TRAITEMENT_CLOTURE
        .
        STOP RUN
        .
    Dans tes initialisations, aux final, tu aurais des choses de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PERFORM      PREMIERE_REQUETE_SQL
    IF mon_code_retour_OK
         PERFORM DEUXIEME_REQUETE_SQL
    END_IF
    IF mon_code_retour_OK
         PERFORM TROISIEME_REQUETE_SQL
    END_IF
    avec en lieu et place de tes GOTO FIN_DE_PROGRAMME une ligne qui te mets le booleen de MON_CODE_RETOUR à KO si le retour ne te plait pas.

    Citation Envoyé par tanaka59 Voir le message
    Dans les programmes que je récupère je vois beaucoup de "if sqlcode not = 0" ou bien du " if sqlcode = 100 " . Dans de la doc ils mettent carrement " < 0 " voir " > 0 " . Je sèche ne voit pas l'utilité d'autant de code erreur ???
    Ca dépend des maisons, ça. Suivant la manière don fonctionne l'exploitation, il faut en mettre ou pas. D'une manière générale, si l'exploitation veut elle-même gérer les codes SQL, alors il faut être auss light que possible pour laisser la main aux gens qui font l'exécution. En revanche, dans des structures plus devops, ou le dev intervient en cas de plantage, des gestion d'erreurs aux petits oignons permettent de mieux comprendre ce qui ne va pas - du point de vue du développeur. C'est un choix à faire pour toute la boite, généralement. Su tu est dans une petite structure et exécutes toi-même le job, tu sentiras tôt ou tard le besoin d'un traitement d'erreur plus fouillé.

    Citation Envoyé par tanaka59 Voir le message
    J'ai refait de la maintenance avec des étiquettes et du commentaire .
    Autre remarque, ton style n'est pas uniforme. parfois, les mots clefs sont en majuscules, parfois en minuscules, de même pour tes labels et tes variables. Ca aussi, ça a des impacts à long terme sur la lisibilité et la maintenance. Il n'y a pas de doctrine meilleure que les autres(tu aurais remarqué que je suis un grand fan des mots clefs et des labels en majuscules), mais il faut se tenir à une doctrine précise, le confort de lecture, c'est important.

    Bon, ça passe bien après tout le reste, hein, mais un programme avec une bonne cohérence visuelle, c'est beaucoup plus plaisant pour bosser dessus.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Bonjour

    Citation Envoyé par Darkzinus Voir le message
    Pour remplacer les GO TO il faut faire des PERFORM paragraphe.
    Tu préconises des fonctions/procédure/macro/sous programme en somme ? Pas trop complexe en terme de maintenance ?

    Citation Envoyé par el_slapper Voir le message
    Le truc, c'est aussi un problème de maintenance. En COBOL, on part du principe que les programmes vont durer trèèèèèès longtemps. Le jour ou on ajoute un champ à la table, tout est planté. Alors que si on sa préalablement pris la peine de choisir à la main les champs qu'on veut, le nouveau champ, on ne va même pas le remarquer. ça évite les plantages dans l'avenir.
    En dès que je rencontre du cobol ou qu'un process doit être développé dans ce langue le premier réflexe c'est >> à maintenir dans le temps , genre 10 ans ?

    Citation Envoyé par el_slapper Voir le message
    Une boucle, ça se fait avec des PERFORM. PERFORM VARYING, PERFORM UNTIL, ou PERFORM 1000 TIMES(que je déteste, mais c'est toujours plus propre que des go to)
    Je vais chercher des modèles

    Citation Envoyé par el_slapper Voir le message
    à la fac, ils n'ont pas l'habitude de gérer des applis aussi massives qu'en production. Moi, j'en suis arrivé à faire des variables de comptage spécifiques par tableau. C'est lourdingue, mais à la maintenance, on sait de quoi ça parle.
    La fac a la quelle j'étais avait pour habitude de nous dire > utilisez des if/else if . Désolé dans le monde du travail le "case" est bien plus simple . Cas 1 , 2 , 3 ...

    Citation Envoyé par el_slapper Voir le message
    C'eszt verbeux, chiant à écrire, mais bien plus lisible qu'un misérable for(i=1,i++,9999), quand on retombe dessus 5 ans plus tard.
    Difficile de juger à mon niveau ... je suis junior et je n'ai jamais fait ce type de structure en cobol . Je ferai un test un jour pour voir la performance.

    Citation Envoyé par el_slapper Voir le message
    Le seul Go To qui est parfois autorisé, c'est le GO TO FIN_DE_PARAGRAPHE. Tu triches un peu dans ta nouvelle version avec le GO TO FIN_DE_PROGRAMME, qui est une rupture du flux du traitement, mais quand même bien plus acceptable que tes GO TO de boucle.
    Oui je confirme j'ai déjà du mal à localiser une boucle infini ... a cause d'un go to et d'une erreur dans un signe </> !

    [QUOTEel_slapper;10852026]Idéalement, en fait, un programme bien structuré, commence par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE DIVISION.
        PERFORM INITIALISATIONS
        PERFORM TRAITEMENT_PRINCIPAL
        PERFORM TRAITEMENT_CLOTURE
        .
        STOP RUN
        .
    Dans tes initialisations, aux final, tu aurais des choses de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PERFORM      PREMIERE_REQUETE_SQL
    IF mon_code_retour_OK
         PERFORM DEUXIEME_REQUETE_SQL
    END_IF
    IF mon_code_retour_OK
         PERFORM TROISIEME_REQUETE_SQL
    END_IF
    avec en lieu et place de tes GOTO FIN_DE_PROGRAMME une ligne qui te mets le booleen de MON_CODE_RETOUR à KO si le retour ne te plait pas.[/QUOTE]

    A oui je cela c'est déjà plus propre

    [QUOTEel_slapper;10852026]Ca dépend des maisons, ça. Suivant la manière don fonctionne l'exploitation, il faut en mettre ou pas. D'une manière générale, si l'exploitation veut elle-même gérer les codes SQL, alors il faut être auss light que possible pour laisser la main aux gens qui font l'exécution. En revanche, dans des structures plus devops, ou le dev intervient en cas de plantage, des gestion d'erreurs aux petits oignons permettent de mieux comprendre ce qui ne va pas - du point de vue du développeur. C'est un choix à faire pour toute la boite, généralement. Su tu est dans une petite structure et exécutes toi-même le job, tu sentiras tôt ou tard le besoin d'un traitement d'erreur plus fouillé.[/QUOTE]

    Je prend note du conseil.

    [QUOTEel_slapper;10852026]Autre remarque, ton style n'est pas uniforme. parfois, les mots clefs sont en majuscules, parfois en minuscules, de même pour tes labels et tes variables. Ca aussi, ça a des impacts à long terme sur la lisibilité et la maintenance. Il n'y a pas de doctrine meilleure que les autres(tu aurais remarqué que je suis un grand fan des mots clefs et des labels en majuscules), mais il faut se tenir à une doctrine précise, le confort de lecture, c'est important.

    Bon, ça passe bien après tout le reste, hein, mais un programme avec une bonne cohérence visuelle, c'est beaucoup plus plaisant pour bosser dessus.[/QUOTE]

    N'ayant jamais fait de programme pour du massif (toujours des truc ponctuels) , je t'avouerai que je tiens rarement compte des majuscules ou minuscules ...

  9. #9
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    en gros d'accord avec tes réponses. Je ne sais pas ce qui a provoqué chez toi cette phrase, mais elle me plait bien :

    Citation Envoyé par tanaka59 Voir le message
    (.../...)La fac a la quelle j'étais avait pour habitude de nous dire > utilisez des if/else if . Désolé dans le monde du travail le "case" est bien plus simple . Cas 1 , 2 , 3 ...(.../...)
    En COBOL, ça s'écrirait comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    EVALUATE TRUE
        WHEN maDonnee = 1
             (.../...)
        WHEN maDonnee = 2
             (.../...)
        WHEN maDonnee = 3
             (.../...)
    END-EVALUATE
    Ou alors EVALUATE maDonnee directement, si les conditions sont très simples.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    3 064
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 064
    Points : 4 605
    Points
    4 605
    Par défaut
    Bonsoir

    Citation Envoyé par el_slapper Voir le message
    en gros d'accord avec tes réponses. Je ne sais pas ce qui a provoqué chez toi cette phrase, mais elle me plait bien :
    Que veux tu dire par la ? Un décalage entre formation et besoin professionnel ?

    Citation Envoyé par el_slapper Voir le message
    En COBOL, ça s'écrirait comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    EVALUATE TRUE
        WHEN maDonnee = 1
             (.../...)
        WHEN maDonnee = 2
             (.../...)
        WHEN maDonnee = 3
             (.../...)
    END-EVALUATE
    Ou alors EVALUATE maDonnee directement, si les conditions sont très simples.
    Effectivement simple et efficace ...

  11. #11
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 803
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 803
    Points : 32 058
    Points
    32 058
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    (.../...)
    Que veux tu dire par la ? Un décalage entre formation et besoin professionnel ?
    (.../...)
    les deux : non seulement ça, mais aussi la supériorité du case(qui ne s'appelle pas case en COBOL, mais c'est pareil) sur le else if. Et qu'on ne me parle pas de performances - c'est typiquement le genre de domaines ou les compilateurs modernes excellent.
    Les 4 règles d'airain du développement informatique sont, d'après Michael C. Kasten :
    1)on ne peut pas établir un chiffrage tant qu'on a pas finalisé la conception
    2)on ne peut pas finaliser la conception tant qu'on a pas complètement compris toutes les exigences
    3)le temps de comprendre toutes les exigences, le projet est terminé
    4)le temps de terminer le projet, les exigences ont changé
    Et le serment de non-allégiance :
    Je promets de n’exclure aucune idée sur la base de sa source mais de donner toute la considération nécessaire aux idées de toutes les écoles ou lignes de pensées afin de trouver celle qui est la mieux adaptée à une situation donnée.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    Novembre 2012
    Messages
    1 767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2012
    Messages : 1 767
    Points : 10 764
    Points
    10 764
    Par défaut
    Citation Envoyé par el_slapper Voir le message
    les deux : non seulement ça, mais aussi la supériorité du case(qui ne s'appelle pas case en COBOL, mais c'est pareil) sur le else if. Et qu'on ne me parle pas de performances - c'est typiquement le genre de domaines ou les compilateurs modernes excellent.
    Tout à fait ! Et pourtant on voit encore dans des nouveaux développements des IF ELSE en cascade qui, même correctement indentés (avec les END-IF qui vont bien), piquent les yeux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/10/2008, 22h17
  2. Réponses: 6
    Dernier message: 07/09/2007, 13h56
  3. Forcer la fin de l'execution d'une fonction
    Par Valkirion dans le forum C++
    Réponses: 7
    Dernier message: 10/08/2007, 14h32
  4. forcer le telechargement d'un executable
    Par dev-man dans le forum Général Conception Web
    Réponses: 8
    Dernier message: 14/03/2006, 18h09
  5. comment forcer l'execution javascript
    Par jj del amorozo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/03/2006, 17h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo