26
Thu, Dec
0 New Articles

Practical RPG: BIFs and Expressions

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

Built-in functions (BIFs) allow you to significantly reduce the maintenance code in programs; here's an example.

 

Built-in functions (BIFs) are designed to make programmers more productive. They do this in a number of ways, but one my favorites is how they reduce the number of lines of code in my programs. If you've used BIFs you're probably already familiar with how they simplify your code; for example, date manipulation is far simpler using the %date BIFs. Today, though, I'm going to show you something that might surprise even the BIF experts out there. I know it surprised me!

BIFs in I/O

I/O operations have been enhanced greatly in RPG and especially in RPG /free. A couple of the real time-savers are the %fields extension to update and write operations and the key field list in the SETxx and chain operations. Today's article will focus on the key field list because it supports an additional enhancement that can remove even more code!

 

Let's start by examining the free-format I/O operations and specifically the key field list. A quick progression through the various syntactical variants is in order. Let's start old school with some fixed-format RPG/400:

 

TAXKEY       KLIST                                        

             KFLD                  OHCUST                

             KFLD                  IMTYPE                

                                                            

TAXKEY       CHAIN     TAXFILE                           90

 

I think most people will recognize this syntax. The KLIST opcode heads a list of key fields, which are then used in the CHAIN operation. In this case, field one is the customer number from the order header and field two is the item type from the item master. Together, these two fields provide a key to the tax override file. So we create a key list using those two fields and chain. The problem with this syntax is that the key list and the actual I/O operation are usually separated in the code, especially if you use the key list in more than one I/O operation. This means you have to page up and down through the code in order to understand how the logic works.

 

One way around this particular problem is to use work fields. This is something we do all the time; we create a KLIST with fields specific to that KLIST. An interesting quirk of fixed-format syntax is that you can actually define the fields right in the KLIST. This allows you to define work fields, which you can then load prior to the I/O operation. Here's an example:

 

TAXKEY       KLIST                                        

             KFLD                  XFKEY1          6 0

             KFLD                  XFKEY2          1  

                                                            

             MOVE     OHCUST       XFKEY1                

             MOVE     IMTYPE       XFKEY2                

TAXKEY       CHAIN     TAXFILE                          90

                                    

This approach has benefits and drawbacks. The primary disadvantage of using work fields is that you end up with more work fields! Work fields are inherently bad because each one creates a potential failure point. For example, if a field in the database changes, you can end up with a size mismatch between it and the work field. A more subtle problem is the concept of a side effect; for various reasons, we sometimes initialize one or more of the key fields in another part of the program. For example, we might move OHCUST into XFKEY1 as soon as we retrieve the order header record. That's fine, unless some other part of the program changes XFKEY1. If that happens, you'll start seeing unexpected and difficult-to-debug errors.

Free-Form Syntax

The free-form variant of the CHAIN operation has a syntax that resolves both of these issues:

                                

chain ( OHCUST: IMTYPE) TAXFILE;

                                

How about that? You can specify the key fields right on the CHAIN instruction itself. I find this to be extremely helpful; not only do I not need any work variables, but the fields used to retrieve the record are right there on the line. This is the sort of "self-documenting" code that really helps you down the road when it's time to maintain this program. This syntax has an extremely useful feature: as long as the fields are "compatible," the compiler will perform conversions as necessary to get the operation to execute. One example might be converting packed to zoned, or casting a smaller alpha field to a larger one, or even using a constant in the CHAIN. Generally speaking, if the compiler can do the conversion on a procedure call, then it can do it on an I/O key list.

 

But wait! There's more!

 

Let's imagine a situation where the data can't be auto-converted. For example, let's say that in this case the customer number is numeric in the order header file but alphanumeric in the tax file. Normally, this would require a little magic involving the %editc BIF. In fact, this is the code I've used in similar circumstances:

 

wCust = %editc(OHCUST:'X');

chain ( OHCUST: IMTYPE) TAXFILE;

 

It works, but it requires a work field. Another option is to use the field in the TAXFILE record itself. That's also functional, and it avoids the work field. But as I continued to explore the language, I found out I was doing extra work (and I hate doing extra work!). The field list actually supports expressions, which means I can put the conversion right in the CHAIN operation. Here is the true least-effort solution:

 

chain ( %editc(OHCUST:'X'): IMTYPE) TAXFILE;

 

Now that's a real time-saver! The field list handler will actually execute the %editc BIF and use the result in the I/O operation. That to me is some serious magic. I am able to do conversions using any of the opcodes or BIFs at my disposal. If the third character of my item number is the type code, I can substring it out right on the line. I can build a complex lot number using a date field and a concatenation. And if I extend the concept to its logical conclusion, I can use the result of a subprocedure, even one in a service program! Imagine this:

 

chain ( %editc(OHCUST:'X'): getTaxType( IMITEM) ) TAXFILE;

 

The getTaxType routine can be a procedure in a service program that does any business logic I need to determine the tax type. Now I'm no longer limited to just storing the tax type in the item master. Of course, in this particular case I might be better off just using a service program procedure to get the tax type and avoid the CHAIN altogether, but I hope you can see the potential of the approach. Many more subtle but powerful syntactical techniques exist in RPG; this is not the Report Program Generator I grew up with in the '70s. I'll show you more in another article!

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: