« Wayback: Linux re-enters the 3000's world | Main | Licensed MPE source solves OS mysteries »

August 10, 2018

HPCALENDAR joins 3000 intrinsics hits

Newswire Classic

Greatest-HitsTwenty 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).

There are a couple of things you should be sure to do correctly when using these intrinsics. HP’s documentation shows that some parameters on some intrinsics need to be passed by value (see my examples in Figure 1 with DATE-CODE, DAYS-DIFF and DATE-CUTOFF). You do this by putting the \ backward slashes around the variable name.

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

12:35 PM in Hidden Value, Homesteading | Permalink

Bookmark and Share

Use our search engine to find 20 years
of HP 3000 news and articles

Comments

Comments

Post a comment