HPCALENDAR joins 3000 intrinsics hits
August 10, 2018
Newswire Classic
Twenty years ago HP took steps forward, into the realm beyond 2028, when it released a set of COBOL-related MPE/iX intrinsics. The community is now looking into the next decade and seeing a possibility of hurdling the Dec. 31, 2027 date handling roadblock. In this Inside COBOL column from the late 1990s, Shawn Gordon took readers on a quick tour of the new intrinsics — new to 1998, at least — that would make the 3000 easier to program for the future. He even wrote a sample program employing the improved data handling.
In 2018 the information might seem more history lesson than operational instruction guide. But when a long-running mission critical app needs repairs, knowing the full set of date capabilities might help. Gordon even mentions that using the official intrinsics will help maintain programs written 20 years earlier. Enough time has passed by now that any new programs at the time of the article would be 20 years old.
3000 managers have always had a sharp focus on coding for long life of applications.
By Shawn Gordon
Since Year 2000 is rapidly approaching, I'll review the date intrinsics that HP gave us in MPE/iX 5.5 starting with PowerPatch 4.
As I've done a lot of Y2K consulting it seems everyone has written their own date routines. Most I have seen will break by Y2K. My goal in my consulting was to implement an HP-supplied solution, making it easier to support YYMMDD as well as YYYYMMDD date functions during the conversion process.
My only negative comment about these intrinsics is that I wish they had been created with the introduction of the Spectrum series of HP 3000s (PA-RISC systems). I could have used them then, too.
Six new intrinsics are available. All of the parameters for all new intrinsics are now 32-bit. This means they will work for as long as anyone reading this will ever care. I feel it’s important to standardize on these new HP-supplied intrinsics. They will make it a lot safer than trying to maintain some piece of code that was probably written 20 years ago. With code that old, it’s likely that nobody remembers how it works.
Here’s the lineup of intrinsics:
1. HPDATECONVERT: converts dates from one supported format to another
2. HPDATEFORMAT: converts a date into a display type (I usually use this instead of HPDATECONVERT)
3. HPDATEDIFF: returns the number of days between to given dates
4. HPDATEOFFSET: returns a date that is plus or minus the number of days from the source date
5. HPDATEVALIDATE: verifies that the date conforms to a supported date format
6. A new 32-bit HPCALENDAR format (HPCALENDAR, HPFMTCALENDAR).
The other thing that can be confusing is the DATE-CUTOFF. This defines a “split” year. If anything is below this value, it will be translated to the next century. In other words, if the value of DATE-CUTOFF is 50, and you are using a 2 digit year of 00..49, then it will be resolved as 2000..2049, and those in the range of 50..99 will be 1950..1999.
If you use a value of -1, then the intrinsic will pick up the value of the predefined system variable HPSPLITYEAR. This method lets you control the value outside of your program, so I use a DATE-CUTOFF of -1 to stay modular.
The other thing to note is DATE-CODE, which indicates the style of the date that you are working with. I am using 15 because it works with both YYMMDD and YYYYMMDD format.
I’m including some code examples below for the variable declarations, as well as results of running the program MYDATE which uses the functions.
01 DATE-CODE PIC S9(9) COMP VALUE 15.
01 DATE-RESULT PIC S9(9) COMP VALUE 0.
01 DATE-STATUS.
03 S-INFO PIC S9(4) COMP VALUE 0.
03 S-SUBSYS PIC S9(4) COMP VALUE 0.
01 DATE-CUTOFF PIC S9(9) COMP VALUE -1.
01 FORMAT-LEN PIC S9(9) COMP VALUE 20.
01 FROM-DATE PIC 9(8) COMP.
01 THRU-DATE PIC 9(8) COMP.
01 DAYS-DIFF PIC S9(9) COMP.
01 FORMAT-TYPE PIC X(20).
CALL INTRINSIC "HPDATEFORMAT" USING \DATE-CODE\,
FROM-DATE,
HOLD-FORMAT,
FORMAT-DATE,
FORMAT-LEN,
DATE-STATUS,
\DATE-CUTOFF\.
IF S-INFO <> 0
DISPLAY "Error in HPDATEFORMAT".
CALL INTRINSIC "HPDATEDIFF" USING \DATE-CODE\,
FROM-DATE,
THRU-DATE,
DUMMY-VAL,
DATE-STATUS,
\DATE-CUTOFF\.
IF S-INFO <> 0
DISPLAY "Error in HPDATEDIFF".
CALL INTRINSIC "HPDATEOFFSET" USING \DATE-CODE\,
FROM-DATE,
\DAYS-DIFF\,
THRU-DATE,
DATE-STATUS,
\DATE-CUTOFF\.
IF S-INFO <> 0
DISPLAY "Error in HPDATEOFFSET".
CALL INTRINSIC "HPDATEVALIDATE" USING \DATE-CODE\,
FROM-DATE,
\DATE-CUTOFF\
GIVING DATE-RESULT.
IF S-INFO <> 0
DISPLAY "Error in HPDATEVALIDATE".
RUN MYDATE
Enter date in YYMMDD or YYYYMMDD format: 19980317
Enter date format string: MM/DD/YY
Formatted date is 03/17/98
Julian date is 01998076
Enter From date: 19980101
Enter Thru date: 19980501
Number of days = +000000120
Enter start date: 19980801
Enter day offset: -31
New date is 19980701