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 :

Evaluate VS if/else if


Sujet :

Cobol

  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 755
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 755
    Points : 1 889
    Points
    1 889
    Par défaut Evaluate VS if/else if
    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

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 370
    Points : 8 610
    Points
    8 610
    Par défaut
    Bonjour, il y a une petite erreur de syntaxe.

    Remplace :

    when compteur2 = 15 par when 15
    when ptit = "2" or ptit = "3" par When "2" When "3"

    Pour résumer si tu fais Evaluate "nom de variable" dans le WHEN tu spécifies les valeurs (sans rappeler la variable qui est déjà définie dans l'EVALUATE).

    Sinon tu fais un EVALUATE TRUE (sans nom de variable) et là pour chaque WHEN tu spécifies les conditions du type WHEN A= "ALPHA" AND B = "BETA".

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 755
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 755
    Points : 1 889
    Points
    1 889
    Par défaut
    Bonjour,

    Citation Envoyé par Darkzinus Voir le message
    Bonjour, il y a une petite erreur de syntaxe.

    Remplace :

    when compteur2 = 15 par when 15
    when ptit = "2" or ptit = "3" par When "2" When "3"

    Pour résumer si tu fais Evaluate "nom de variable" dans le WHEN tu spécifies les valeurs (sans rappeler la variable qui est déjà définie dans l'EVALUATE).

    Sinon tu fais un EVALUATE TRUE (sans nom de variable) et là pour chaque WHEN tu spécifies les conditions du type WHEN A= "ALPHA" AND B = "BETA".
    Merci de votre retour je corrige la chose .

    Dem mon côté j'ai encore trouvé des erreurs dans les 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
    evallot.
               if (LOTZ-LOT = "A")
                add 1 to compteur2
                display " compteur2 " compteur2
                go to evalcomp
               else move LOTZ-LOT to lineexit-lot
               display " lot : "  lineexit-lot
               go to evalcomp.
               
           evalcomp.
               if (compteur2 = 15 and LOTZ-LOT = "A")
                move "Z" to lineexit-lot
                move 0 to compteur2
                display " lot : " lineexit-lot
                display " compteur2 " compteur2
                go to evalciv
               else if (compteur2 not = 15 and LOTZ-LOT = "A")
                    move "A" to lineexit-lot
                    display " lot : " lineexit-lot
                    go to evalciv.
                 
           evalciv.
               if (ptit = "2" or ptit = "3")      
                move "Madame" to lineexit-civ
                display " civilite : "  lineexit-civ
                go to insertfic
               else if (ptit = "1")
                move "Monsieur" to lineexit-civ
                display " civilite : "  lineexit-civ
                go to insertfic
                    else move "Mr ou Mme" to lineexit-civ
                    display " civilite : "  lineexit-civ
                    go to insertfic.

    Il manquait un move to et une erreur de logique dans l’algorithme .

    Je corrige et fait un retour pour le " Evaluate "

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 370
    Points : 8 610
    Points
    8 610
    Par défaut
    Un conseil de programmation pour la lisibilité du code, toujours fermer un IF par un END-IF (les fermetures par les "." sont dangereuses) et préférer des perform au lieu des go to. Dans ce cas on va systématiquement au paragraphe suivant donc on n'a rien à mettre (pas besoin du go to) il suffit que plus haut les paragraphes soient appelés les uns à la suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    evalcomp.
               if compteur2 = 15 and LOTZ-LOT = "A"
    
    move "Z" to lineexit-lot move 0 to compteur2 display " lot : " lineexit-lot display " compteur2 " compteur2
    else
    move "A" to lineexit-lot display " lot : " lineexit-lot
    end-if.

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

    Informations forums :
    Inscription : décembre 2007
    Messages : 5 855
    Points : 26 703
    Points
    26 703
    Par défaut
    Citation Envoyé par Darkzinus Voir le message
    (.../....)
    Voire, encore plus extrême :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    evalcomp.
               if compteur2 = 15 and LOTZ-LOT = "A"
                 move    "Z"        to lineexit-lot
                 move     0         to compteur2
                 display " lot : "     lineexit-lot
                 display " compteur2 " compteur2
               else                 
                 move    "A"        to lineexit-lot
                 display " lot : "     lineexit-lot
               end-if
               .
    Avec un seul point par paragraphe, tout à la fin. C'est le plus sécurisé que j'aie croisé.
    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.

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 370
    Points : 8 610
    Points
    8 610
    Par défaut
    Citation Envoyé par el_slapper Voir le message

    Avec un seul point par paragraphe, tout à la fin. C'est le plus sécurisé que j'aie croisé.
    Effectivement c'est quelque chose que je faisais systématiquement sur un ancien site. On peut éventuellement précéder le '.' d'un exit pour faciliter le débogage (on peut ainsi mettre un point d'arrêt à cet endroit).

  7. #7
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 881
    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 : 4 881
    Points : 13 669
    Points
    13 669
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Darkzinus Voir le message
    Un conseil de programmation pour la lisibilité du code, toujours fermer un IF par un END-IF (les fermetures par les "." sont dangereuse) et préférer des perform au lieu des go to. Dans ce cas on va systématiquement au paragraphe suivant donc on n'a rien à mettre (pas besoin du go to) il suffit que plus haut les paragraphes soient appelés les uns à la suite.
    J'ai pratiqué le COBOL pendant de longues années et sauf erreur de ma part, je n'ai utilisé qu'une seule fois le "GO TO", par ce qu'à l'époque il n'y avait pas d'évaluate ni de end-if, une matrice de décision complexe méritait donc de sortir d'un paragraphe par anticipation plutôt que de passer par une batterie de tests inutiles une fois qu'on avait vérifié le cas souhaité.

    De nos jours non seulement ces contingences ont sauté mais aussi les CPU sont autrement taillées et n'ont plus peur de quelques lignes de code inutiles. Donc oubliez définitivement les GO TO destructurants.
    Un programme qui dit ce qu'il faut faire (perform) est bien plus facile à comprendre qu'un autre qui dit par où il faut passer (GO TO).

    Quand à la ponctuation unique de fin de paragraphe elle est effectivement recommandée, ça évite bien des erreurs !

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    janvier 2011
    Messages
    1 755
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : janvier 2011
    Messages : 1 755
    Points : 1 889
    Points
    1 889
    Par défaut
    Bonjour,

    Citation Envoyé par Darkzinus Voir le message
    Un conseil de programmation pour la lisibilité du code, toujours fermer un IF par un END-IF (les fermetures par les "." sont dangereuses) et préférer des perform au lieu des go to. Dans ce cas on va systématiquement au paragraphe suivant donc on n'a rien à mettre (pas besoin du go to) il suffit que plus haut les paragraphes soient appelés les uns à la suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    evalcomp.
               if compteur2 = 15 and LOTZ-LOT = "A"
    
    move "Z" to lineexit-lot move 0 to compteur2 display " lot : " lineexit-lot display " compteur2 " compteur2
    else
    move "A" to lineexit-lot display " lot : " lineexit-lot
    end-if.
    Je prend note du "placement" des balises artificielles à mettre.

    Citation Envoyé par el_slapper Voir le message
    Voire, encore plus extrême :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    evalcomp.
               if compteur2 = 15 and LOTZ-LOT = "A"
                 move    "Z"        to lineexit-lot
                 move     0         to compteur2
                 display " lot : "     lineexit-lot
                 display " compteur2 " compteur2
               else                 
                 move    "A"        to lineexit-lot
                 display " lot : "     lineexit-lot
               end-if
               .
    Avec un seul point par paragraphe, tout à la fin. C'est le plus sécurisé que j'aie croisé.
    Je prend note de la remarque .

    Citation Envoyé par Darkzinus Voir le message
    Effectivement c'est quelque chose que je faisais systématiquement sur un ancien site. On peut éventuellement précéder le '.' d'un exit pour faciliter le débogage (on peut ainsi mettre un point d'arrêt à cet endroit).
    Je prend note de l'info.

    Citation Envoyé par escartefigue Voir le message
    J'ai pratiqué le COBOL pendant de longues années et sauf erreur de ma part, je n'ai utilisé qu'une seule fois le "GO TO", par ce qu'à l'époque il n'y avait pas d'évaluate ni de end-if, une matrice de décision complexe méritait donc de sortir d'un paragraphe par anticipation plutôt que de passer par une batterie de tests inutiles une fois qu'on avait vérifié le cas souhaité.

    De nos jours non seulement ces contingences ont sauté mais aussi les CPU sont autrement taillées et n'ont plus peur de quelques lignes de code inutiles. Donc oubliez définitivement les GO TO destructurants.
    Un programme qui dit ce qu'il faut faire (perform) est bien plus facile à comprendre qu'un autre qui dit par où il faut passer (GO TO).

    Quand à la ponctuation unique de fin de paragraphe elle est effectivement recommandée, ça évite bien des erreurs !
    Effectivement le maniement des go to est assez dangereux.

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

Discussions similaires

  1. [CR10] Fonction evaluate time
    Par speed034 dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 15/10/2004, 15h06
  2. Evaluation d'un nom de fonction
    Par uaz dans le forum Général Python
    Réponses: 1
    Dernier message: 04/08/2004, 11h16
  3. [CR 7] [débutante] pb avec if then else
    Par xs_nady dans le forum Formules
    Réponses: 8
    Dernier message: 28/05/2004, 15h36
  4. Un outil pour evaluer les dépendances
    Par karbone dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 30/03/2004, 14h36
  5. Evaluation d’expression
    Par mobisky dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 09/09/2002, 11h56

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