View previous topic :: View next topic
|
Author |
Message |
RamsIBM
New User
Joined: 08 Jan 2007 Posts: 53 Location: Chennai
|
|
|
|
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 |
|
|
murmohk1
Senior Member
Joined: 29 Jun 2006 Posts: 1436 Location: Bangalore,India
|
|
|
|
Rams,
Are you considering LEAP year? |
|
Back to top |
|
|
RamsIBM
New User
Joined: 08 Jan 2007 Posts: 53 Location: Chennai
|
|
|
|
Yeap
Am considering that.. |
|
Back to top |
|
|
shankar.v
Active User
Joined: 25 Jun 2007 Posts: 196 Location: Bangalore
|
|
|
|
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 |
|
|
RamsIBM
New User
Joined: 08 Jan 2007 Posts: 53 Location: Chennai
|
|
|
|
Thanks Shankar.... |
|
Back to top |
|
|
shankar.v
Active User
Joined: 25 Jun 2007 Posts: 196 Location: Bangalore
|
|
|
|
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 |
|
|
dneufarth
Active User
Joined: 27 Apr 2005 Posts: 420 Location: Inside the SPEW (Southwest Ohio, USA)
|
|
|
|
Code doesn't validate leap year correctly. |
|
Back to top |
|
|
dneufarth
Active User
Joined: 27 Apr 2005 Posts: 420 Location: Inside the SPEW (Southwest Ohio, USA)
|
|
Back to top |
|
|
shankar.v
Active User
Joined: 25 Jun 2007 Posts: 196 Location: Bangalore
|
|
|
|
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 |
|
|
RamsIBM
New User
Joined: 08 Jan 2007 Posts: 53 Location: Chennai
|
|
|
|
Guys Thank you for your reply... |
|
Back to top |
|
|
|