IDENTIFICATIONDIVISION. * PROGRAM-ID. DATET. * DATE-WRITTEN. 04/10/89. * * MODIFIED 12/26/95. * 07/31/97. * 10/18/97. * * ******************************* * * * * * Judson D. McClendon * * * Sun Valley Systems * * * 329 37th Court N.E. * * * Birmingham, AL 35215 * * * 205-853-8440 * * * * * ******************************* * ENVIRONMENTDIVISION. * CONFIGURATIONSECTION. * INPUT-OUTPUTSECTION. * FILE-CONTROL. * I-O-CONTROL. * DATADIVISION. * FILESECTION. * WORKING-STORAGESECTION. * ****************************************************************** * * * 7 7 ' S * * * ****************************************************************** *
77 WS-ANSWER PIC X(01) VALUESPACE.
77 WS-ESCAPE-FLAG PIC 9(01) VALUE 0. * ****************************************************************** * * * S C R E E N H O L D A R E A * * * ****************************************************************** *
01 SCREEN-HOLD-AREA.
03 SH-EDIT-DATE PIC X(08) VALUESPACES. *
03 SH-WORK-MMDDYYYY PIC 9(08) VALUE 0.
03 SH-WORK-MMDDYYYY-ALPHA REDEFINES SH-WORK-MMDDYYYY.
05 SH-WORK-MONTH PIC 9(02).
05 SH-WORK-DAY PIC 9(02).
05 SH-WORK-YEAR PIC 9(04). *
03 SH-WORK-YYYYMMDD PIC 9(08) VALUE 0.
03 SH-WORK-YYYYMMDD-ALPHA REDEFINES SH-WORK-YYYYMMDD.
05 SH-WORK-YYYY PIC 9(04).
05 SH-WORK-MM PIC 9(02).
05 SH-WORK-DD PIC 9(02). *
03 SH-JUL-DATE PIC 9(07) VALUE 0.
03 SH-JUL-DATE-ALPHA REDEFINES SH-JUL-DATE.
05 SH-JUL-YYYY PIC 9(04).
05 SH-JUL-DDD PIC 9(03). *
03 SH-BEG-YYYYMMDD PIC 9(08) VALUE 0.
03 SH-BEG-YYYYMMDD-ALPHA REDEFINES SH-BEG-YYYYMMDD.
05 SH-BEG-YYYY PIC 9(04).
05 SH-BEG-MM PIC 9(02).
05 SH-BEG-DD PIC 9(02). *
03 SH-END-YYYYMMDD PIC 9(08) VALUE 0.
03 SH-END-YYYYMMDD-ALPHA REDEFINES SH-END-YYYYMMDD.
05 SH-END-YYYY PIC 9(04).
05 SH-END-MM PIC 9(02).
05 SH-END-DD PIC 9(02). *
03 SH-OFFSET PIC S9(08) VALUE 0.
03 SH-AGE-YEARS PIC 9(04) VALUE 0.
03 SH-AGE-MONTHS PIC 9(02) VALUE 0.
03 SH-AGE-DAYS PIC 9(02) VALUE 0.
03 SH-AGE-TOTDAYS PIC 9(08) VALUE 0. *
03 SH-YEARS PIC S9(07) VALUE 0.
03 SH-MONTHS PIC S9(07) VALUE 0.
03 SH-DAYS PIC S9(07) VALUE 0. *
03 SH-RESULT PIC X(20) VALUESPACES. * ****************************************************************** * * * D A T E W O R K A R E A * * * ****************************************************************** *
01 DATE-WORK-AREA.
03 DW-DATE-ERROR-FLAG PIC 9(01). * * * ** TODAYS DATE ** *
03 DW-TODAYS-DATE PIC 9(08).
03 DW-TODAYS-DATE-ALPHA REDEFINES DW-TODAYS-DATE.
05 DW-TODAYS-MONTH PIC 9(02).
05 DW-TODAYS-DAY PIC 9(02).
05 DW-TODAYS-YEAR PIC 9(04). *
03 DW-TODAYS-YYYYMMDD PIC 9(08).
03 DW-TODAYS-YYYYMMDD-ALPHA REDEFINES DW-TODAYS-YYYYMMDD.
05 DW-TODAYS-YYYY PIC 9(04).
05 DW-TODAYS-YYYY-R REDEFINES DW-TODAYS-YYYY.
07 DW-TODAYS-CC PIC 9(02).
07 DW-TODAYS-YY PIC 9(02).
05 DW-TODAYS-MM PIC 9(02).
05 DW-TODAYS-DD PIC 9(02). * * * ** DATE WORK AREA ** *
03 DW-WORK-DATE PIC 9(08).
03 DW-WORK-DATE-ALPHA REDEFINES DW-WORK-DATE.
05 DW-WORK-MONTH PIC 9(02).
05 DW-WORK-DAY PIC 9(02).
05 DW-WORK-YEAR PIC 9(04). *
03 DW-WORK-YYYYMMDD PIC 9(08).
03 DW-WORK-YYYYMMDD-ALPHA REDEFINES DW-WORK-YYYYMMDD.
05 DW-WORK-YYYY PIC 9(04).
05 DW-WORK-YYYY-R REDEFINES DW-WORK-YYYY.
07 DW-WORK-CC PIC 9(02).
07 DW-WORK-YY PIC 9(02).
05 DW-WORK-MM PIC 9(02).
05 DW-WORK-DD PIC 9(02). * * * ** SHORT MMDDYY DATE ** *
03 DW-SHORT-DATE PIC 9(06).
03 DW-SHORT-DATE-ALPHA REDEFINES DW-SHORT-DATE.
05 DW-SHORT-MONTH PIC 9(02).
05 DW-SHORT-DAY PIC 9(02).
05 DW-SHORT-YEAR PIC 9(02). * * * ** OFFSET DATE AREAS ** *
03 DW-OFFSET PIC S9(08). *
03 DW-OFFSET-UNSIGNED PIC 9(08).
03 DW-OFFSET-UNSIGNED-ALPHA REDEFINES DW-OFFSET-UNSIGNED.
05 DW-OFFSET-YYYY PIC 9(04).
05 DW-OFFSET-MM PIC 9(02).
05 DW-OFFSET-DD PIC 9(02). * * * ** JULIAN DATE ** *
03 DW-JUL-DATE PIC 9(07).
03 DW-JUL-DATE-ALPHA REDEFINES DW-JUL-DATE.
05 DW-JUL-YYYY PIC 9(04).
05 DW-JUL-YYYY-R REDEFINES DW-JUL-YYYY.
07 DW-JUL-CC PIC 9(02).
07 DW-JUL-YY PIC 9(02).
05 DW-JUL-DDD PIC 9(03). * * * ** BEGIN DATE ** *
03 DW-BEG-YYYYMMDD PIC 9(08).
03 DW-BEG-YYYYMMDD-ALPHA REDEFINES DW-BEG-YYYYMMDD.
05 DW-BEG-YYYY PIC 9(04).
05 DW-BEG-YYYY-R REDEFINES DW-BEG-YYYY.
07 DW-BEG-CC PIC 9(02).
07 DW-BEG-YY PIC 9(02).
05 DW-BEG-MM PIC 9(02).
05 DW-BEG-DD PIC 9(02). * * * ** END DATE ** *
03 DW-END-YYYYMMDD PIC 9(08).
03 DW-END-YYYYMMDD-ALPHA REDEFINES DW-END-YYYYMMDD.
05 DW-END-YYYY PIC 9(04).
05 DW-END-YYYY-R REDEFINES DW-END-YYYY.
07 DW-END-CC PIC 9(02).
07 DW-END-YY PIC 9(02).
05 DW-END-MM PIC 9(02).
05 DW-END-DD PIC 9(02). * * * ** RESULTS OF AGE COMPUTATION ** *
03 DW-AGE-YEARS PIC 9(04).
03 DW-AGE-MONTHS PIC 9(02).
03 DW-AGE-DAYS PIC 9(02).
03 DW-AGE-TOTDAYS PIC 9(08). * * * ** INPUT/OUTPUT VARIABLES ** *
03 DW-YEARS PIC S9(07).
03 DW-MONTHS PIC S9(07).
03 DW-DAYS PIC S9(07).
03 DW-WEEKDAY PIC 9(01). * * * ** SCRATCH WORK AREAS FOR DATE ROUTINES ** * ** (ASSUME MODIFIED BY ALL DATE ROUTINES) ** *
03 DW-WORK1 PIC S9(09).
03 DW-WORK2 PIC S9(09).
03 DW-WORK3 PIC S9(09).
03 DW-TEMP-YYYY PIC S9(09).
03 DW-TEMP-MM PIC S9(09). * * * ** NUMBER OF DAYS IN EACH MONTH ** * ** (DAYS IN FEBRUARY ARE ADJUSTED BY DATE ROUTINES) ** *
03 DW-DAYS-IN-MONTHS VALUE"312831303130313130313031".
05 DW-DAYS-IN-MONTH OCCURS 12 TIMES PIC 9(02). * * * ** HOLIDAY TABLE ** * * ** THIS TABLE CONTAINS EVERY HOLIDAY ON WHICH THE BUSINESS ** * ** OFFICE IS CLOSED. IT SHOULD BE UPDATED EVERY YEAR TO ** * ** INCLUDE ALL THE DATES OVER WHICH BUSINESS DAYS MIGHT ** * ** NEED TO BE CALCULATED. NO NEED TO ADD WEEKEND DATES. ** * * ** THE ENTRIES IN THIS TABLE CONSIST OF AN 8-DIGIT DATE ** * ** (YYYYMMDD), FOLLOWED BY A 2-DIGIT COUNT OF DAYS WHICH ** * ** MUST BE ADDED TO THE DATE TO GET THE NEXT BUSINESS DAY. ** * * ** EXAMPLE: THANKSGIVING, 1997, OFF THURSDAY 11/27 AND ** * ** FRIDAY 11/28 UNTIL THE NEXT MONDAY 11/31. THE ENTRIES ** * ** IN THE TABLE WOULD BE: 1997 11 27 04 AND 1997 11 28 03 ** * * ** EXAMPLE: CHRISTMAS, 1998, OFF FRIDAY 12/25 THROUGH ** * ** MONDAY 12/28 UNTIL TUESDAY 12/29. THE ENTRIES IN THE ** * ** TABLE WOULD BE: 1998 12 25 04 AND 1998 12 28 01 ** *
03 DW-HOLIDAY-TABLE.
05 DW-HT-VALUES. * YYYYMMDDCC
07 FILLERPIC 9(10) VALUE 1997112704.
07 FILLERPIC 9(10) VALUE 1997112803.
07 FILLERPIC 9(10) VALUE 1998122504.
07 FILLERPIC 9(10) VALUE 1998122801. *
05 DW-HT-HOLIDAYS REDEFINES DW-HT-VALUES OCCURS 4 TIMES INDEXEDBY DW-HT-HX.
07 DW-HT-DATE.
09 DW-HT-YYYY PIC 9(04).
09 DW-HT-YYYY-R REDEFINES DW-HT-YYYY.
11 DW-HT-CC PIC 9(02).
11 DW-HT-YY PIC 9(02).
09 DW-HT-MM PIC 9(02).
09 DW-HT-DD PIC 9(02).
07 DW-HT-DAYS PIC 9(02). * * * ** WEEKDAY NAMES ** *
03 DW-DAY-NAMES VALUE"SUNMONTUEWEDTHUFRISAT".
05 DW-DAY-NAME OCCURS 7 TIMES PIC X(03). *
SCREEN SECTION. * * * M E N U S C R E E N *
01 MENU-SCREEN.
03 BLANK SCREEN.
03 LINE 01 COLUMN 21 VALUE "D A T E R O U T I N E T E S T". *
03 LINE 03 COLUMN 10 VALUE"Press: A = Date Edit".
03 LINE 04 COLUMN 17 VALUE"B = Date days".
03 LINE 05 COLUMN 17 VALUE"C = Weekday".
03 LINE 06 COLUMN 17 VALUE"D = Add Days".
03 LINE 07 COLUMN 17 VALUE"E = Sub Days".
03 LINE 08 COLUMN 17 VALUE"F = Add Months".
03 LINE 09 COLUMN 17 VALUE"G = Sub Months".
03 LINE 10 COLUMN 17 VALUE"H = Add Years".
03 LINE 11 COLUMN 17 VALUE"I = Sub Years".
03 LINE 03 COLUMN 37 VALUE"J = Calc Offset".
03 LINE 04 COLUMN 37 VALUE"K = Compute Age".
03 LINE 05 COLUMN 37 VALUE"L = Greg to Jul".
03 LINE 06 COLUMN 37 VALUE"M = Jul to Greg".
03 LINE 07 COLUMN 37 VALUE"N = Add Days, Business".
03 LINE 12 COLUMN 25 VALUE"Esc = Exit: ".
03 PIC X TO WS-ANSWER AUTO. * * * I N P U T S C R E E N S * * * G E T E D I T D A T E *
01 GET-EDIT-DATE-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Date (MMDDYYYY): ".
03 PIC X(08) USING SH-EDIT-DATE. * * * G E T W O R K M M D D Y Y Y Y *
01 GET-WORK-MMDDYYYY-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Date (MM/DD/YYYY): ".
03 PIC 99/99/9999 USING SH-WORK-MMDDYYYY. * * * G E T W O R K Y Y Y Y M M D D *
01 GET-WORK-YYYYMMDD-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 USING SH-WORK-YYYYMMDD. * * * G E T J U L Y Y Y Y D D D *
01 GET-JUL-YYYYDDD-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Julian Date (YYYY/DDD): ".
03 PIC 9999/999 USING SH-JUL-DATE. * * * G E T D A T E D A Y S *
01 GET-DATE-DAYS-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 USING SH-WORK-YYYYMMDD.
03 LINE 16 COLUMN 10 VALUE"Days: ".
03 PIC ZZZZZZ USING SH-DAYS. * * * G E T D A T E M O N T H S *
01 GET-DATE-MONTHS-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 USING SH-WORK-YYYYMMDD.
03 LINE 16 COLUMN 10 VALUE"Months: ".
03 PIC ZZZZZZ USING SH-MONTHS. * * * G E T D A T E Y E A R S *
01 GET-DATE-YEARS-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 USING SH-WORK-YYYYMMDD.
03 LINE 16 COLUMN 10 VALUE"Years: ".
03 PIC ZZZZ USING SH-YEARS. * * * G E T D A T E O F F S E T *
01 GET-DATE-OFFSET-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 USING SH-WORK-YYYYMMDD.
03 LINE 16 COLUMN 10 VALUE"Offset (ñYYYY/MM/DD): ".
03 PIC -9999/99/99 USING SH-OFFSET. * * * G E T B E G / E N D D A T E S *
01 GET-BEG-END-YYYYMMDD-SCREEN.
03 LINE 14 COLUMN 10 VALUE"Begin Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 USING SH-BEG-YYYYMMDD.
03 LINE 16 COLUMN 10 VALUE"End Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 USING SH-END-YYYYMMDD. * * * O U T P U T S C R E E N S * * * S H O W R E S U L T *
01 SHOW-RESULT-SCREEN.
03 LINE 18 COLUMN 20 PIC X(20) FROM SH-RESULT. * * * S H O W D A T E D A Y S *
01 SHOW-DATE-DAYS-SCREEN.
03 LINE 18 COLUMN 20 VALUE"Date Day: ".
03 PIC Z,ZZZ,ZZ9 FROM SH-DAYS. * * * S H O W N E W D A T E *
01 SHOW-NEW-DATE-SCREEN.
03 LINE 18 COLUMN 20 VALUE"New Date: ".
03 PIC 9999/99/99 FROM SH-WORK-YYYYMMDD. * * * S H O W A G E *
01 SHOW-AGE-SCREEN.
03 LINE 18 COLUMN 20 VALUE"Years: ".
03 PIC Z,ZZZ,ZZZ FROM SH-AGE-YEARS.
03 LINE 19 COLUMN 20 VALUE"Months: ".
03 PIC Z,ZZZ,ZZZ FROM SH-AGE-MONTHS.
03 LINE 20 COLUMN 20 VALUE"Days: ".
03 PIC Z,ZZZ,ZZZ FROM SH-AGE-DAYS.
03 LINE 22 COLUMN 20 VALUE"Days Only: ".
03 PIC ZZ,ZZZ,ZZZ FROM SH-AGE-TOTDAYS. * * * S H O W J U L Y Y Y Y D D D *
01 SHOW-JUL-YYYYDDD-SCREEN.
03 LINE 18 COLUMN 10 VALUE"Julian Date: ".
03 PIC 9999/999 FROM SH-JUL-DATE. * * * S H O W Y Y Y Y M M D D *
01 SHOW-YYYYMMDD-SCREEN.
03 LINE 18 COLUMN 10 VALUE"Date (YYYY/MM/DD): ".
03 PIC 9999/99/99 FROM SH-WORK-YYYYMMDD. * * * S H O W M M D D Y Y Y Y *
01 SHOW-MMDDYYYY-SCREEN.
03 LINE 18 COLUMN 10 VALUE"Date (MM/DD/YYYY): ".
03 PIC 99/99/9999 FROM SH-WORK-MMDDYYYY. * PROCEDUREDIVISION. * * * C O N T R O L *
000000-CONTROL. * PERFORM 000100-PROCESS
THRU 000100-EXIT UNTIL (WS-ESCAPE-FLAG = 1). *
000000-EXIT. STOPRUN. * * * P R O C E S S *
000100-PROCESS. * MOVESPACETO WS-ANSWER. DISPLAY MENU-SCREEN. ACCEPT MENU-SCREEN ON ESCAPE MOVE 1 TO WS-ESCAPE-FLAG GOTO 000100-EXIT. INSPECT WS-ANSWER CONVERTING"abcdefghijklmnopqrstuvwxyz" TO"ABCDEFGHIJKLMNOPQRSTUVWXYZ". * INITIALIZE SCREEN-HOLD-AREA. * IF (WS-ANSWER = "A") PERFORM 010000-DATE-EDIT
THRU 010000-EXIT ELSE IF (WS-ANSWER = "B") PERFORM 020000-DATE-DAYS
THRU 020000-EXIT ELSE IF (WS-ANSWER = "C") PERFORM 030000-WEEKDAY
THRU 030000-EXIT ELSE IF (WS-ANSWER = "D") PERFORM 040000-ADD-DAYS
THRU 040000-EXIT ELSE IF (WS-ANSWER = "E") PERFORM 050000-SUBTRACT-DAYS
THRU 050000-EXIT ELSE IF (WS-ANSWER = "F") PERFORM 060000-ADD-MONTHS
THRU 060000-EXIT ELSE IF (WS-ANSWER = "G") PERFORM 070000-SUBTRACT-MONTHS
THRU 070000-EXIT ELSE IF (WS-ANSWER = "H") PERFORM 080000-ADD-YEARS
THRU 080000-EXIT ELSE IF (WS-ANSWER = "I") PERFORM 090000-SUBTRACT-YEARS
THRU 090000-EXIT ELSE IF (WS-ANSWER = "J") PERFORM 100000-CALC-OFFSET
THRU 100000-EXIT ELSE IF (WS-ANSWER = "K") PERFORM 110000-COMPUTE-AGE
THRU 110000-EXIT ELSE IF (WS-ANSWER = "L") PERFORM 120000-GREG-JUL
THRU 120000-EXIT ELSE IF (WS-ANSWER = "M") PERFORM 130000-JUL-GREG
THRU 130000-EXIT ELSE IF (WS-ANSWER = "N") PERFORM 140000-ADD-DAYS-BUSINESS
THRU 140000-EXIT. * MOVE 0 TO WS-ESCAPE-FLAG. *
000100-EXIT. EXIT. * ****************************************************************** * * * D A T E E D I T * * * * Judson D. McClendon * * Sun Valley Systems * * 329 37th Court NE * * Birmingham, AL 35215 * * 205/853-8440 * * * * USAGE: MOVE <MMDDYYYY DATE> TO DW-WORK-DATE-ALPHA. * * PERFORM 001000-DATE-EDIT * * THRU 001000-EXIT. * * * * RESULT: DW-DATE-ERROR-FLAG = 0 IF DATE IS VALID * * DW-DATE-ERROR-FLAG = 1 IF DATE IS NOT VALID * * * * DW-WORK-YYYYMMDD = GIVEN DATE IN YYYYMMDD FORMAT * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001000-DATE-EDIT. * * ** ERROR FLAG WILL BE RESET TO 0 ON GOOD EXIT ** * MOVE 1 TO DW-DATE-ERROR-FLAG. * IF (DW-WORK-DATE-ALPHA NOTNUMERIC) GOTO 001000-EXIT. * MOVE DW-WORK-YEAR TO DW-WORK-YYYY. MOVE DW-WORK-MONTH TO DW-WORK-MM. MOVE DW-WORK-DAY TO DW-WORK-DD. * IF (DW-WORK-MM < 01 OR > 12) GOTO 001000-EXIT. * * ** SET DAYS IN FEBRUARY ** * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * IF (DW-WORK-DD < 01) OR
(DW-WORK-DD > DW-DAYS-IN-MONTH(DW-WORK-MM)) GOTO 001000-EXIT. * * ** GOOD DATE ** * MOVE 0 TO DW-DATE-ERROR-FLAG. *
001000-EXIT. EXIT. * * * ****************************************************************** * * * C A L C U L A T E D A T E D A Y N U M B E R * * * * * * RETURNS A NUMBER WHICH IS ONE GREATER FOR EACH SUCCESSIVE * * DATE. * * * * USAGE: MOVE <FIRST DATE> TO DW-WORK-YYYYMMDD. * * PERFORM 001100-DATE-DAYS * * THRU 001100-EXIT. * * * * RESULT: DW-DAYS = DATE DAY NUMBER * * * * * * THIS ROUTINE USES A VARIATION OF ZELLER'S CONGRUENCE. * * THE FORMULA IS: * * * * <DATE DAY NBR> = ( (YEAR * 365) * * + INT(YEAR / 4) * * - INT(YEAR / 100) * * + INT(YEAR / 400) * * + INT(MONTH * 30.6001) * * + DAY) ) * * * * WHERE: DAY = DAY OF THE MONTH * * * * MONTH = MONTH + 13 (JAN & FEB) * * MONTH + 1 (MAR - DEC) * * * * YEAR = YEAR - 1 (JAN & FEB) * * YEAR (MAR - DEC) * * * * INT(...) MEANS TAKE THE INTEGER PART (NO ROUNDING) * * * * * * THE DATE-DAY-NUMBER CAN BE USED TO DETERMINE THE NUMBER OF * * DAYS BETWEEN TWO DATES BY COMPUTING THE DAY NUMBER OF EACH * * DATE AND SUBTRACTING, LIKE THIS: * * * * MOVE <FIRST DATE> TO DW-WORK-YYYYMMDD. * * PERFORM 001100-DATE-DAYS * * THRU 001100-EXIT. * * MOVE DW-DAYS TO <HOLD DAY>. * * MOVE <SECOND DATE> TO DW-WORK-YYYYMMDD. * * PERFORM 001100-DATE-DAYS * * THRU 001100-EXIT. * * SUBTRACT DW-DAYS FROM <HOLD DAY> * * GIVING <DAYS BETWEEN DATES>. * * * ****************************************************************** *
001100-DATE-DAYS. * * ** ADJUST YEAR AND MONTH ** * MOVE DW-WORK-YYYY TO DW-TEMP-YYYY. MOVE DW-WORK-MM TO DW-TEMP-MM. IF (DW-WORK-MM < 03) ADD 13 TO DW-TEMP-MM SUBTRACT 1 FROM DW-TEMP-YYYY ELSE ADD 1 TO DW-TEMP-MM. * MULTIPLY DW-TEMP-YYYY BY 365 GIVING DW-DAYS. * DIVIDE DW-TEMP-YYYY BY 4 GIVING DW-WORK1. ADD DW-WORK1 TO DW-DAYS. * DIVIDE DW-TEMP-YYYY BY 100 GIVING DW-WORK1. SUBTRACT DW-WORK1 FROM DW-DAYS. * DIVIDE DW-TEMP-YYYY BY 400 GIVING DW-WORK1. ADD DW-WORK1 TO DW-DAYS. * MULTIPLY DW-TEMP-MM BY 30.6001 GIVING DW-WORK1. ADD DW-WORK1 TO DW-DAYS. * ADD DW-WORK-DD TO DW-DAYS. *
001100-EXIT. EXIT. * * * ****************************************************************** * * * C A L C U L A T E D A Y O F W E E K * * * * * * WHEN GIVEN ANY DATE THIS ROUTINE RETURNS A NUMBER FROM * * 1 TO 7 INDICATING THE DAY OF WEEK ON WHICH THE DATE FALLS. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * PERFORM 001200-WEEKDAY * * THRU 001200-EXIT. * * * * RESULT: DW-WEEKDAY = DAY OF WEEK * * * * * * THIS ROUTINE USES ZELLER'S CONGRUENCE, EXPRESSED BY THE * * FOLLOWING FORMULA: * * * * <WEEKDAY> = (INT((13 * MONTH + 3) / 5) * * + DAY * * + YEAR * * + INT(YEAR / 4) * * - INT(YEAR / 100) * * + INT(YEAR / 400) * * + 1) MOD 7) + 1 * * * * WHERE: WEEKDAY = 1 TO 7 WITH 1 = SUNDAY 5 = THURSDAY * * 2 = MONDAY 6 = FRIDAY * * 3 = TUESDAY 7 = SATURDAY * * 4 = WEDNESDAY * * * * DAY = DAY OF THE MONTH * * * * MONTH = MONTH OF THE YEAR (JAN AND FEB COUNT AS * * MONTHS 13 AND 14 OF THE PREVIOUS YEAR) * * * * YEAR = FOUR DIGIT YEAR (YEAR - 1 IF MONTH IS * * JAN OR FEB) * * * * INT(...) MEANS TAKE THE INTEGER PART (NO ROUNDING) * * * * X MOD Y MEANS THE REMAINDER AFTER DIVIDING Y * * INTO X * * * ****************************************************************** *
001200-WEEKDAY. * * ** ADJUST YEAR AND MONTH IF MONTH = JAN OR FEB ** * MOVE DW-WORK-YYYY TO DW-TEMP-YYYY. MOVE DW-WORK-MM TO DW-TEMP-MM. IF (DW-WORK-MM < 03) ADD 12 TO DW-TEMP-MM SUBTRACT 1 FROM DW-TEMP-YYYY. * * ** CALCULATE INTO DW-WORK1 ** * COMPUTE DW-WORK1 = (13 * DW-TEMP-MM + 3) / 5. * ADD DW-WORK-DD
DW-TEMP-YYYY TO DW-WORK1. * DIVIDE DW-TEMP-YYYY BY 4 GIVING DW-WORK2. ADD DW-WORK2 TO DW-WORK1. * DIVIDE DW-TEMP-YYYY BY 100 GIVING DW-WORK2. SUBTRACT DW-WORK2 FROM DW-WORK1. * DIVIDE DW-TEMP-YYYY BY 400 GIVING DW-WORK2. ADD DW-WORK2 TO DW-WORK1. * ADD 1 TO DW-WORK1. * DIVIDE DW-WORK1 BY 7 GIVING DW-WORK2 REMAINDER DW-WEEKDAY. ADD 1 TO DW-WEEKDAY. *
001200-EXIT. EXIT. * * * ****************************************************************** * * * A D D D A Y S T O A D A T E * * * * * * WHEN GIVEN ANY DATE AND A NUMBER OF DAYS THIS ROUTINE WILL * * ADD THE NUMBER OF DAYS TO THE DATE. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <DAYS> TO DW-DAYS. * * PERFORM 001300-ADD-DAYS * * THRU 001300-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE AFTER DAYS ADDED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001300-ADD-DAYS. * * ** SET DAYS IN FEBRUARY ** * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * ADD DW-WORK-DD TO DW-DAYS. * PERFORM 001320-LOOP-MONTH
THRU 001320-EXIT UNTIL (DW-DAYS NOT > DW-DAYS-IN-MONTH(DW-WORK-MM)). * MOVE DW-DAYS TO DW-WORK-DD. *
001300-EXIT. EXIT. * * *
001320-LOOP-MONTH. * SUBTRACT DW-DAYS-IN-MONTH(DW-WORK-MM) FROM DW-DAYS. * ADD 1 TO DW-WORK-MM. IF (DW-WORK-MM > 12) ADD 1 TO DW-WORK-YYYY SUBTRACT 12 FROM DW-WORK-MM. * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). *
001320-EXIT. EXIT. * * * ****************************************************************** * * * S U B T R A C T D A Y S F R O M A D A T E * * * * * * WHEN GIVEN ANY DATE AND A NUMBER OF DAYS THIS ROUTINE WILL * * SUBTRACT THE NUMBER OF DAYS FROM THE DATE. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <DAYS> TO DW-DAYS. * * PERFORM 001400-SUBTRACT-DAYS * * THRU 001400-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE AFTER DAYS SUBTRACTED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001400-SUBTRACT-DAYS. * SUBTRACT DW-DAYS FROM DW-WORK-DD GIVING DW-DAYS. * PERFORM 001420-LOOP-MONTH
THRU 001420-EXIT UNTIL (DW-DAYS > 0). * MOVE DW-DAYS TO DW-WORK-DD. *
001400-EXIT. EXIT. * * *
001420-LOOP-MONTH. * SUBTRACT 1 FROM DW-WORK-MM. IF (DW-WORK-MM < 01) SUBTRACT 1 FROM DW-WORK-YYYY ADD 12 TO DW-WORK-MM. * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * ADD DW-DAYS-IN-MONTH(DW-WORK-MM) TO DW-DAYS. *
001420-EXIT. EXIT. * * * ****************************************************************** * * * A D D M O N T H S T O A D A T E * * * * * * WHEN GIVEN ANY DATE AND A NUMBER OF MONTHS THIS ROUTINE * * WILL ADD THE NUMBER OF MONTHS TO THE DATE. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <MONTHS> TO DW-MONTHS. * * PERFORM 001500-ADD-MONTHS * * THRU 001500-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE AFTER MONTHS ADDED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001500-ADD-MONTHS. * ADD DW-WORK-MM TO DW-MONTHS. * PERFORM 001520-LOOP-YEAR
THRU 001520-EXIT UNTIL (DW-MONTHS NOT > 12). * MOVE DW-MONTHS TO DW-WORK-MM. * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * IF (DW-WORK-DD > DW-DAYS-IN-MONTH(DW-WORK-MM)) MOVE DW-DAYS-IN-MONTH(DW-WORK-MM) TO DW-WORK-DD. *
001500-EXIT. EXIT. * * *
001520-LOOP-YEAR. * SUBTRACT 12 FROM DW-MONTHS. ADD 1 TO DW-WORK-YYYY. *
001520-EXIT. EXIT. * * * ****************************************************************** * * * S U B T R A C T M O N T H S F R O M A D A T E * * * * * * WHEN GIVEN ANY DATE AND A NUMBER OF MONTHS THIS ROUTINE * * WILL SUBTRACT THE NUMBER OF MONTHS FROM THE DATE. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <MONTHS> TO DW-MONTHS. * * PERFORM 001600-SUBTRACT-MONTHS * * THRU 001600-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE AFTER MONTHS SUBTRACTED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001600-SUBTRACT-MONTHS. * SUBTRACT DW-MONTHS FROM DW-WORK-MM GIVING DW-MONTHS. * PERFORM 001620-LOOP-YEAR
THRU 001620-EXIT UNTIL (DW-MONTHS > 0). * MOVE DW-MONTHS TO DW-WORK-MM. * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * IF (DW-WORK-DD > DW-DAYS-IN-MONTH(DW-WORK-MM)) MOVE DW-DAYS-IN-MONTH(DW-WORK-MM) TO DW-WORK-DD. *
001600-EXIT. EXIT. * * *
001620-LOOP-YEAR. * ADD 12 TO DW-MONTHS. SUBTRACT 1 FROM DW-WORK-YYYY. *
001620-EXIT. EXIT. * * * ****************************************************************** * * * A D D Y E A R S T O A D A T E * * * * * * WHEN GIVEN ANY DATE AND A NUMBER OF YEARS THIS ROUTINE * * WILL ADD THE NUMBER OF YEARS TO THE DATE. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <YEARS> TO DW-YEARS. * * PERFORM 001700-ADD-YEARS * * THRU 001700-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE AFTER YEARS ADDED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001700-ADD-YEARS. * ADD DW-YEARS TO DW-WORK-YYYY. * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * IF (DW-WORK-DD > DW-DAYS-IN-MONTH(DW-WORK-MM)) MOVE DW-DAYS-IN-MONTH(DW-WORK-MM) TO DW-WORK-DD. *
001700-EXIT. EXIT. * * * ****************************************************************** * * * S U B T R A C T Y E A R S F R O M A D A T E * * * * * * WHEN GIVEN ANY DATE AND A NUMBER OF YEARS THIS ROUTINE * * WILL SUBTRACT THE NUMBER OF YEARS FROM THE DATE. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <YEARS> TO DW-YEARS. * * PERFORM 001800-SUBTRACT-YEARS * * THRU 001800-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE AFTER YEARS SUBTRACTED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001800-SUBTRACT-YEARS. * SUBTRACT DW-YEARS FROM DW-WORK-YYYY. * MOVE 28 TO DW-DAYS-IN-MONTH(2). DIVIDE 400 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2. IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-WORK-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * IF (DW-WORK-DD > DW-DAYS-IN-MONTH(DW-WORK-MM)) MOVE DW-DAYS-IN-MONTH(DW-WORK-MM) TO DW-WORK-DD. *
001800-EXIT. EXIT. * * * ****************************************************************** * * * C A L C U L A T E D A T E O F F S E T * * * * * * ADDS A SIGNED OFFSET IN THE FORM +-YYYYMMDD TO A DATE * * IN YYYYMMDD FORM. * * * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <OFFSET> TO DW-OFFSET. * * PERFORM 001900-CALC-OFFSET * * THRU 001900-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD DATE AFTER OFFSET APPLIED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
001900-CALC-OFFSET. * MOVE DW-OFFSET TO DW-OFFSET-UNSIGNED. * IF (DW-OFFSET POSITIVE) ADD DW-OFFSET-YYYY TO DW-WORK-YYYY MOVE DW-OFFSET-MM TO DW-MONTHS PERFORM 001500-ADD-MONTHS
THRU 001500-EXIT MOVE DW-OFFSET-DD TO DW-DAYS PERFORM 001300-ADD-DAYS
THRU 001300-EXIT ELSE IF (DW-OFFSET NEGATIVE) SUBTRACT DW-OFFSET-YYYY FROM DW-WORK-YYYY PERFORM 001920-SUBTRACT-MONTH
THRU 001920-EXIT
DW-OFFSET-MM TIMES MOVE DW-OFFSET-DD TO DW-DAYS PERFORM 001400-SUBTRACT-DAYS
THRU 001400-EXIT. *
001900-EXIT. EXIT. * * *
001920-SUBTRACT-MONTH. * SUBTRACT 1 FROM DW-WORK-MM. IF (DW-WORK-MM < 01) SUBTRACT 1 FROM DW-WORK-YYYY ADD 12 TO DW-WORK-MM. *
001920-EXIT. EXIT. * * * ****************************************************************** * * * C O M P U T E A G E * * * * * * WHEN GIVEN THE BEGIN DATE AND END DATE THIS ROUTINE * * CALCULATES THE AGE IN YEARS, MONTHS, DAYS AND TOTAL DAYS. * * * * * * USAGE: MOVE <BEGIN DATE> TO DW-BEG-YYYYMMDD. * * MOVE <END DATE> TO DW-END-YYYYMMDD. * * PERFORM 002000-COMPUTE-AGE * * THRU 002000-EXIT. * * * * RESULT: DW-AGE-YEARS = WHOLE YEARS * * DW-AGE-MONTHS = MONTHS OVER WHOLE YEAR * * DW-AGE-DAYS = DAYS OVER WHOLE MONTH * * * * (IE: AGE = YEARS + MONTHS + DAYS) * * * * DW-AGE-TOTDAYS = TOTAL AGE IN DAYS * * * * DW-BEG-YYYYMMDD = HAS BEEN MODIFIED * * DW-END-YYYYMMDD = HAS BEEN MODIFIED * * * ****************************************************************** *
002000-COMPUTE-AGE. * * ** CALCULATE AGE IN DAYS ** * MOVE DW-END-YYYYMMDD TO DW-WORK-YYYYMMDD. PERFORM 001100-DATE-DAYS
THRU 001100-EXIT. MOVE DW-DAYS TO DW-AGE-TOTDAYS. * MOVE DW-BEG-YYYYMMDD TO DW-WORK-YYYYMMDD. PERFORM 001100-DATE-DAYS
THRU 001100-EXIT. SUBTRACT DW-DAYS FROM DW-AGE-TOTDAYS. * * ** CALCULATE AGE IN YEARS, MONTHS & DAYS ** * IF (DW-END-DD < DW-BEG-DD) PERFORM 002020-ROLL-DAY
THRU 002020-EXIT. COMPUTE DW-AGE-DAYS = DW-END-DD - DW-BEG-DD. * IF (DW-END-MM < DW-BEG-MM) PERFORM 002040-ROLL-MONTH
THRU 002040-EXIT. COMPUTE DW-AGE-MONTHS = DW-END-MM - DW-BEG-MM. * COMPUTE DW-AGE-YEARS = DW-END-YYYY - DW-BEG-YYYY. *
002000-EXIT. EXIT. * * *
002020-ROLL-DAY. * SUBTRACT 1 FROM DW-END-MM. * IF (DW-END-MM < 01) PERFORM 002040-ROLL-MONTH
THRU 002040-EXIT. * IF (DW-END-MM = 02) MOVE 28 TO DW-DAYS-IN-MONTH(2) DIVIDE 400 INTO DW-END-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2) ELSE DIVIDE 100 INTO DW-END-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 NOT = 0) DIVIDE 4 INTO DW-END-YYYY GIVING DW-WORK1 REMAINDER DW-WORK2 IF (DW-WORK2 = 0) MOVE 29 TO DW-DAYS-IN-MONTH(2). * ADD DW-DAYS-IN-MONTH(DW-END-MM) TO DW-END-DD. *
002020-EXIT. EXIT. * * *
002040-ROLL-MONTH. * SUBTRACT 1 FROM DW-END-YYYY. * ADD 12 TO DW-END-MM. *
002040-EXIT. EXIT. * * * ****************************************************************** * * * G R E G O R I A N T O J U L I A N * * * * * * CONVERTS A DATE IN GREGORIAN DATE FORM (YYYYMMDD) INTO * * JULIAN DATE FORM (YYYYDDD). * * * * * * USAGE: MOVE <GREGORIAN DATE> TO DW-WORK-YYYYMMDD * * PERFORM 002100-GREG-JUL * * THRU 002100-EXIT. * * * * RESULT: DW-JUL-DATE = DATE IN JULIAN DATE FORM (YYYYDDD) * * * * DW-WORK-YYYYMMDD = HAS BEEN MODIFIED * * * ****************************************************************** *
002100-GREG-JUL. * MOVE DW-WORK-YYYY TO DW-JUL-YYYY. * PERFORM 001100-DATE-DAYS
THRU 001100-EXIT. * MOVE DW-DAYS TO DW-WORK3. * SUBTRACT 1 FROM DW-JUL-YYYY GIVING DW-WORK-YYYY. * MOVE 12 TO DW-WORK-MM. * MOVE 31 TO DW-WORK-DD. * PERFORM 001100-DATE-DAYS
THRU 001100-EXIT. * SUBTRACT DW-DAYS FROM DW-WORK3 GIVING DW-JUL-DDD. *
002100-EXIT. EXIT. * * * ****************************************************************** * * * J U L I A N T O G R E G O R I A N * * * * * * CONVERTS A DATE IN JULIAN DATE FORM (YYYYDDD) INTO * * GREGORIAN DATE FORM (YYYYMMDD). * * * * * * USAGE: MOVE <JUILAN DATE> TO DW-JUL-DATE. * * PERFORM 002200-JUL-GREG * * THRU 002200-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE IN GREGORIAN FORM * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
002200-JUL-GREG. * SUBTRACT 1 FROM DW-JUL-YYYY GIVING DW-WORK-YYYY. * MOVE 12 TO DW-WORK-MM. * MOVE 31 TO DW-WORK-DD. * MOVE DW-JUL-DDD TO DW-DAYS. * PERFORM 001300-ADD-DAYS
THRU 001300-EXIT. *
002200-EXIT. EXIT. * * * ****************************************************************** * * * A D D D A Y S T O A D A T E, B U S I N E S S * * * * * * WHEN GIVEN ANY DATE AND A NUMBER OF DAYS THIS ROUTINE WILL * * ADD THE NUMBER OF DAYS TO THE DATE AND RETURN THE FIRST * * BUSINESS DAY ON OR AFTER THE RESULTANT DATE. * * * * USAGE: MOVE <DATE> TO DW-WORK-YYYYMMDD. * * MOVE <DAYS> TO DW-DAYS. * * PERFORM 002300-ADD-DAYS-BUSINESS * * THRU 002300-EXIT. * * * * RESULT: DW-WORK-YYYYMMDD = DATE AFTER DAYS ADDED * * DW-DAYS-IN-MONTH = CORRECT FOR YEAR OF THIS DATE * * * ****************************************************************** *
002300-ADD-DAYS-BUSINESS. * PERFORM 001300-ADD-DAYS
THRU 001300-EXIT. * PERFORM 001200-WEEKDAY
THRU 001200-EXIT. * IF (DW-WEEKDAY = 7) MOVE 2 TO DW-DAYS PERFORM 001300-ADD-DAYS
THRU 001300-EXIT ELSE IF (DW-WEEKDAY = 1) MOVE 1 TO DW-DAYS PERFORM 001300-ADD-DAYS
THRU 001300-EXIT. * * ** IF DATE IS A HOLIDAY, ADD NBR DAYS TO NEXT BUSINESS DAY ** * SET DW-HT-HX TO 1. SEARCH DW-HT-HOLIDAYS WHEN (DW-HT-DATE(DW-HT-HX) = DW-WORK-YYYYMMDD) MOVE DW-HT-DAYS(DW-HT-HX) TO DW-DAYS PERFORM 001300-ADD-DAYS
THRU 001300-EXIT. *
002300-EXIT. EXIT. * * * T E S T D A T E E D I T *
010000-DATE-EDIT. * DISPLAY GET-EDIT-DATE-SCREEN. ACCEPT GET-EDIT-DATE-SCREEN ON ESCAPE GOTO 010000-EXIT. * MOVE SH-EDIT-DATE TO DW-WORK-DATE-ALPHA. * PERFORM 001000-DATE-EDIT
THRU 001000-EXIT. * IF (DW-DATE-ERROR-FLAG = 0) MOVE"DATE VALID"TO SH-RESULT ELSE MOVE"DATE INVALID"TO SH-RESULT. DISPLAY SHOW-RESULT-SCREEN. * GOTO 010000-DATE-EDIT. *
010000-EXIT. EXIT. * * * T E S T D A T E D A Y S *
020000-DATE-DAYS. * DISPLAY GET-WORK-YYYYMMDD-SCREEN. ACCEPT GET-WORK-YYYYMMDD-SCREEN ON ESCAPE GOTO 020000-EXIT. * MOVE SH-WORK-YYYY TO DW-WORK-YYYY. MOVE SH-WORK-MM TO DW-WORK-MM. MOVE SH-WORK-DD TO DW-WORK-DD. * PERFORM 001100-DATE-DAYS
THRU 001100-EXIT. * MOVE DW-DAYS TO SH-DAYS. DISPLAY SHOW-DATE-DAYS-SCREEN. * GOTO 020000-DATE-DAYS. *
020000-EXIT. EXIT. * * * T E S T W E E K D A Y *
030000-WEEKDAY. * DISPLAY GET-WORK-YYYYMMDD-SCREEN. ACCEPT GET-WORK-YYYYMMDD-SCREEN ON ESCAPE GOTO 030000-EXIT. * MOVE SH-WORK-YYYY TO DW-WORK-YYYY. MOVE SH-WORK-MM TO DW-WORK-MM. MOVE SH-WORK-DD TO DW-WORK-DD. * PERFORM 001200-WEEKDAY
THRU 001200-EXIT. * MOVE DW-DAY-NAME(DW-WEEKDAY) TO SH-RESULT. DISPLAY SHOW-RESULT-SCREEN. * GOTO 030000-WEEKDAY. *
030000-EXIT. EXIT. * * * T E S T A D D D A Y S *
040000-ADD-DAYS. * DISPLAY GET-DATE-DAYS-SCREEN. ACCEPT GET-DATE-DAYS-SCREEN ON ESCAPE GOTO 040000-EXIT. * MOVE SH-WORK-YYYY TO DW-WORK-YYYY. MOVE SH-WORK-MM TO DW-WORK-MM. MOVE SH-WORK-DD TO DW-WORK-DD. MOVE SH-DAYS TO DW-DAYS. * PERFORM 001300-ADD-DAYS
THRU 001300-EXIT. * MOVE DW-WORK-YYYY TO SH-WORK-YYYY. MOVE DW-WORK-MM TO SH-WORK-MM. MOVE DW-WORK-DD TO SH-WORK-DD. DISPLAY SHOW-NEW-DATE-SCREEN. * GOTO 040000-ADD-DAYS. *
040000-EXIT. EXIT. * * * T E S T S U B T R A C T D A Y S *
050000-SUBTRACT-DAYS. * MOVE 0 TO DW-DAYS. DISPLAY GET-DATE-DAYS-SCREEN. ACCEPT GET-DATE-DAYS-SCREEN ON ESCAPE GOTO 050000-EXIT. * MOVE SH-WORK-YYYY TO DW-WORK-YYYY. MOVE SH-WORK-MM TO DW-WORK-MM. MOVE SH-WORK-DD TO DW-WORK-DD. MOVE SH-DAYS TO DW-DAYS. * PERFORM 001400-SUBTRACT-DAYS
THRU 001400-EXIT. * MOVE DW-WORK-YYYY TO SH-WORK-YYYY. MOVE DW-WORK-MM TO SH-WORK-MM. MOVE DW-WORK-DD TO SH-WORK-DD. DISPLAY SHOW-NEW-DATE-SCREEN. * GOTO 050000-SUBTRACT-DAYS. *
050000-EXIT. EXIT. * * * T E S T A D D M O N T H S *
060000-ADD-MONTHS. * DISPLAY GET-DATE-MONTHS-SCREEN. ACCEPT GET-DATE-MONTHS-SCREEN ON ESCAPE GOTO 060000-EXIT. * MOVE SH-WORK-YYYY TO DW-WORK-YYYY. MOVE SH-WORK-MM TO DW-WORK-MM. MOVE SH-WORK-DD TO DW-WORK-DD. MOVE SH-MONTHS TO DW-MONTHS. * PERFORM 001500-ADD-MONTHS
THRU 001500-EXIT. * MOVE DW-WORK-YYYY TO SH-WORK-YYYY. MOVE DW-WORK-MM TO SH-WORK-MM. MOVE DW-WORK-DD TO SH-WORK-DD. DISPLAY SHOW-NEW-DATE-SCREEN. * GOTO 060000-ADD-MONTHS. *
060000-EXIT. EXIT. * * * T E S T S U B T R A C T M O N T H S *
070000-SUBTRACT-MONTHS. * MOVE 0 TO DW-MONTHS. DISPLAY GET-DATE-MONTHS-SCREEN. ACCEPT GET-DATE-MONTHS-SCREEN ON ESCAPE GOTO 070000-EXIT. * MOVE SH-WORK-YYYY TO DW-WORK-YYYY. MOVE SH-WORK-MM TO DW-WORK-MM. MOVE SH-WORK-DD TO DW-WORK-DD. MOVE SH-MONTHS TO DW-MONTHS. * PERFORM 001600-SUBTRACT-MONTHS
THRU 001600-EXIT. * MOVE DW-WORK-YYYY TO SH-WORK-YYYY. MOVE DW-WORK-MM TO SH-WORK-MM. MOVE DW-WORK-DD TO SH-WORK-DD. DISPLAY SHOW-NEW-DATE-SCREEN. * GOTO 070000-SUBTRACT-MONTHS. *
070000-EXIT.
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5
¤ Dauer der Verarbeitung: 0.42 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.