08
Fri, Nov
10 New Articles

Tricks of the Trade

RPG
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

Writing reports and presentation subfiles is not often on the average programmer’s list of favorite things to do. These projects can be tedious and time-consuming. The specifications for these jobs usually change when the user sees the results of the request because, for some reason, users often expect you to program what they want and not what they ask for. Unless ESP runs in your bloodline, you probably have been caught in this scenario yourself.

The AS/400 offers many ways to format data when you are outputting a single data element. Edit codes and edit words are great formatting tools for single fields. The challenge comes when you need to embed the data element within a string of variable text. With the advent of new data types and built-in functions (BIFs) over the last several years, formatting individual data elements has become easier. But what if your legacy system is still RPG III? To help remove some of the tedium involved in formatting dates, times, and numeric data for presentation, we have designed an RPG IV program that you can call from your RPG III programs.

Times and Dates and Amounts! Oh My!

Figure 1 shows a small window that illustrates how our utility works. As seen in Figures 2, 3, and 4, respectively, this sample program allows you to key an input date, input time, or input amount along with an output description code and press Enter. The result is that the formatted data will be displayed at the bottom of the window. If the code you key is not valid with the type of input you keyed, an error message will be displayed. You can download the source code for the display file that defines this window (FMT014DS) and the RPG IV program that drives it (FMT014RG) from the Midrange Computing Web site at www.midrangecomputing.com/mc/.

Figure 2 shows the output description code for dates. Our utility supports several of the more popular date data type formats as well as a few of our own that we added. As seen in Figure 3, time fields are usually output in far less exciting flavors. Numeric output is often needed in a wide variety of formats, so we chose to have our little utility support the numeric edit codes supported by IBM output specifications or DDS files. Figure 4 shows the codes and sample output. And, just for kicks, we allowed you to add a floating dollar sign to the numeric output.

From Soup to Nuts

Let’s discuss how the code works. As seen in Figure 5, the FMT015RG program accepts five fields as input. These five input fields are described in a single, externally described data structure named FORMATDS and may be seen in Figure 6. (For the uninitiated, an externally described data structure is simply a physical file that holds no data but is used to describe a block or grouping of data—parameters, in this case). If you look at the code in the FMT014RG program, you will see how we used the externally described data structure to call the FMT015RG program. The FMT015RG program reformatted the data and passed the results back in the parameters described by the externally described data structure.

If program FMT015RG determines that a date was sent, it checks the date for validity. The program expects the date to be passed as six digits in the mmddyy format. For example, September 30, 1999 would be passed as 093099. If the date is deemed invalid, an error message is issued and control is returned to the calling program. On the other hand, if the date is deemed valid, the program reformats the date depending upon the output description code passed to the program (valid codes are shown in Figure 2). Once again, invalid format codes will result in an error and control will be passed back to the calling program. If both the date and output description codes are valid, the data will be appropriately formatted and control will be passed to the calling program. If you look at the code, you will see that utilizing the move operation and date data type performs much of the formatting task. When the program must determine the day of the week, it does so by subtracting a base date (defined in the definition specifications) from the input date. The result of that operation is divided by seven (the number of days in the week), and the remainder is used as a single-digit index field for our compile time array named days.

If an input time is passed, the utility essentially works just as it would with an input date. There are only two flavors of time fields supported, and they are described in Figure
3. Once again, the program uses the time data type to perform its formatting functions. In the case of a numeric input field, we used the %EDITC (Edit Code) BIF to apply the edit code to the numeric input field. When the floating dollar sign is requested, the program uses the EVAL (Evaluate) with the %TRIM parameter to remove leading and trailing blanks and concatenate the dollar sign to the desired output. Once the output is properly formatted, the value is returned to the calling program.

By using the tool we’ve shown you, you’ll find that formatting data from RPG III programs is now easier than ever. In fact, CL programs can call FMT015RG, as well. Just like any job, using the right tool can make you more productive and enhance your value to your employer.

Finale

Figure 1: This demonstration program illustrates how FMT015RG edits dates, times, and numbers.

Format Format Example

Parameter Numeric Month, Day, Year *MDY 12/31/99 Numeric Day, Month, Year *DMY 31/12/99 Numeric Year, Month, Day *YMD 99/12/31 Alphanumeric Month, Day, Year *AMDY December 31, 1999 Alphanumeric Month, Day, Year *ALF Friday, December 31, 1999 (including the day of the week)

Day of the Week *DOW Friday

Figure 2: FMT015RG supports a variety of date formats and can be expanded to support more.

Format Format Parameter Example International Organization *ISO 16:24:32 for Standardization (ISO)

IBM USA Standard *USA 04:24 PM

Figure 3: FMT015RG currently edits time in two common formats.

Code Commas Print Zero Sign Other Sample

Balance? 1 Yes Yes None 9,999.99 2 Yes No None 9,999.99
3 No Yes None 9999.99
4 No No None 9999.99
A Yes Yes CR 9,999.99CR B Yes No CR 9,999.99CR
C No Yes CR 9999.99CR D No No CR 9999.99CR
J Yes Yes - 9,999.99-
K Yes No - 9,999.99-
L No Yes - 9999.99-
M No No - 9999.99-
X Remove plus sign 00099999
Y Date field edit 9/99/99
Z Zero Suppress 999999

Figure 4: FMT015RG edits numbers and can prefix a currency symbol to the edited string.

*===============================================================

* To compile:

*

* CRTBNDRPG PGM(XXX/FMT015RG) SRCFILE(XXX/QRPGLESRC)

*

*===============================================================

d Months s 11 dim(12) ctdata perrcd(6)

d Days s 9 dim(7) ctdata perrcd(7)

*

d Parameters e ds extname(FormatDS)

d EditCode 1 Overlay(OutputDesc:1)

d Currency 1 Overlay(OutputDesc:2)

*

d ds inz

d WorkDate 1 10d datfmt(*iso)

d WorkDay 9 10

d WorkMonth 6 7

d WorkIndex 6 7 0

d WorkYear 1 4

*

d BaseDate s d inz(d’1901-01-04’)

d Index s 3 0 inz

d TempField s 7 0 inz

d WorkTime s t timfmt(*hms)

c *entry plist

c parm Parameters

* If an input date is specified, validate the date
b01 c If InputDate > 0 c *mdy test(d) InputDate 68
b02 c If *in68 c Eval OutputData = ‘Invalid Input Date’
x02 c Else

c *mdy Move InputDate WorkDate
b03 c Select c When OutPutDesc = ‘*MDY’

c *mdy Movel WorkDate OutputData

c When OutPutDesc = ‘*DMY’

c *dmy Movel WorkDate OutputData

c When OutPutDesc = ‘*YMD’

c *ymd Movel WorkDate OutputData

c When OutPutDesc = ‘*AMDY’

c Move WorkMonth Index

c Eval OutputData = %Trim(months(WorkIndex)) +

c ‘ ‘ + Workday + ‘, ‘ + WorkYear

c When OutPutDesc = ‘*ALF’

c Exsr DowSr

c Eval OutputData = %Trim(days(Index)) +

c ‘, ‘ + %Trim(months(WorkIndex)) +

c ‘ ‘ + Workday + ‘, ‘ + WorkYear

c When OutPutDesc = ‘*DOW’

c Exsr DowSr

c Eval OutputData = %Trim(days(Index))

c Other

c Eval OutputData = ‘Invalid Description’
e03 c EndSl
e02 c EndIf c Return
e01 c Endif

* If an input time is specified, validate the time
b01 c If InputTime > 0 c *hms test(t) InputTime 68
b02 c If *in68 c Eval OutputData = ‘Invalid Input Time’
x02 c Else

c *hms Move InputTime WorkTime
b03 c Select c When OutPutDesc = ‘*HMS’

c *hms Movel WorkTime OutputData

c When OutPutDesc = ‘*USA’

c *usa Movel WorkTime OutputData

c Other

c Eval OutputData = ‘Invalid Description’
e03 c EndSl
e02 c EndIf c Return
e01 c Endif

* If an input amount is specified, validate the edit code
b01 c If InputNbr 0
b02 c Select c When EditCode = ‘1’

c Eval OutputData = %EditC(InputNbr : ‘1’)

c When EditCode = ‘2’

c Eval OutputData = %EditC(InputNbr : ‘2’)

* ... similar code omitted for codes 3, 4, A-D, J-Q, X, and Y

* ... for publication; duplicate above lines and modify

c When EditCode = ‘Z’

c Eval OutputData = %EditC(InputNbr : ‘Z’)

c Other

c Eval OutputData = ‘Invalid Edit Code’

e02 c EndSl

* Apply a floating dollar sign, if applicable...
b02 c If Currency = ‘$’ c Eval OutputData = ‘$’ + %Trim(OutputData)
x02 c Else

c Eval OutputData = %Trim(OutputData)
e02 c EndIf c Return
e01 c Endif

c eval *inlr = *on

*** calculate day of the week from month/day/year ****************

csr Dowsr begsr

* Day is Friday when index = 1, Saturday when the index is 2, etc..

c WorkDate SubDur Basedate Tempfield:*D

c Div 7 Tempfield

c mvr Index

c add 1 Index

csr endsr

*

** Months

January February March April May June

July August September October November December
** Days
Friday Saturday Sunday Monday Tuesday WednesdayThursday

*===============================================================

* To compile:

*

* CRTPF FILE(XXX/FORMATDS) SRCFILE(XXX/QDDSSRC) MBR(*NONE)

*

*===============================================================

A R FORMATDS TEXT(‘Format Data Structure’)

A INPUTDATE 6S 0 TEXT(‘Input Date’)

A INPUTTIME 6S 0 TEXT(‘Input Time’)

A INPUTNBR 9S 2 TEXT(‘Input Number’)

A OUTPUTDESC 5A TEXT(‘Description of Output’)

A OUTPUTDATA 50A TEXT(‘Output Data’)

Figure 5: Program FMT015RG reformats dates, times, and numbers.

Figure 6: The parameters that are passed between programs are defined in an externally described data structure.

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  • SB Profound WC 5536 Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application. You can find Part 1 here. In Part 2 of our free Node.js Webinar Series, Brian May teaches you the different tooling options available for writing code, debugging, and using Git for version control. Brian will briefly discuss the different tools available, and demonstrate his preferred setup for Node development on IBM i or any platform. Attend this webinar to learn:

  • SB Profound WP 5539More than ever, there is a demand for IT to deliver innovation. Your IBM i has been an essential part of your business operations for years. However, your organization may struggle to maintain the current system and implement new projects. The thousands of customers we've worked with and surveyed state that expectations regarding the digital footprint and vision of the company are not aligned with the current IT environment.

  • SB HelpSystems ROBOT Generic IBM announced the E1080 servers using the latest Power10 processor in September 2021. The most powerful processor from IBM to date, Power10 is designed to handle the demands of doing business in today’s high-tech atmosphere, including running cloud applications, supporting big data, and managing AI workloads. But what does Power10 mean for your data center? In this recorded webinar, IBMers Dan Sundt and Dylan Boday join IBM Power Champion Tom Huntington for a discussion on why Power10 technology is the right strategic investment if you run IBM i, AIX, or Linux. In this action-packed hour, Tom will share trends from the IBM i and AIX user communities while Dan and Dylan dive into the tech specs for key hardware, including:

  • Magic MarkTRY the one package that solves all your document design and printing challenges on all your platforms. Produce bar code labels, electronic forms, ad hoc reports, and RFID tags – without programming! MarkMagic is the only document design and print solution that combines report writing, WYSIWYG label and forms design, and conditional printing in one integrated product. Make sure your data survives when catastrophe hits. Request your trial now!  Request Now.

  • SB HelpSystems ROBOT GenericForms of ransomware has been around for over 30 years, and with more and more organizations suffering attacks each year, it continues to endure. What has made ransomware such a durable threat and what is the best way to combat it? In order to prevent ransomware, organizations must first understand how it works.

  • SB HelpSystems ROBOT GenericIT security is a top priority for businesses around the world, but most IBM i pros don’t know where to begin—and most cybersecurity experts don’t know IBM i. In this session, Robin Tatam explores the business impact of lax IBM i security, the top vulnerabilities putting IBM i at risk, and the steps you can take to protect your organization. If you’re looking to avoid unexpected downtime or corrupted data, you don’t want to miss this session.

  • SB HelpSystems ROBOT GenericCan you trust all of your users all of the time? A typical end user receives 16 malicious emails each month, but only 17 percent of these phishing campaigns are reported to IT. Once an attack is underway, most organizations won’t discover the breach until six months later. A staggering amount of damage can occur in that time. Despite these risks, 93 percent of organizations are leaving their IBM i systems vulnerable to cybercrime. In this on-demand webinar, IBM i security experts Robin Tatam and Sandi Moore will reveal:

  • FORTRA Disaster protection is vital to every business. Yet, it often consists of patched together procedures that are prone to error. From automatic backups to data encryption to media management, Robot automates the routine (yet often complex) tasks of iSeries backup and recovery, saving you time and money and making the process safer and more reliable. Automate your backups with the Robot Backup and Recovery Solution. Key features include:

  • FORTRAManaging messages on your IBM i can be more than a full-time job if you have to do it manually. Messages need a response and resources must be monitored—often over multiple systems and across platforms. How can you be sure you won’t miss important system events? Automate your message center with the Robot Message Management Solution. Key features include:

  • FORTRAThe thought of printing, distributing, and storing iSeries reports manually may reduce you to tears. Paper and labor costs associated with report generation can spiral out of control. Mountains of paper threaten to swamp your files. Robot automates report bursting, distribution, bundling, and archiving, and offers secure, selective online report viewing. Manage your reports with the Robot Report Management Solution. Key features include:

  • FORTRAFor over 30 years, Robot has been a leader in systems management for IBM i. With batch job creation and scheduling at its core, the Robot Job Scheduling Solution reduces the opportunity for human error and helps you maintain service levels, automating even the biggest, most complex runbooks. Manage your job schedule with the Robot Job Scheduling Solution. Key features include:

  • LANSA Business users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.

  • LANSAWhen it comes to creating your business applications, there are hundreds of coding platforms and programming languages to choose from. These options range from very complex traditional programming languages to Low-Code platforms where sometimes no traditional coding experience is needed. Download our whitepaper, The Power of Writing Code in a Low-Code Solution, and:

  • LANSASupply Chain is becoming increasingly complex and unpredictable. From raw materials for manufacturing to food supply chains, the journey from source to production to delivery to consumers is marred with inefficiencies, manual processes, shortages, recalls, counterfeits, and scandals. In this webinar, we discuss how:

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • Profound Logic Have you been wondering about Node.js? Our free Node.js Webinar Series takes you from total beginner to creating a fully-functional IBM i Node.js business application.

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn: