|
You would have to use the convert date to convert your date to Julian, add 1 to it, check for leap year and make adjustments and then convert it back. A good example of this technique used to be found in the old TAATools in the ADDDAT command. Here is that example. This command has a six-character date but that can easily be changed with a very slight modification.
/* Add date command source **
CMD PROMPT('Add Date')
PARM KWD(DAYS) TYPE(*DEC) LEN(5) RANGE(-35000 +
35000) MIN(1) PROMPT('Nbr of days to +
add/sub (5 0)')
PARM KWD(TOVAR) TYPE(*CHAR) LEN(6) RTNVAL(*YES) +
MIN(1) PROMPT('New date variable
(6)')
PARM KWD(DATE) TYPE(*DEC) LEN(6 0) DFT(*TODAY) +
RANGE(000000 999999) SPCVAL((*TODAY 0)) +
PROMPT('Date (sys fmt) (6 0)')
/* Add date CL source **
PGM PARM(&DAYS &TOVAR &DATE)
DCL &DAYS *DEC LEN(5 0)
DCL &TOVAR *CHAR LEN(6)
DCL &DATE *DEC LEN(6 0)
DCL &WRKDAT *CHAR LEN(6)
DCL &JULIANA *CHAR LEN(5)
DCL &YRD *DEC LEN(2 0)
DCL &DAYSD *DEC LEN(3 0)
DCL &LEAP *DEC LEN(2 0)
DCL &DAYSINYEAR *DEC LEN(3 0)
DCL &NUM5 *DEC LEN(5)
DCL &NUM2 *DEC LEN(2)
/* &DATE=0 is special value *TODAY */
IF (&DATE *EQ 0) RTVJOBA DATE(&WRKDAT)
IF (&DATE *NE 0) CHGVAR &WRKDAT &DATE
CVTDAT DATE(&WRKDAT) TOVAR(&JULIANA) TOFMT(*JUL) +
TOSEP(*NONE) /* Convert to Julian */
MONMSG MSGID(CPF0555) EXEC(SNDPGMMSG +
MSGID(CPF9898) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) +
MSGDTA('DATE parameter value cannot +
be converted'))
/* Substring for year and day */
CHGVAR &YRD %SST(&JULIANA 1 2)
CHGVAR &DAYSD %SST(&JULIANA 3 3)
CHGVAR VAR(&NUM5) VALUE(&DAYSD + &DAYS) /* Add days */
CHKPLUS: IF (&NUM5 *GT 0) GOTO CHKLEAP /* If positive */
IF (&YRD *EQ 00) CHGVAR &YRD 99 /* Year 2000 */
ELSE CHGVAR &YRD (&YRD -1) /* Decrement year */
CHKLEAP: CHGVAR &NUM2 (&YRD / 4) /* Chk leap year */
CHGVAR &LEAP (&YRD - (&NUM2 * 4))
IF (&LEAP *GT 0) CHGVAR &DAYSINYEAR 365
ELSE CHGVAR &DAYSINYEAR 366 /* Leap year */
IF (&NUM5 *LE 0) DO /* Days are negative */
CHGVAR &NUM5 (&NUM5 + &DAYSINYEAR)
GOTO CHKPLUS /* Check for positive days */
ENDDO /* End negative days */
IF (&NUM5 *GT &DAYSINYEAR) DO /* Ovfl */
IF (&YRD *EQ 99) CHGVAR &YRD -1 /* Year 2000 */
CHGVAR &YRD (&YRD + 1) /* Bump year */
CHGVAR &NUM5 (&NUM5 - &DAYSINYEAR) /* Subtract */
GOTO CHKLEAP /* Test for next year */
ENDDO /* End days greater than days-in-year */
CHGVAR &DAYSD &NUM5 /* Chg to 3 digits */
/* Substring back into Julian date */
CHGVAR %SST(&JULIANA 1 2) &YRD
CH
|