IBM Mainframe Forum Index
 
Log In
 
IBM Mainframe Forum Index Mainframe: Search IBM Mainframe Forum: FAQ Register
 

Requirement to write a batch program to validate the date


IBM Mainframe Forums -> COBOL Programming
Post new topic   Reply to topic
View previous topic :: View next topic  
Author Message
RamsIBM

New User


Joined: 08 Jan 2007
Posts: 53
Location: Chennai

PostPosted: Wed Sep 12, 2007 3:08 pm
Reply with quote

Hello There,

I got a requirement to write a batch program to validate the date. i.e to check the Day & month value is correct not for Year.

I am taking input from the flat file which contains 10 to 20 fields, among that 5 t0 6 fields are date fields. I should write in output file the record which is contain wrong date value in any fields.

For Ex: I am checking following condition for month and day

*) month number should be less than <13 , >0
*) day should be less than <32 , >0

But I want to check for combination of month and date i.e Feb month date should not be 31, similarly Apr,Jun,Sep,Nov months dates not be grater than 31 like that I have to check all the possibility

Can you guys provide any other list of condition or if you provide any sample program will be really great.
Back to top
View user's profile Send private message
murmohk1

Senior Member


Joined: 29 Jun 2006
Posts: 1436
Location: Bangalore,India

PostPosted: Wed Sep 12, 2007 3:12 pm
Reply with quote

Rams,

Are you considering LEAP year?
Back to top
View user's profile Send private message
RamsIBM

New User


Joined: 08 Jan 2007
Posts: 53
Location: Chennai

PostPosted: Wed Sep 12, 2007 4:49 pm
Reply with quote

Yeap

Am considering that..
Back to top
View user's profile Send private message
shankar.v

Active User


Joined: 25 Jun 2007
Posts: 196
Location: Bangalore

PostPosted: Wed Sep 12, 2007 6:46 pm
Reply with quote

RamsIBM,
Please check with the following cobol code for your requirement.
Input should be supplied via SYSIN DD with date format YYYY-MM-DD and (- is used as an separator, u can use any other character for separator)
Code:
       IDENTIFICATION DIVISION.             
       PROGRAM-ID. DATECHK.                 
       DATA DIVISION.                       
       WORKING-STORAGE SECTION.             
       01 WS-DATE PIC X(10).                 
       01 WS-TEMP-DATE REDEFINES WS-DATE.   
        02 WS-YEAR PIC 9(4).                 
        02 FILLER PIC X.                     
        02 WF-VALID-MONTH PIC 9(2).         
         88 JAN VALUE 01.                   
         88 FEB VALUE 02.                   
         88 MAR VALUE 03.                   
         88 APR VALUE 04.                   
         88 MAY VALUE 05.                   
         88 JUN VALUE 06.                   
         88 JUL VALUE 07.                   
         88 AUG VALUE 08.                   
         88 SEP VALUE 09.                   
         88 SEP VALUE 09.                                           
         88 OCT VALUE 10.                                           
         88 NOV VALUE 11.                                           
         88 DEC VALUE 12.                                           
         88 VALID-MONTH VALUE 01 THRU 12.                           
         88 NOT-VALID-MONTH VALUE 13 THRU 99.                       
        02 FILLER PIC X.                                           
        02 WS-DATE-PART PIC 99.                                     
        77 WS-QUOTIENT PIC 9(4).                                   
        77 WF-ZERO PIC 9.                                           
         88 ZERO-YES VALUE 0.                                       
         88 ZERO-NO VALUE 1 THRU 3.                                 
       PROCEDURE DIVISION.                                         
           ACCEPT WS-DATE                                           
           DISPLAY WS-DATE                                         
           DIVIDE WS-YEAR BY 4 GIVING WS-QUOTIENT REMAINDER WF-ZERO
           END-DIVIDE                                               
           IF VALID-MONTH                                           
            IF JAN AND WS-DATE-PART <= 31 OR                     
               FEB AND ZERO-YES AND WS-DATE-PART <= 29 OR       
               FEB AND ZERO-NO AND WS-DATE-PART <= 28 OR         
               MAR AND WS-DATE-PART <= 31 OR                     
               APR AND WS-DATE-PART <= 30 OR                     
               MAY AND WS-DATE-PART <= 31 OR                     
               JUN AND WS-DATE-PART <= 30 OR                     
               JUL AND WS-DATE-PART <= 31 OR                     
               AUG AND WS-DATE-PART <= 31 OR                     
               SEP AND WS-DATE-PART <= 30 OR                     
               OCT AND WS-DATE-PART <= 31 OR                     
               NOV AND WS-DATE-PART <= 30 OR                     
               DEC AND WS-DATE-PART <= 31                       
             DISPLAY 'VALID DATE'                               
             GOBACK                                             
            ELSE                                                 
             DISPLAY 'NOT VALID DATE'                           
             GOBACK                                           
            END-IF                                           
           ELSE                                               
            DISPLAY 'NOT VALID DATE'                         
            GOBACK                                           
           END-IF.
Back to top
View user's profile Send private message
RamsIBM

New User


Joined: 08 Jan 2007
Posts: 53
Location: Chennai

PostPosted: Wed Sep 12, 2007 7:10 pm
Reply with quote

Thanks Shankar....
Back to top
View user's profile Send private message
shankar.v

Active User


Joined: 25 Jun 2007
Posts: 196
Location: Bangalore

PostPosted: Wed Sep 12, 2007 7:30 pm
Reply with quote

RamsIBM
Please check with the following cobol code which checks for year not equal to zero which was missed in the previous posted cobol code.
Input should be supplied via SYSIN DD with date format YYYY-MM-DD and (- is used as an separator, you can use any other character for separator)
Code:
       IDENTIFICATION DIVISION.                 
       PROGRAM-ID. DATECHK.                     
       DATA DIVISION.                           
       WORKING-STORAGE SECTION.                 
       01 WS-DATE PIC X(10).                     
       01 WS-TEMP-DATE REDEFINES WS-DATE.       
        02 WS-YEAR PIC 9(4).                     
        02 FILLER PIC X.                         
        02 WF-VALID-MONTH PIC 9(2).             
         88 JAN VALUE 01.                       
         88 FEB VALUE 02.                       
         88 MAR VALUE 03.                       
         88 APR VALUE 04.                       
         88 MAY VALUE 05.                       
         88 JUN VALUE 06.                       
         88 JUL VALUE 07.                       
         88 AUG VALUE 08.                       
         88 SEP VALUE 09.                                           
         88 OCT VALUE 10.                                           
         88 NOV VALUE 11.                                           
         88 DEC VALUE 12.                                           
         88 VALID-MONTH VALUE 01 THRU 12.                           
         88 NOT-VALID-MONTH VALUE 13 THRU 99.                       
        02 FILLER PIC X.                                             
        02 WS-DATE-PART PIC 99.                                     
        77 WS-QUOTIENT PIC 9(4).                                     
        77 WF-ZERO PIC 9.                                           
         88 ZERO-YES VALUE 0.                                       
         88 ZERO-NO VALUE 1 THRU 3.                                 
       PROCEDURE DIVISION.                                           
           ACCEPT WS-DATE                                           
           DISPLAY WS-DATE                                           
           IF WS-YEAR NOT = ZERO                                     
            DIVIDE WS-YEAR BY 4 GIVING WS-QUOTIENT REMAINDER WF-ZERO
            END-DIVIDE                                         
            IF VALID-MONTH                                     
             IF JAN AND WS-DATE-PART <= 31 OR                   
                FEB AND ZERO-YES AND WS-DATE-PART <= 29 OR     
                FEB AND ZERO-NO AND WS-DATE-PART <= 28 OR       
                MAR AND WS-DATE-PART <= 31 OR                   
                APR AND WS-DATE-PART <= 30 OR                   
                MAY AND WS-DATE-PART <= 31 OR                   
                JUN AND WS-DATE-PART <= 30 OR                   
                JUL AND WS-DATE-PART <= 31 OR                   
                AUG AND WS-DATE-PART <= 31 OR                   
                SEP AND WS-DATE-PART <= 30 OR                   
                OCT AND WS-DATE-PART <= 31 OR                   
                NOV AND WS-DATE-PART <= 30 OR                   
                DEC AND WS-DATE-PART <= 31                     
              DISPLAY 'VALID DATE'                             
              GOBACK
             ELSE                             
              DISPLAY 'NOT VALID DATE'       
              GOBACK                         
             END-IF                           
            ELSE                             
             DISPLAY 'NOT VALID DATE'         
             GOBACK                           
            END-IF                           
           ELSE                               
            DISPLAY 'NOT VALID DATE'         
            GOBACK                           
           END-IF.   
Back to top
View user's profile Send private message
dneufarth

Active User


Joined: 27 Apr 2005
Posts: 420
Location: Inside the SPEW (Southwest Ohio, USA)

PostPosted: Thu Sep 13, 2007 5:07 am
Reply with quote

Code doesn't validate leap year correctly.
Back to top
View user's profile Send private message
dneufarth

Active User


Joined: 27 Apr 2005
Posts: 420
Location: Inside the SPEW (Southwest Ohio, USA)

PostPosted: Thu Sep 13, 2007 5:20 am
Reply with quote

leap year

see ibmmainframes.com/viewtopic.php?t=23946&highlight=4000
Back to top
View user's profile Send private message
shankar.v

Active User


Joined: 25 Jun 2007
Posts: 196
Location: Bangalore

PostPosted: Thu Sep 13, 2007 12:47 pm
Reply with quote

dneufarth,

Thank you very much for notifying me. Now i am clear with leap year.

Following is the one i got from wikipedia to check for leap year.
Code:
if year modulo 400 is 0 then leap
 else if year modulo 100 is 0 then no_leap
 else if year modulo 4 is 0 then leap
 else no_leap

I modified my before posted cobol code and is as follows. Please check it and let me know if still i am wrong.
Code:
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DATECHK.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WS-DATE PIC X(10).
       01 WS-TEMP-DATE REDEFINES WS-DATE.
        02 WS-YEAR PIC 9(4).
        02 FILLER PIC X.
        02 WF-VALID-MONTH PIC 9(2).
         88 JAN VALUE 01.
         88 FEB VALUE 02.
         88 MAR VALUE 03.
         88 APR VALUE 04.
         88 MAY VALUE 05.
         88 JUN VALUE 06.
         88 JUL VALUE 07.
         88 AUG VALUE 08.
         88 SEP VALUE 09.
         88 OCT VALUE 10.
         88 NOV VALUE 11.
         88 DEC VALUE 12.
         88 VALID-MONTH VALUE 01 THRU 12.
         88 NOT-VALID-MONTH VALUE 13 THRU 99.
        02 FILLER PIC X.
        02 WS-DATE-PART PIC 99.
        77 WS-QUOTIENT PIC 9(4).
        77 WF-ZERO PIC 999.
         88 ZERO-YES VALUE 0.
         88 ZERO-NO VALUE 1 THRU 399.
        77 WF-LEAP PIC 9.
         88 LEAP-YES VALUE 0.
         88 LEAP-NO VALUE 1.
       PROCEDURE DIVISION.
           ACCEPT WS-DATE
           DISPLAY WS-DATE
           IF WS-YEAR NOT = ZERO
            DIVIDE WS-YEAR BY 400 GIVING WS-QUOTIENT REMAINDER WF-ZERO
            END-DIVIDE
            IF ZERO-YES
             SET LEAP-YES TO TRUE
            ELSE
             DIVIDE WS-YEAR BY 100 GIVING WS-QUOTIENT REMAINDER WF-ZERO
             END-DIVIDE
             IF ZERO-YES
              SET LEAP-NO TO TRUE
             ELSE
              DIVIDE WS-YEAR BY 4 GIVING WS-QUOTIENT REMAINDER WF-ZERO
              END-DIVIDE
              IF ZERO-YES
               SET LEAP-YES TO TRUE
              ELSE
               SET LEAP-NO TO TRUE
              END-IF
             END-IF
            END-IF
            IF VALID-MONTH
             IF JAN AND WS-DATE-PART <= 31 OR
                FEB AND LEAP-YES AND WS-DATE-PART <= 29 OR
                FEB AND LEAP-NO AND WS-DATE-PART <= 28 OR
                MAR AND WS-DATE-PART <= 31 OR
                APR AND WS-DATE-PART <= 30 OR
                MAY AND WS-DATE-PART <= 31 OR
                JUN AND WS-DATE-PART <= 30 OR
                JUL AND WS-DATE-PART <= 31 OR
                AUG AND WS-DATE-PART <= 31 OR
                SEP AND WS-DATE-PART <= 30 OR
                OCT AND WS-DATE-PART <= 31 OR
                NOV AND WS-DATE-PART <= 30 OR
                DEC AND WS-DATE-PART <= 31
              DISPLAY 'VALID DATE'
              GOBACK
             ELSE
              DISPLAY 'NOT VALID DATE'
              GOBACK
             END-IF
            ELSE
             DISPLAY 'NOT VALID DATE'
             GOBACK
            END-IF
           ELSE
            DISPLAY 'NOT VALID DATE'
            GOBACK
           END-IF.
Back to top
View user's profile Send private message
RamsIBM

New User


Joined: 08 Jan 2007
Posts: 53
Location: Chennai

PostPosted: Thu Sep 13, 2007 12:52 pm
Reply with quote

Guys Thank you for your reply...
Back to top
View user's profile Send private message
View previous topic :: :: View next topic  
Post new topic   Reply to topic View Bookmarks
All times are GMT + 6 Hours
Forum Index -> COBOL Programming

 


Similar Topics
Topic Forum Replies
No new posts Compare 2 files(F1 & F2) and writ... JCL & VSAM 8
No new posts Replacing 'YYMMDD' with date, varying... SYNCSORT 3
No new posts Using API Gateway from CICS program CICS 0
No new posts Modifying Date Format Using DFSORT DFSORT/ICETOOL 9
No new posts Write line by line from two files DFSORT/ICETOOL 7
Search our Forums:

Back to Top