With RPG IV came a "date" data type, along with a bevy of operations to manipulate it. We added ADDDUR, SUBDUR, and EXTRCT to our programming vocabulary and then figured out how to turn our 6- and 8-digit dates into this new creation. Some shops even converted their database to use date (and time) data types. After some experience with these new operations, we sometimes needed to get dates back into numbers (using MOVE) for required output formatting.
Now, if you are among the proud and few who have ventured into the new world of free-format RPG IV, you may have discovered that the date operation codes are not supported. Likewise, MOVE is not supported (used to convert dates to numbers and vice-versa). And if you are acquiring the current date from the system, using the TIME operation with 12 or 14 digits, forget it. That operation isn't supported either! What's a person to do?
Welcome to the new world of built-in functions for date management. Rather than just rag about it, I will show you examples of these "new" built-in functions and explain how to code using them. Even if you are using extended Factor 2 calculations, you can still use the new built-ins, instead of the operation codes, by use of the EVAL operation.
To add or subtract a duration to/from a date to get a new date (a la ADDDUR and SUBDUR), simply use the plus sign (+) or minus sign (–) operator and one of the %days, %months, or %years built-in functions. For example:
D To_date S d
D Date3 S d
/free
To_date = From_date + %months(3); // To_date value is now 2003-12-16
Date3 = To_date – %years(7); // Date3 is now 1996-12-16
/end-free
Another capability of SUBDUR is subtracting two dates to get duration. This is done in free-form using the %diff built-in as shown in the next example:
D To_date S d Inz(d'2009-11-24')
D Difference S 4 0
/free
Difference = %diff(To_date:From_date:*years); // Difference is now 6
/end-free
The third parameter of %diff can be *days, *months, or *years (or other values for time and timestamp needs).
Continuing my parallel to the older operations, the built-in function %subdt is used instead of the EXTRCT operation to obtain portions of a date from a date variable. For example:
D Month S 2 0
D Day S 2 0
/free
Month = %subdt(From_date:*Months); // Month value is now 9
Day = %subdt(From_date:*Days); // Day value is now 16
/end-free
You can use the abbreviated form for *Years, *Months, and *Days: *Y, *M, or *D. The %subdt built-in is also useful for obtaining portions from a time or timestamp data type variable.
Obtaining the current date is pretty easy--in fact, a lot easier than the TIME operation. The %date built-in provides for this, as well as converting numbers (packed or character strings) into a date variable. You can use 6- or 8-digit numbers. Knowing or looking up the format code for the order of the numbers helps a bit here. Here are some examples:
D Date2 S d
D Date3 S d
D Num6 S 6 0 Inz(61986)
D Num8 S 8 0 Inz(12252003)
/free
Date1 = %date(Num6:*MDY); // Date1 becomes date 1986-06-19 from 6 digits
Date2 = %date(Num8:*USA); // Date2 becomes date 2003-12-25 from 8 digits
Date3 = %date(); // Date3 becomes the current date from the system
/end-free
If you're nodding your head and saying, "Sounds pretty easy so far," you're right. But with all this good stuff, you know there has to be some not-so-good stuff. Well, you're right again. Conversion of date data types to decimal is the bugger. Multiple built-ins are needed, and V5R2 is needed for my examples, shown below:
D Num6 S 6 0
D Num8 S 8 0
/free
Num6 = %int(%char(Date1:*MDY0)); // The zero after the *MDY removes the
// punctuation. The %int converts the
// characters to decimal. *MDY for 6 digits
Num8 = %int(%char(Date1:*USA0)); // *USA is for 8 digits, with 4 digit year
/end-free
If you haven't been using these new built-ins for date management, the information above should help you get started.
Jim Martin is corporate technical instructor at Jack Henry & Associates, in Monett, Missouri. He is a veteran of RPG programming, beginning in 1967 with a position at IBM as a Systems Engineer and later was a staff programmer at the Rochester systems programming lab. For eight years, he was at Lakeview Technology as an AS/400 and RPG instructor and was a speaker at various local midrange user group meetings and conferences. He can be reached by email at
LATEST COMMENTS
MC Press Online