ZZMONTH has five parameters. Two are passed to ZZMONTH: a starting date and a number of months. The number of months has a format of N4 and may be positive or negative. Three parameters are returned from ZZMONTH: an exact date and a date range.
The source code for ZZMONTH follows, as does sample source for a calling routine. Two sample screen images also are included.
ZZMONTH is in the source module section of ZZUtils, a collection of Natural utilities. Look for more information in my Natural Tips & Techniques section - Tip 8.
* Given a date, determine a new date some number of months into
the
* future (+ months) or past (- months).
*
DEFINE DATA LOCAL
1 #GIVEN(D) INIT<*DATX>
1 #MONTHS(N4)
1 #EXACT(D)
1 #FROM(D)
1 #THRU(D)
END-DEFINE
*
SET KEY PF3 PF15
SET CONTROL 'Q'
REPEAT
INPUT(AD=O IP=F)
*PROGRAM
10T 'Natural Utilities'(I)
66T *DATX
*TIME(AL=5)
/ 10T 'Month Calculations'
/// 15T ' Given date:' #GIVEN(AD=MDLT'_' EM=YYYY-MM-DD)
// 15T 'Months(+/-):' #MONTHS(AD=MDLT'_')
//// 15T ' New date:' #EXACT(EM=YYYY-MM-DD)
/// 15T '
From:' #FROM (EM=YYYY-MM-DD)
// 15T '
Thru:' #THRU (EM=YYYY-MM-DD)
///// 10T 'PF3'(I) 'Exit'
IF *PF-KEY = 'PF3'
OR
= 'PF15'
THEN
STOP
END-IF
*
CALLNAT 'ZZNMONTH' #GIVEN
#MONTHS
#EXACT
#FROM
#THRU
END-REPEAT
END
DEFINE DATA
PARAMETER
1 #GIVEN(D)
1 #MONTHS(N4)
1 #EXACT(D)
1 #FROM(D)
1 #THRU(D)
LOCAL
1 #G(A8) 1 REDEFINE #G
2 #G-DD(N2)
1 #TEMP(D) 1 REDEFINE #TEMP
2 #T-P(P7)
1 #T(A8) 1 REDEFINE #T
2 #T-DD(N2)
1 #I(P4)
END-DEFINE
*
MOVE EDITED #GIVEN(EM=DDMMYYYY) TO #G
ASSIGN #EXACT = #GIVEN
ASSIGN #T = #G
ASSIGN #T-DD = 1
/* Start of the month
MOVE EDITED #T TO #TEMP(EM=DDMMYYYY)
DECIDE FOR FIRST CONDITION
/* Determine the month
WHEN #MONTHS < 0
FOR #I = #MONTHS -1
SUBTRACT 1 FROM
#TEMP /* End of the prior
month
MOVE EDITED #TEMP(EM=DDMMYYYY)
TO #T
ASSIGN #THRU =
#TEMP
ASSIGN #T-DD =
1
/* Start of the prior month
MOVE EDITED #T
TO #TEMP(EM=DDMMYYYY)
ASSIGN #FROM =
#TEMP
END-FOR
WHEN #MONTHS > 0
FOR #I = 0 #MONTHS
ASSIGN #FROM =
#TEMP
ASSIGN #T-DD =
28
/* Even February has this many
REPEAT UNTIL #T-DD
= 1 /* 'Search' for next month
MOVE
EDITED #T TO #TEMP(EM=DDMMYYYY)
ADD
1 TO #TEMP
MOVE
EDITED #TEMP(EM=DDMMYYYY) TO #T
END-REPEAT
END-FOR
ASSIGN #THRU = #TEMP - 1
WHEN ANY
ASSIGN #TEMP = #THRU
MOVE EDITED #TEMP(EM=DDMMYYYY)
TO #T
REPEAT UNTIL #T-DD = #G-DD
IF #T-DD
<= #G-DD
THEN
ESCAPE BOTTOM
END-IF
SUBTRACT 1 FROM
#TEMP
MOVE EDITED #TEMP(EM=DDMMYYYY)
TO #T
END-REPEAT
ASSIGN #EXACT = #TEMP
WHEN NONE
MOVE EDITED #GIVEN(EM=DDMMYYYY)
TO #T
ASSIGN #T-DD = 1
/* Start of the month
MOVE EDITED #T TO #FROM(EM=DDMMYYYY)
ASSIGN #T-DD = 28
/* Even February has this many
REPEAT UNTIL #T-DD = 1
/* 'Search' for next month
MOVE EDITED #T
TO #THRU(EM=DDMMYYYY)
ADD 1 TO #THRU
MOVE EDITED #THRU(EM=DDMMYYYY)
TO #T
END-REPEAT
SUBTRACT 1 FROM #THRU
/* Last day of given month
END-DECIDE
END
| ZZMONTH Natural Utilities
98-02-28 15:43
Month Calculations Given date: 1998-02-28
Months(+/-): 0____
New date: 1998-02-28
From: 1998-02-01
Thru: 1998-02-28
PF3 Exit
|
| ZZMONTH Natural Utilities
98-02-28 15:44
Month Calculations Given date: 1999-12-18
Months(+/-): 2____
New date: 2000-02-18
From: 2000-02-01
Thru: 2000-02-29
PF3 Exit
|
Return to Ralph G. Zbrog's home page.
Last updated April 25, 1998, by Ralph G. Zbrog.