I need a sort card that can validate dates in yyyymmdd format. I want to omit all the records which are not in this format or are blank or have invalid dates.
Joined: 25 Jun 2007 Posts: 196 Location: Bangalore
NikhilMF10,
Please check with the below code.
Code:
// EXEC PGM=SORT
//SORTIN DD *
SPACES
YYYYMMDD NON-NUMERIC
A NON-NUMERIC
00001231 YEAR ZERO
10000031 MONTH ZERO
19990200 DATA ZERO
18781328 MONTH GREATER THAN 12
19871232 DATE GREATER THAN 31
19800431 DATE EQUAL TO 31 FOR APRIL
19810631 DATE EQUAL TO 31 FOR JUNE
19880931 DATE EQUAL TO 31 FOR SEPTEMBER
19901131 DATE EQUAL TO 31 FOR NOVEMBER
19900230 DATE GREATER THAN 29 FOR FEBRUARY
19000229 FEBRUARY 29 FOR NON LEAP YEAR
20010229 FEBRUARY 29 FOR NON LEAP YEAR
19010131 CORRECT DATE
19110331 CORRECT DATE
19210531 CORRECT DATE
19310731 CORRECT DATE
19410831 CORRECT DATE
19511031 CORRECT DATE
19611231 CORRECT DATE
19710530 CORRECT DATE
19810630 CORRECT DATE
19910730 CORRECT DATE
19921130 CORRECT DATE
20080228 CORRECT DATE
20000229 CORRECT DATE LEAP
20040229 CORRECT DATE LEAP
//VALID DD SYSOUT=*
//INVALID DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
OPTION COPY
INREC IFTHEN=(WHEN=INIT,
OVERLAY=(81:1,8)),
IFTHEN=(WHEN=(81,8,FS,NE,NUM,OR,
81,4,ZD,EQ,0,OR,
85,2,ZD,EQ,0,OR,
87,2,ZD,EQ,0,OR,
85,2,ZD,GT,12,OR,
87,2,ZD,GT,31,OR,
(85,2,SS,EQ,C'04,06,09,11',AND,
87,2,ZD,GT,30),OR,
(85,2,ZD,EQ,02,AND,
87,2,ZD,GT,29)),
OVERLAY=(92:C'0')),
IFTHEN=(WHEN=(85,2,ZD,NE,02,OR,
(85,2,ZD,EQ,02,AND,
87,2,ZD,LE,28)),
OVERLAY=(92:C'1')),
IFTHEN=(WHEN=(87,2,ZD,EQ,29),
OVERLAY=(89:81,4,ZD,MOD,+400,M11,LENGTH=3),HIT=NEXT),
IFTHEN=(WHEN=(89,3,ZD,EQ,0),
OVERLAY=(92:C'1')),
IFTHEN=(WHEN=(89,3,ZD,NE,0),
OVERLAY=(89:81,4,ZD,MOD,+100,M11,LENGTH=3),HIT=NEXT),
IFTHEN=(WHEN=(89,3,ZD,EQ,0),
OVERLAY=(92:C'0')),
IFTHEN=(WHEN=(89,3,ZD,NE,0),
OVERLAY=(89:81,4,ZD,MOD,+4,M11,LENGTH=1),HIT=NEXT),
IFTHEN=(WHEN=(89,1,ZD,EQ,0),
OVERLAY=(92:C'1')),
IFTHEN=(WHEN=(89,1,ZD,NE,0),
OVERLAY=(92:C'0')),
IFTHEN=(WHEN=NONE,
OVERLAY=(92:C'0'))
OUTFIL FNAMES=VALID,OUTREC=(1,80),INCLUDE=(92,1,CH,EQ,C'1'),REMOVECC
OUTFIL FNAMES=INVALID,OUTREC=(1,80),INCLUDE=(92,1,CH,EQ,C'0'),REMOVECC
VALID
Code:
19010131 CORRECT DATE
19110331 CORRECT DATE
19210531 CORRECT DATE
19310731 CORRECT DATE
19410831 CORRECT DATE
19511031 CORRECT DATE
19611231 CORRECT DATE
19710530 CORRECT DATE
19810630 CORRECT DATE
19910730 CORRECT DATE
19921130 CORRECT DATE
20080228 CORRECT DATE
20000229 CORRECT DATE LEAP
20040229 CORRECT DATE LEAP
INVALID
Code:
SPACES
YYYYMMDD NON-NUMERIC
A NON-NUMERIC
00001231 YEAR ZERO
10000031 MONTH ZERO
19990200 DATA ZERO
18781328 MONTH GREATER THAN 12
19871232 DATE GREATER THAN 31
19800431 DATE EQUAL TO 31 FOR APRIL
19810631 DATE EQUAL TO 31 FOR JUNE
19880931 DATE EQUAL TO 31 FOR SEPTEMBER
19901131 DATE EQUAL TO 31 FOR NOVEMBER
19900230 DATE GREATER THAN 29 FOR FEBRUARY
19000229 FEBRUARY 29 FOR NON LEAP YEAR
20010229 FEBRUARY 29 FOR NON LEAP YEAR
Joined: 07 Dec 2007 Posts: 2205 Location: San Jose
NikhilMF10,
Shankar has the right idea but you really don't need that many IFTHEN statements. The invalid date conditions are
Code:
1. If the date is NOT numeric
2. If year or month or day is zero
3. If month greater than 12
4. If day greater than 31
5. If month is (April,June,september, novemeber) and day greater than 30
6. If year is Leap and month is february and day greater than 29
7. If it is NON LEAP year and month is february and day greater than 28
Only conditions 6 and 7 need to be validated using the leap year logic, all other conditions are simple include/omit conditions
we validate the year and check it if is a leap year. Once we have the leap year indicator it is just another include/omit cond on OUTFIL