|
|||||||
|
|
![]() |
|
|
|
|
||
|
More Free-Format RPG Date-Conversion Solutions Dear Readers: In the May 7 issue, I lamented that there was no simple way to convert a variable of the date data type to a numeric format in free-format RPG calculation specs. Here are some workarounds I have received from readers. --Ted I include a data structure (mmddyyyyDS) that divides a date into month, day, and year portions and includes both numeric and character subfields for the entire date. To convert the date, I use four EVAL operations: three to load the year, month, and day subfields, and one to assign the converted date to a numeric or character variable.
DWorkDate S D
DmmddyyyyDS DS
D mmddyyyy 8S 0
D Month 2S 0 Overlay(mmddyyyy:1)
D Day 2S 0 Overlay(mmddyyyy:3)
D Year 4S 0 Overlay(mmddyyyy:5)
D MonthDay 4S 0 Overlay(mmddyyyy:1)
D Char_mmddyyyy 8A Overlay(mmddyyyy:1)
DNumericDate S 8S 0
DCharDate S 8A
/free
// convert WorkDate to numeric and character formats
Year = %subdt(WorkDate:*years);
Day = %subdt(WorkDate:*days);
Month = %subdt(WorkDate:*months);
NumericDate = mmddyyyy;
CharDate = Char_mmddyyyy;
/end-free
I know this is just another way to beat the system, but it works and it keeps one in free-format code. --Gene While I'm stuck at V5R1, I use a combination of multiplication and the %SUBDT built-in function to convert a date to a numeric.
D MyDate s d
D MyNumeric s 8s 0
/free
// convert to MMDDYYYY format
MyNumeric = (%subdt(MyDate:*m) * 1000000) +
(%subdt(MyDate:*d) * 10000) +
(%subdt(MyDate:*y));
// convert to YYYYMMDD format
MyNumeric = (%subdt(MyDate:*y) * 10000) +
(%subdt(MyDate:*m) * 100) +
(%subdt(MyDate:*d));
/end-free
Yes, this is a little complicated, but I don't need any procedures or functions. You can modify this for any format of course, except for Julian. --Doug Thanks for your article about date conversions, which is something I found to be a problem when I started to use free format RPG recently. Our box is on V5R1. I got around the problem by using data structures. Here's some code I use.
D TodayN S D inz(*sys)
// CYYMMDD format
D todaydat S 7 0
D date DS
D dateN 1 7 0
D CC 1 0 overlay(dateN)
D YY 2 0 overlay(dateN:2)
D MM 2 0 overlay(dateN:4)
D DD 2 0 overlay(dateN:6)
D Today DS 10
D year 3 4
D month 6 7
D day 9 10
/free
// load system date into todaydat in CYYMMDD format
Today = %char(TodayN);
date = '1' + year + month + day;
todaydat = dateN;
/end-free
No doubt that it could be written more elegantly than the way I've coded it! --Bob
|
Editors
Contact the Editors |
| Copyright © 1996-2008 Guild Companies, Inc. All Rights Reserved. |