IDENTIFICATION DIVISION.
PROGRAM-ID. DATEval.
AUTHOR. MARTIN OSULLIVAN
* THIS PROGRAM WILL TAKE A 10 CHARACTER STRING
* CHECK WHETHER IT IS A VALID DATE IN THE FORMAT DD/MM/CCYY
* OR IN THE FORMAT DD:MM:CCYY
* IT IS A SUB PROGRAM AND IS CALLED BY DATEVAL
DATE-WRITTEN. 09/12/86.
DATE-COMPILED.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-AS400.
OBJECT-COMPUTER. IBM-AS400.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUMERIC-DATE-IN .
03 N-DAY PIC 9(2).
03 N-MONTH PIC 9(2).
03 N-YEAR.
05 N-CENTURY PIC 9(2).
05 N-TENS-PART PIC 9(2).
88 CENTURY-YEAR VALUE 0.
01 SCRATCH-PAD.
03 QUOTIENT PIC 9(3).
03 LEAP PIC 9.
88 LEAP-YEAR VALUE 0.
03 MONTH-SUB PIC 9(2).
COPY DAYSINMONT.
01 FLAGS-ETC.
02 DATE-VALID-FLAG PIC X.
02 OTHER-FLAGS.
03 NUMERIC-FLAG PIC X.
88 DATE-NUMERIC VALUE "Y".
88 DATE-NOT-NUMERIC VALUE "N".
03 MONTH-FLAG PIC X.
88 MONTH-VALID VALUE "Y".
88 MONTH-NOT-VALID VALUE "N".
03 DAY-FLAG PIC X.
88 DAY-VALID VALUE "Y".
88 DAY-NOT-VALID VALUE "N".
LINKAGE SECTION.
01 DATE-STRING.
03 DAY-IN PIC X(2).
03 MONTH-IN PIC X(2).
03 YEAR-IN PIC X(4).
01 VALIDITY-FLAG.
02 DATE-VALID-FLAG PIC X.
88 DATE-VALID VALUE "Y".
88 DATE-NOT-VALID VALUE "N".
PROCEDURE DIVISION
USING DATE-STRING, VALIDITY-FLAG.
TOP-CONTROL.
PERFORM CHECK-NUMERIC-VALIDATE-MTH-DAY.
PERFORM RETURN-CONTROAL.
CHECK-NUMERIC-VALIDATE-MTH-DAY.
PERFORM CHECK-FOR-NUMERIC.
PERFORM POSS-VALIDATE-MONTH-DAY.
* 3
CHECK-FOR-NUMERIC.
IF DAY-IN NOT NUMERIC
OR MONTH-IN NOT NUMERIC
OR YEAR-IN NOT NUMERIC
THEN
SET DATE-NOT-NUMERIC TO TRUE
ELSE
SET DATE-NUMERIC TO TRUE.
POSS-VALIDATE-MONTH-DAY.
IF DATE-NUMERIC
MOVE DATE-STRING TO NUMERIC-DATE-IN
PERFORM VALIDATE-MONTH-DAY
ELSE
SET DATE-NOT-VALID TO TRUE.
* 19
VALIDATE-MONTH-DAY.
PERFORM VALIDATE-MONTH.
PERFORM POSS-VALIDATE-DAY.
* 21
VALIDATE-MONTH.
IF N-MONTH > 12 OR = ZERO
SET MONTH-NOT-VALID TO TRUE
ELSE
SET MONTH-VALID TO TRUE.
/
* 22
POSS-VALIDATE-DAY.
IF MONTH-VALID
PERFORM CHECK-LEAP-VALIDATE-DAY
ELSE
SET DATE-NOT-VALID TO TRUE.
* 23
CHECK-LEAP-VALIDATE-DAY.
PERFORM LEAP-YEAR-CALCS.
PERFORM POSS-LEAP-YEAR.
PERFORM VALIDATE-DAY.
PERFORM POSS-VALID-DATE.
COPY LEAPYEAR.
VALIDATE-DAY.
IF N-DAY > DAYS-IN-MONTH(N-MONTH)
OR N-DAY = ZERO
SET DAY-NOT-VALID TO TRUE
ELSE
SET DAY-VALID TO TRUE.
* 28
POSS-VALID-DATE.
IF DAY-VALID
SET DATE-VALID TO TRUE
ELSE
SET DATE-NOT-VALID TO TRUE.
RETURN-CONTROAL.
EXIT PROGRAM.
Link back to cobol page