25
Wed, Dec
0 New Articles

Practical RPG: Say Goodbye to Indicators!

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

 

The indicator is perhaps the most ignominious throwback to the original days of RPG, but the good news is that, with a little work, we can get rid of them.

The indicator data type isn't terrible in and of itself. This concept is known in other languages as a Boolean, a variable that can contain one of two values: true or false. The truly archaic part of the standard RPG logic is the support for an implicit array of 99 indicators, numbered 1–99, and the ability to refer to those using just the two digits. We'll review the most common uses of those indicators and the way we can get rid of them.

There's No Such Thing as a Bad Boolean

Really, the Boolean data type is a fundamental part of programming. It's the basic unit of all computer functions—from memory storage (bits) to the most basic building blocks of logic programming (AND, OR, and XOR). The ability to set a flag at one point in a program and test it later is critical, as is the ability to return a true or false value from a function.

The Boolean data type is used to handle all of the conditional logic in your program, either explicitly or implicitly. Explicitly, you may have a Boolean variable named done and your program mainline has a loop that reads dou done. Implicitly, you might have that same loop that says dou %eof(myfile), where the implicit value of %eof is a Boolean that says whether you have reached end-of-file or not. Every if, every conditional loop, every case statement—all of these are, at their core, implementations of Boolean logic.

Booleans Behaving Badly

That isn't meant to say that Booleans can't be abused, and the original RPG gave us one of the most egregious examples of such misuse. The language supported two types of indicators: specific two-character conditioning indicators and numbered, general-purpose indicators. Nearly all of the special-condition indicators have long since gone out of use except in RPG cycle programs.

I'm not going to argue the merits of creating cycle programs in today's programming environment, but the control-level indicators and matching-record indicators aren't useful outside of the cycle. Halt indicators have also long been deprecated by various other methods. The old OF (and OV, OA, OB, etc.) overflow indicators on printers can be replaced by newer named indicators, which we'll discuss in a moment. Command-key indicators can also be done away with, although they do require a little work (which we'll touch on shortly). In fact, except for the good old LR, there's really no use for any of the original special indicators, and even LR can be done away with for NOMAIN programs, although that's a slightly more involved discussion. But once we've dealt with those special-purpose indicators, we still have to deal with the real bad boys of Booleanville.

General Purpose Indicators 01 to 99

I know the history behind the indicator concept. It all centers on the whole idea of punched cards with columnar format and the ability to have conditioned lines of code both in your calculations and in your output specifications. Your calculations would set various indicators, which in turn would dictate the final form of the generated output. It could be as trivial as this:

   C PIECES   COMP 1                  81

   OPRINTER D

   O               PIECESZ  22

   O                      28 'PIECE'

   O               N81        29 'S'      

Indicator 81 is reserved and is used to indicate (hence the name “indicator”) whether the variable PIECES has a value of 1 or not. If indicator 81 is on, PIECES has a value of 1; otherwise, it does not. The printer output is designed to put out a line that shows how many pieces (of whatever). However, in order to be grammatically correct, it will use the word PIECE if the value is one, and PIECES if it is any other amount.

The code is simple: compare PIECES to 1 and set indicator 81 on if that's the value. Later, we will output the S in PIECES if the value is anything other than 1. Nothing here is shocking except perhaps the decision to specify the indicators using a two-digit number. Well, the answer there is simple: real estate. By using two-digit numbers, RPG established a compromise between brevity and flexibility. With two-digit numbers, RPG could allow up to three conditions to be tested (along with the negative test using the "N" modifier) using only nine columns. In an 80-character punched card, that space savings was pretty significant. Of course, that led to code like this:

   C 03N71 63

   CAN 81N83 WSTOFO   ADD WSFRFO   FRTTOT   92

   C 03N71 63

   CAN 81N83N92         EXSR PRCFRT

There isn't an RPG programmer who hasn't at least seen this kind of code (and an awful lot of us have written some of it as well). Luckily, that sort of programming went by the wayside with the advent of the named indicator. Now we might see something more like this:

      if pricing and inCurrentWarehouse;

      FreightTotal = ToFreight + FromFreight;

     if FreightTotal > 0;

        ProcessFreight(FreightTotal);

     endif;

      endif;

So the good news is that, in most cases, we can get rid of those pesky indicators. The only part where we cannot is in the comunication with the outside world and, more specifically, in our display and printer files. Those take a bit more work.

Display File Indicators

Display file indicators work in both directions: the program can set an indicator that controls how the display file functions, and the display file can set an indicator in response to some user action. A single line from a display file can serve to illustrate both conditions:

     A 32                            CF16(16)

What this line says is to enable F16 only if indicator 32 is on, and if the user subsequently presses F16, turn indicator 16 on upon return to the program. Note that this technique is an alternate to the old Kx indicator (which in this case, would have been KQ—extra points for the person who knows why the 16th command key uses the 17th letter in the alphabet!).

Anyway, the problem is that you need to use not one but two numbered indicators: one to tell the display file to enable F16, and the other to tell the program that F16 was pressed. It is this last holdout that we're going to address right now. We do it using the INDARA keyword. INDARA tells the system to use a special indicator area when communicating with the display file rather than using the standard RPG general-purpose indicators. Coding the display file is pretty simple:

     A                              INDARA

That's it. It's a file-level keyword, so it goes right at the top of the display file DDS as one of the first lines before you even begin to define the records in the display. In the RPG program, identifying that you're using INDARA is pretty simple as well: just add a keyword to your display file specification.

      dcl-f MYDISP workstn indds(dsInds);

The INDDS keyword tells the compiler to use the the data structure named dsInds when passing indicators back and forth between the display file and the program. The only final trick is to define the data structure itself. I usually do it something like this:

     dcl-ds dsInds len(99);

     // Command keys - array and specific keys

      F16 ind pos(16);

     // Panel Control

      enableF16 ind pos(32);

     end-ds;

That's all there is to it. I've defined two indicators, one at position 16 and one at position 32. These correspond with numbered indicators 16 and 32, respectively. I would do something like this for any other indicators. That then leads to code like this:

      if postAllowed;

       enableF16 = *on;

     exfmt VERIFYPOST;

     if F16;

        PostData();

     endif;

      endif;

This code is executed if a post is allowed. It's set up to allow the user to verify whether or not to post data. The enableF16 flag is what makes F16 available to the user. The screen is then displayed, and the user can execute the post by hitting F16, which upon return to the program will set the F16 variable to true. That flag can be checked; in this case if the flag is on, a post function is called.

This is just the introduction to the concept of the indicator area. In another article, I'll explain techniques I use to allow a standard design of the data structure to handle a fairly wide variety of situations, from subfiles to error handling. Enjoy saying bon voyage to your old-school indicators!

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: