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

Contribuez Discussion :

estUneDate [Sources]


Sujet :

Contribuez

  1. #1
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut estUneDate
    Bonjour,

    Voici un petit programme que j'ai fait pour vérifier si une date saisie est "correcte"

    Le programme prend en entrée une saisie de type JJ-MM-AAAA et retourne la valeur 1 si la date est invalide, 0 sinon.

    Le programme vérifie que chaque attribut de la date est un numérique.
    Si l'année est bissextile ou non et ensuite, vérifie que le mois et le jour concordent.

    ___

    Si vous avez des améliorations à apporter (et je sais qu'il y en a un paquet) , elles seront les bienvenues

    ___

    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
                **************************************************************************
          *0011111111112222222222333333333344444444445555555555666666666677*7777777*
          *8901234567890123456789012345678901234567890123456789012345678901*3456789*
          **************************************************************************
           IDENTIFICATION DIVISION.
           PROGRAM-ID. estUneDate.
           AUTHOR. Deallyra.
           DATE-WRITTEN. 14-03-2009.
           DATE-COMPILED. 14-03-2009.
           
          *    ***************
          *    VERIFICATION D'UNE DATE
          *    ***************
          
           ENVIRONMENT DIVISION.
           DATA DIVISION.
           WORKING-STORAGE SECTION.
          *    Structure temporaire vérifiant numéricité
               01 W-DATE2.
                 02 W-JOUR2 PIC XX.
                 02 FILLER PIC X.
                 02 W-MOIS2 PIC XX.
                 02 FILLER PIC X.
                 02 W-ANNEE2 PIC X(4).
                 
          *    Structure temporaire numérique
               01 W-DATE-N.
                 02 W-JOUR-N PIC 99.
                 02 FILLER PIC X.
                 02 W-MOIS-N PIC 99.
                 02 FILLER PIC X.
                 02 W-ANNEE-N PIC 9(4).
                 
          *       
               77 W-CNT PIC 9.
               77 W-BISSEXTILE PIC X.
                 88 W-BISSEXTILE-VRAI VALUE "V".
                 88 W-BISSEXTILE-FAUX VALUE "F".
               
          *    Variables de calcul
               77 W-ANNEE-DIVIDE PIC 9999V99.
               77 W-ANNEE-TRUNC PIC 9999.
          
          *     
               01 W-EST-NUMERIQUE PIC 9.
               
           LINKAGE SECTION.
          *    Une date
               01 W-DATE.
                 02 W-JOUR PIC XX.
                 02 FILLER PIC X.
                 02 W-MOIS PIC XX.
                 02 FILLER PIC X.
                 02 W-ANNEE PIC X(4).
          *    Le résultat
               01 W-INVALIDE PIC 9.
               01 W-NUMERIQUE PIC 9(10).
          *************************************************************************      
          *0011111111112222222222333333333344444444445555555555666666666677*7777777*
          *8901234567890123456789012345678901234567890123456789012345678901*3456789*
          **************************************************************************
           PROCEDURE DIVISION USING W-DATE W-INVALIDE.
          
          *    ***************
          *    Spécifiations fonctionnelles
          *
          *    La date passée en paramètre est controlée sur sa pertinence.
          *    Est ce que cette date peut être trouvée dans le calendrier?
          *
          *    W-DATE               Input
          *      La date que l'on reçoit en paramètre.
          *      Sera d'abord testé l'année puis le mois et enfin le jour.
          *    W-INVALIDE
          *      1 si la date est invalide
          *      0 sinon.
          *      Dès qu'une partie de la date est invalide
          *        le programme s'arrête et renvoie 1, invalide.
          *    ***************
           DEBUT.
          
          *    On considère la date comme étant invalide.
               MOVE 1 TO W-INVALIDE
               PERFORM VERIFIER-NUMERIQUE
               PERFORM BISSEXTILE
               PERFORM DATE-VALIDE
               PERFORM FIN-PROGRAMME
           FIN.
           
           VERIFIER-NUMERIQUE.
          *    ***************
          *    Est ce que la date est pourvue de chiffres seulement, à
          *      l'exception des tirets séparant jour mois et année ?
          *    ***************
          
          *  On vérifie l'année
          *     INSPECT W-ANNEE REPLACING LEADING  ' ' BY '0'
          *     MOVE FUNCTION REVERSE(W-ANNEE) TO W-ANNEE2
          *     MOVE 0 TO W-CNT
          *     INSPECT W-ANNEE2 TALLYING W-CNT FOR LEADING SPACE
          *     COMPUTE W-CNT = LENGTH OF W-ANNEE - W-CNT
          *     IF W-ANNEE(1:W-CNT) IS NOT NUMERIC THEN
          *       PERFORM FIN-PROGRAMME
          *     END-IF
               CALL "estUnNumerique" USING
                 BY CONTENT W-ANNEE,
                 BY REFERENCE W-EST-NUMERIQUE W-NUMERIQUE.
               IF W-EST-NUMERIQUE EQUAL 1 THEN
                 PERFORM FIN-PROGRAMME
               END-IF
          *  On vérifie le mois
               CALL "estUnNumerique" USING
                 BY CONTENT W-MOIS,
                 BY REFERENCE W-EST-NUMERIQUE W-NUMERIQUE.
               IF W-EST-NUMERIQUE EQUAL 1 THEN
                 PERFORM FIN-PROGRAMME
               END-IF
          *  On vérifie le jour
               CALL "estUnNumerique" USING
                 BY CONTENT W-JOUR,
                 BY REFERENCE W-EST-NUMERIQUE W-NUMERIQUE.
               IF W-EST-NUMERIQUE EQUAL 1 THEN
                 PERFORM FIN-PROGRAMME
               END-IF
           FIN-VERIFIER-NUMERIQUE.
               EXIT.
           
           BISSEXTILE.
          *    ***************
          *    Est ce une année BISSEXTILE ?
          *      Divisible par 4 mais non divisible par 100 sauf si
          *        également divisible par 400
          *    ***************
          	Si (annee/4) n'est pas un entier Alors
    		estBissextile = faux
    		Si (annee/100) n'est pas un entier Alors
    			Si (annee/400) n'est pas un entier Alors
    				estBissextile := faux
    			Sinon
    				estBissextile = vrai
    			Fin Si
    		Sinon
    			estBissextile = faux
    		Fin Si
    	Sinon
    		estBissextile = vrai
    	Fin Si
    	
               MOVE W-DATE TO W-DATE-N
               DIVIDE 4 INTO W-ANNEE-N GIVING W-ANNEE-DIVIDE
               DIVIDE 4 INTO W-ANNEE-N GIVING W-ANNEE-TRUNC
          *    L'Année divisible par quatre ?
               IF W-ANNEE-DIVIDE NOT EQUAL W-ANNEE-TRUNC THEN
                 MOVE "F" TO W-BISSEXTILE
               ELSE
                 DIVIDE 100 INTO W-ANNEE-N GIVING W-ANNEE-DIVIDE
                 DIVIDE 100 INTO W-ANNEE-N GIVING W-ANNEE-TRUNC
          *      L'Année non divisible par cent ?
                 IF W-ANNEE-DIVIDE EQUAL W-ANNEE-TRUNC THEN
                   DIVIDE 400 INTO W-ANNEE-N GIVING W-ANNEE-DIVIDE
                   DIVIDE 400 INTO W-ANNEE-N GIVING W-ANNEE-TRUNC
          *        Mais année divisible par quatre cent ?
                   IF W-ANNEE-DIVIDE NOT EQUAL W-ANNEE-TRUNC THEN
                     MOVE "F" TO W-BISSEXTILE
                   ELSE
                     MOVE "V" TO W-BISSEXTILE
                   END-IF
                 ELSE
                   MOVE "V" TO W-BISSEXTILE
                 END-IF
               END-IF
           FIN-BISSEXTILE.
               EXIT.
               
           DATE-VALIDE.
          *    ***************
          *    Est ce que l'année est comprise entre 1959 et 2100
          *      (je modifierai le code en 2101 pour le mettre à jour)
          *    ***************
               IF W-ANNEE < 1959 OR W-ANNEE > 2100 THEN
                 PERFORM FIN-PROGRAMME
               END-IF
               
              
          *    ***************
          *    Est ce que le mois est valide ?
          *      Donc comprit entre 01 et 12
          *    ***************
               IF W-MOIS < 01 OR W-MOIS > 12 THEN
                 PERFORM FIN-PROGRAMME
               END-IF
               
          *    ***************
          *    Est ce que le jour est valide ?
          *      Donc comprit entre 01 et 31
          *                      ou 01 et 30
          *                      ou 01 et 29
          *                      ou 01 et 28
          *    ***************
               EVALUATE W-MOIS
                 WHEN 01
                 WHEN 03
                 WHEN 05
                 WHEN 07
                 WHEN 08
                 WHEN 10
                 WHEN 12
                   IF W-JOUR <= 01 OR W-JOUR >= 31 THEN
                     PERFORM FIN-PROGRAMME
                   END-IF
                 WHEN 04
                 WHEN 06
                 WHEN 09
                 WHEN 11
                   IF W-JOUR <= 01 OR W-JOUR >= 30 THEN
                     PERFORM FIN-PROGRAMME
                   END-IF
                 WHEN 02
                   IF W-JOUR <= 01 OR
                      (W-BISSEXTILE-VRAI AND W-JOUR > 29) OR
                      (W-BISSEXTILE-FAUX AND W-JOUR > 28) THEN
                     PERFORM FIN-PROGRAMME
                   END-IF
                 WHEN OTHER
                   MOVE 0 TO W-INVALIDE
               END-EVALUATE
               MOVE 0 TO W-INVALIDE
               PERFORM FIN-PROGRAMME
           FIN-DATE-VALIDE.
               EXIT.
               
           FIN-PROGRAMME.
               CANCEL "estUnNumerique"
               EXIT PROGRAM
           FIN-FIN-PROGRAMME.
               EXIT.
    et un test :
    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
          **************************************************************************
          *0011111111112222222222333333333344444444445555555555666666666677*7777777*
          *8901234567890123456789012345678901234567890123456789012345678901*3456789*
          **************************************************************************
           IDENTIFICATION DIVISION.
           PROGRAM-ID. test.
           AUTHOR. Deallyra.
           DATE-WRITTEN. 14-03-2009.
           DATE-COMPILED. 14-03-2009.
           ENVIRONMENT DIVISION.
           DATA DIVISION.
           WORKING-STORAGE SECTION.
               77 W-DATE PIC X(10).
               77 W-CONTROLE PIC 9.
               77 W-TEMPORISATEUR PIC X.
           PROCEDURE DIVISION.
           DEBUT.
             MOVE "17-08-2003" TO W-DATE
             CALL "verifierDate" USING
               BY CONTENT W-DATE,
               BY REFERENCE W-CONTROLE.
             DISPLAY W-DATE " est une date " WITH NO ADVANCING
             IF W-CONTROLE = 1 THEN
               DISPLAY "invalide."
             ELSE
               DISPLAY "valide."
             END-IF  
             
             MOVE "29-02-1600" TO W-DATE
             CALL "verifierDate" USING
               BY CONTENT W-DATE,
               BY REFERENCE W-CONTROLE.
             DISPLAY W-DATE " est une date " WITH NO ADVANCING
             IF W-CONTROLE = 1 THEN
               DISPLAY "invalide." WITH NO ADVANCING
             ELSE
               DISPLAY "valide." WITH NO ADVANCING
             END-IF
             
             CANCEL "verifierDate"
             
             ACCEPT W-TEMPORISATEUR
           FIN.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  2. #2
    Expert confirmé
    Homme Profil pro
    ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Inscrit en
    Juin 2007
    Messages
    2 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : ANCIEN Consultant/Formateur/Développeur AS/400, iSeries, System i et Cobol
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 096
    Points : 4 155
    Points
    4 155
    Par défaut
    Il y a une exception à l'exception dans la définition de l'année bissextile : divisible par 4 sauf quand elle est divisible par 100 mais elle est bissextile quand elle est divisible par 400 (cas de 2000 et de 1600 mais pas de 1900, 1800 et 1700)

  3. #3
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Merci pour cette précision.

    Code mis à jour

    (vous ne pourrez pas tester directement sur 1600 ou 2400 sans changer un peu le code.
    1959, vous saurez surement pourquoi
    2100... c'est discutable. Mais pour gérer le retour d'un livre, une fin de loc. ou alors la date de naissance, ça va ^^ )
    ___

    Par contre, il ne doit pas être dans la meilleure forme possible.
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  4. #4
    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
    A moins que je me trompe, mais je n'ai pas vu dans le programme d'initialisation de la variable W-INVALIDE ...

  5. #5
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    L'initialisation ?

    Elle se fait avant de quitter le programme en fait.

    Vu que je ne la teste jamais et que je quitte le programme juste après lui avoir donné une valeur, je ne pensais pas que c'était un problème >.<

    Mais bon. Il est vrai que si je lui donnais la valeur 1 (date invalide) de base, je n'aurais qu'à mettre 0 si elle est valide.

    Les deux codes se valent niveau résultat non ?

    Même si celui que je proposais était, en effet, moins bien réfléchi

    ___

    mise à jour faîte
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  6. #6
    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 Deallyra Voir le message
    L'initialisation ?

    Elle se fait avant de quitter le programme en fait.

    Vu que je ne la teste jamais et que je quitte le programme juste après lui avoir donné une valeur, je ne pensais pas que c'était un problème >.<

    Mais bon. Il est vrai que si je lui donnais la valeur 1 (date invalide) de base, je n'aurais qu'à mettre 0 si elle est valide.

    Les deux codes se valent niveau résultat non ?
    Je n'avais pas vu l'affectation dans le dernier paragraphe ...

    Pour moi, les deux codes se valent ... après c'est juste affaire de goût et d'habitude ...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 37
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Je me permet d'ajouter un autre programme de vérification de la validité d'une date qui a la particularité d'utiliser les niveaux 88. Il n'y donc aucun calcul d'effectuer dans le programme.
    Quelques exemples de test sont dans 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
    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
    
           IDENTIFICATION DIVISION.                                         
          *--------------------------------------------------------------   
           PROGRAM-ID. D3B034.                                              
           AUTHOR. MOI.                                                     
          *--------------------------------------------------------------   
          * DESCRIPTION : TEST LA VALIDITE D'UNE DATE                       
          *--------------------------------------------------------------   
           ENVIRONMENT DIVISION.                                            
          *--------------------------------------------------------------   
           DATA DIVISION.                                                   
          *--------------------------------------------------------------   
           WORKING-STORAGE SECTION.                                         
          *--------------------------------------------------------------   
           01  DATE-2-CHECK.                                                
               05 JOUR PIC XX.                                              
                  88 DD-29 VALUE '29'.                                      
                  88 JOUR-FEVRIER VALUE '01' THRU '29'.                     
                  88 JOUR-30 VALUE '01' THRU '30'.                          
                  88 JOUR-31 VALUE '01' THRU '31'.                          
               05 PIC X.                                                    
               05 MOIS PIC XX.                                              
                  88 MOIS-30 VALUE '03', '05', '09', '11'.                  
                  88 MOIS-31 VALUE '01', '03', '05', '07', '08', '10', '12'.
                  88 FEVRIER VALUE '02'.                                    
               05 PIC X.                                                    
               05 ANNEE PIC X(4).                                           
                  88 ANNEE-OK VALUE '0001' THRU '9999'.                     
               05 ANNEE-FILLER REDEFINES ANNEE.                             
                  10 PIC XX.                                                
                     88 ANNEE-DIV-400 VALUE '04', '08', '12', '16', '20',   
                        '24', '28', '32', '36', '40', '44', '48', '52',     
                        '56', '60', '64', '68', '72', '76', '80', '84',     
                        '88', '92', '96'.                             
                  10 PIC XX.                                                
                     88 ANNEE-DIV-100 VALUE '00'.                           
                     88 ANNEE-DIV-4   VALUE '04', '08', '12', '16', '20',   
                        '24', '28', '32', '36', '40', '44', '48', '52',     
                        '56', '60', '64', '68', '72', '76', '80', '84',     
                        '88', '92', '96'.                             
                                                                                                               
           01 PIC X VALUE '0'.                                              
              88 DATE-VALID VALUE '1'.                                      
              88 DATE-INVALID VALUE '0'.                                    
                                                                            
          *--------------------------------------------------------------   
           PROCEDURE DIVISION.                                              
          *--------------------------------------------------------------   
          *--------------------------------------------------------------   
           B0-MAIN SECTION.                                                 
          *--------------------------------------------------------------   
                                                                            
               MOVE '01-01-1979' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '29-02-2000' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '29-02-2001' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '55-01-2000' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '01-01-AAAA' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '01-99-AAAA' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '31-04-2009' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '29-02-2004' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               MOVE '29-02-1900' TO DATE-2-CHECK                            
               PERFORM CHECK-DATE                                           
               IF DATE-VALID THEN                                           
                  DISPLAY DATE-2-CHECK ' EST VALIDE'                        
               ELSE                                                         
                  DISPLAY DATE-2-CHECK ' EST INVALIDE'                      
               END-IF                                                       
                                                                            
               GOBACK                                                       
                                                                            
               .                                                            
           B0-EXIT.                                                         
               EXIT.                                                        
                                                                            
          *--------------------------------------------------------------   
           CHECK-DATE SECTION.                                              
          *--------------------------------------------------------------   
               SET DATE-INVALID TO TRUE                                     
                                                                            
               IF ANNEE-OK THEN                                             
                                                                            
                  IF     MOIS-30                                            
                     AND JOUR-30 THEN                                       
                     SET DATE-VALID TO TRUE                                 
                     GO TO CHECK-DATE-EXIT                                  
                  END-IF                                                    
                                                                            
                  IF     MOIS-31                                            
                     AND JOUR-31 THEN                                       
                     SET DATE-VALID TO TRUE                                 
                     GO TO CHECK-DATE-EXIT                                  
                  END-IF                                                    
                                                                            
                  IF     FEVRIER                                            
                     AND JOUR-FEVRIER THEN                                  
                     IF DD-29 THEN                                          
                        PERFORM CHECK-BISEXTILE                             
                        GO TO CHECK-DATE-EXIT                               
                     ELSE                                                   
                        SET DATE-VALID TO TRUE                              
                        GO TO CHECK-DATE-EXIT                               
                     END-IF                                                 
                                                                            
                  END-IF                                                    
                                                                            
               END-IF                                                       
                                                                            
               .                                                            
           CHECK-DATE-EXIT.                                                 
               EXIT.                                                        
                                                                            
          *--------------------------------------------------------------   
           CHECK-BISEXTILE SECTION.                                         
          *--------------------------------------------------------------   
                                                                            
          *    SI ANNEE DIVISIBLE PAR 100                                   
               IF ANNEE-DIV-100 THEN                                        
                                                                            
          *       SI ANNEE DIVISIBLE PAR 400 ==> DATE VALIDE                
                  IF ANNEE-DIV-400 THEN                                     
                     SET DATE-VALID TO TRUE                                 
                  END-IF                                                    
                                                                            
               ELSE                                                         
                                                                            
          *       SI ANNEE DIVISIBLE PAR 4 ==> DATE VALIDE                  
                  IF ANNEE-DIV-4 THEN                                       
                     SET DATE-VALID TO TRUE                                 
                  END-IF                                                    
                                                                            
               END-IF                                                       
                                                                            
               .                                                            
           CHECK-BISEXTILE-EXIT.                                            
               EXIT.

  8. #8
    Membre confirmé Avatar de Homer-ac
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    449
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 449
    Points : 586
    Points
    586
    Par défaut
    Pour ceux qui sont sous z/OS, c'est plus simple. Pour vérifier si une date est valide, il sufit d'appeler la routine de service Langage Environment CEEDAYS et de tester le code retour(condition token), cf. fonctions, j'ai donné un exemple d'appel CEEDAYS.
    En COBOL3, pour calculer si une date est bissextile, il faut se rappeler que l'on a les fonctions pour ça. Exemple : (avec des réference modifiers pour diminuer les lignes de code et faciliter la lecture, pas comme modèle d'écriture).
    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
    01.
        05  WS-BISSEXT            PIC X VALUE SPACE.
        88  BISSEXTILE                  VALUE '1'. 
        05  WS-SSAAMMJJ           PIC  9(008).
        05  WS-INTEGER-FORM       PIC S9(008) COMP-3.
    .................
         MOVE      MYDATE    TO WS-SSAAMMJJ
         MOVE      '0228'    TO WS-SSAAMMJJ(5:4) 
         COMPUTE WS-INTEGER-FORM =
                       FUNCTION INTEGER-OF-DATE(WS-SSAAMMJJ)
         ADD 1 TO WS-INTEGER-FORM
         COMPUTE WS-SSAAMMJJ   =
                       FUNCTION DATE-OF-INTEGER(WS-INTEGER-FORM)
         IF WS-SSAAMMJJ(5:2)  = '02' THEN SET BISSEXTILE TO TRUE    END-IF
    .................
    On convertit la date au 28 février en nombre de jours écoulés depuis une date pivot + 1 (c'est dans les normes ISO 89,2001/2002). Puis on convertit dans l'autre sens pour voir si on a changé de mois. Donc aucun risque d'erreur si bien entendu on à testé la validité du siècle/année avant. (> 1600 < 2600 -On a de la marge !).

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