TITLE ' - Day-Of-Week Utility'
IDENTIFICATION DIVISION.
PROGRAM-ID. DMUDOW.
AUTHOR. DAN MERKLING.
DATE-WRITTEN. 03/13/2007.
DATE-COMPILED.
*----------------------------------------------------------------+
* Purpose: |
* This callable sub-routine determines the day-of-week for |
* a passed-in date. |
* |
* Parameters & usage: |
* A single 19-byte parameter block is used to call this |
* routine, configured as follows: |
* |
* 01 DAY-OF-WEEK-PARMS |
* 05 DW-DT |
* 05 DW-DY-OF-WK |
* 05 DW-DY-OF-WK-NM |
* 05 DW-RSLT |
* |
* The individual parameters are defined & used as follows: |
* |
* DW-DT - INTEGER - 8 |
* This is the input date for which the day-of-week will be |
* found. It must be all digits, with no spaces. If the |
* date is not provided, the system date will be retrieved |
* & used as the input. |
* |
* Format: YYYYMMDD |
* |
* DW-DY-OF-WK - INTEGER - 1 |
* This is the numeric value for the day of the week. The |
* first day of a week is Monday & the last day of a week |
* is Sunday. Therefore, the value returned in this field |
* is 1 for Monday thru 7 for Sunday. |
* |
* Format: 9 |
* |
* DW-DY-OF-WK-NM - STRING - 9 |
* This is the alpha name of the day of the week as |
* determined by this routine. |
* |
* Format: Xxxxxxxxx |
* |
* DW-RSLT - STRING - 1 |
* This is the result code (or return code) returned by the |
* routine. It should be checked after every call to this |
* program. |
* |
* Values: - = Initialized; no processing yet performed |
* Blank = No errors or warnings; all processing |
* performed correctly |
* D = Invalid date value |
* Z = Serious unexpected error |
*----------------------------------------------------------------+
* M O D I F I C A T I O N H I S T O R Y |
*----------------------------------------------------------------+
* Programmer Date Change # Description / Remarks |
* ------------ -------- -------- ------------------------------- |
*----------------------------------------------------------------+
EJECT
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
DATA DIVISION.
FILE SECTION.
EJECT
*----------------------------------------------------------------+
* Working Storage |
*----------------------------------------------------------------+
WORKING-STORAGE SECTION.
77 PGM-ID PIC X(08) VALUE 'DMUDOW'.
77 PGM-VER PIC X(05) VALUE '01.02'.
77 FILLER PIC X(23) VALUE
' WORKING STORAGE BEGINS'.
01 WORKING-VARIABLES.
05 WS-CUR-DT.
10 WS-CUR-YYYYMMDD.
15 WS-CUR-YYYY PIC 9(04).
15 WS-CUR-MM PIC 9(02).
15 WS-CUR-DD PIC 9(02).
10 FILLER PIC 9(08).
10 FILLER PIC X(05).
05 WS-LILIAN PIC 9(09) BINARY.
05 WS-FEEDBACK-CODE.
10 WS-FC-SEV PIC 9(04) BINARY.
10 WS-FC-MSG PIC 9(04) BINARY.
10 FILLER PIC X(08).
05 WS-DOW PIC 9(09) BINARY.
01 CHR-DT.
05 CD-LEN PIC 9(04) BINARY.
05 CD-TXT.
10 CD-CHAR PIC X(01) OCCURS 0 TO 256
DEPENDING ON CD-LEN.
01 PIC-STR.
05 PS-LEN PIC 9(04) BINARY.
05 PS-TXT.
10 PS-CHAR PIC X(01) OCCURS 0 TO 256
DEPENDING ON PS-LEN.
01 DAY-TABLE.
05 DAY-TABLE-DATA.
10 FILLER PIC X(09) VALUE 'Monday'.
10 FILLER PIC X(09) VALUE 'Tuesday'.
10 FILLER PIC X(09) VALUE 'Wednesday'.
10 FILLER PIC X(09) VALUE 'Thursday'.
10 FILLER PIC X(09) VALUE 'Friday'.
10 FILLER PIC X(09) VALUE 'Saturday'.
10 FILLER PIC X(09) VALUE 'Sunday'.
05 DAY-TABLE-ARRAY REDEFINES DAY-TABLE-DATA.
10 DAY-ENTRY OCCURS 7.
15 DAY-NAME PIC X(09).
EJECT
*----------------------------------------------------------------+
* Literals & Constants |
*----------------------------------------------------------------+
01 LITERALS-AND-CONSTANTS.
05 CEEDAYS-PGM-ID PIC X(08) VALUE 'CEEDAYS'.
05 CEEDYWK-PGM-ID PIC X(08) VALUE 'CEEDYWK'.
EJECT
*----------------------------------------------------------------+
* Linkage Section |
*----------------------------------------------------------------+
LINKAGE SECTION.
*01 DAY-OF-WEEK-PARMS
COPY DMUDOW.
EJECT
*----------------------------------------------------------------+
* 0000-MAIN-LOGIC |
* |
* Main routine logic. |
*----------------------------------------------------------------+
PROCEDURE DIVISION,
USING DAY-OF-WEEK-PARMS.
0000-MAIN-LOGIC.
MOVE ZERO TO DW-DY-OF-WK.
MOVE SPACES TO DW-DY-OF-WK-NM.
SET DW-INCOMPLETE TO TRUE.
IF DW-DT-X <= SPACES THEN
MOVE FUNCTION CURRENT-DATE TO WS-CUR-DT
MOVE WS-CUR-YYYYMMDD TO DW-DT
END-IF.
IF DW-DT NOT NUMERIC THEN
SET DW-UNEXPECTED-ERR TO TRUE
GO TO 0000-EXIT
END-IF.
MOVE 8 TO CD-LEN,
PS-LEN.
MOVE DW-DT TO CD-TXT.
MOVE 'YYYYMMDD' TO PS-TXT.
CALL CEEDAYS-PGM-ID,
USING CHR-DT,
PIC-STR,
WS-LILIAN,
WS-FEEDBACK-CODE.
IF WS-FC-SEV = 3 THEN
SET DW-INVALID-DATA-VALUE TO TRUE
GO TO 0000-EXIT
END-IF.
SET DW-OK TO TRUE.
CALL CEEDYWK-PGM-ID,
USING WS-LILIAN,
WS-DOW,
WS-FEEDBACK-CODE.
SUBTRACT 1 FROM WS-DOW.
IF WS-DOW = 0 THEN
MOVE 7 TO DW-DY-OF-WK
ELSE
MOVE WS-DOW TO DW-DY-OF-WK
END-IF.
MOVE DAY-NAME(DW-DY-OF-WK) TO DW-DY-OF-WK-NM.
0000-EXIT.
GOBACK.
END PROGRAM DMUDOW.
|