TechTip: Eliminate Indicators in Display Programs

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

I recently started a new consulting position, and the company I am working for now is using 20-year-old RPG code that has been modified over the years by developers with questionable skills. I suspect that I am not alone in having to maintain old and convoluted RPG II code. A long time ago, I worked for a guy who used to say, "Never use indicators...ever!" So I quit using indicators completely, and having to go back to using them again was unthinkable. Now, when I'm working on a display program using indicators to deal with the DDS display file, I get rid of the indicators in the program. Here's how you can do it.

Using the Indicator Data Structure (INDDS) and the File Information Date Structure (INFDS), you can separate the display file indicators from the actual RPG indicators and retrieve the Attention Indicator (AID) code for the AID-generating key pressed by the user. AID-generating keys include all the command keys, the Help key, the Page Up/Page Down keys, the Print key, and the Enter key. With the display file indicators set aside into a data structure, you can give them descriptive names. This will make the RPG code much more understandable to the next chump who has to modify it. The code snippet below is from a file maintenance program I recently re-wrote.

  // ------------------------------------------------------
FPgmDisplay F   E             WORKSTN 
F                                     INDDS(DSPIND_DS)     
F                                     INFDS(DSPINFO_DS)    

  // ---------------------------------------------------------------
  //  Workstation data structures           
  // ---------------------------------------------------------------

   // File information display Data structure for Display file   
d DSPINFO_DS      ds                      
d   AidByte             369    369         
                 
                      
   // Indicator Data structure for Display file         
d DSPIND_DS       ds            99              
d  dspInds                       1    dim(99)          
d  CustomerNbr_Error...                                  
d                                 n   overlay(dspInd_DS:21)
d  PhoneNumber_Error...                                  
d                                 n   overlay(dspInd_DS:22)
d  Address_Error...                                 
d                                 n   overlay(dspInd_DS:23)
d  selectNextChg...                             
d                                 n   overlay(dspInd_DS:45)
d  protectAllFields...                             
d                                 n   overlay(dspInd_DS:50) 
d  hideF23                        n   overlay(dspInd_DS:51) 
d  subfileControlChanged...                      
d                                 n   overlay(dspInd_DS:60)   
d  displaySubfileRecs...                                      
d                                 n   overlay(dspInd_DS:75)   
d  displaySubfileControl...                                   
d                                 n   overlay(dspInd_DS:76)   
d  subfileClear...                                            
d                                 n   overlay(dspInd_DS:77)   
d  subfileEnd                     n   overlay(dspInd_DS:97)   

Of course, if you can't convert the RPG II code to ILE, then you’ll need to use the shorter field names when creating your data structure. The file spec defines the data structures to receive the INDDS and the INFDS data. For complete subfield definitions for the INFDS data structure, refer to the WebSphere Development Studio: ILE RPG Reference. The AID code (AidByte in the above code) is a hexadecimal field that corresponds to the key that the user pressed to return the control to the program. A list of the AID-generating keys and their codes can be found at in the 5250 Data Stream Details in the IBM Infocenter. The code for the constants that I use is shown below:

   //===========================================================
   //  Member Name: @AIDCONST                      
   //  Description: This is a copy book containing the Aid byte
   //                definitions for all    
   //               the command keys and other attention keys    
   //               including Enter, Help, and paging keys.      
   //===========================================================
   // Function keys                    
d F01             C                   x'31'                 
d F02             C                   x'32'             
d F03             C                   x'33'               
d F04             C                   x'34'           
d F05             C                   x'35'                 
d F06             C                   x'36'                 
d F07             C                   x'37'               
d F08             C                   x'38'                
d F09             C                   x'39'                
d F10             C                   x'3a'                
d F11             C                   x'3b'                  
d F12             C                   x'3c'               
d F13             C                   x'b1'
d F14             C                   x'b2'
d F15             C                   x'b3'
d F16             C                   x'b4'
d F17             C                   x'b5'
d F18             C                   x'b6'
d F19             C                   x'b7'
d F20             C                   x'b8'
d F21             C                   x'b9'
d F22             C                   x'ba'
d F23             C                   x'bb'
d F24             C                   x'bc'
  // Other attention keys                  
d Clear_Key       C                   x'bd'
d Enter           C                   x'f1'
d Help            C                   x'f3'
d PageUp          C                   x'f4'
d PageDown        C                   x'f5'
d Print_Key       C                   x'f6'
d Auto_Enter      C                   x'50'
d Light_Pen_Enter...
d                 C                   x'3f'

Once you have the code in place to receive the indicators and have your descriptive name defined, you need to do one last thing before writing your new code. You need to add the INDARA keyword to the display file DDS. Once that's done and you've recompiled the display, you can start removing the indicators from the code and replacing them with your new descriptive field names.

Another little trick I use to make my code more understandable is two constants called TRUE and FALSE. They are defined as show below:

d TRUE            C                   '1'
d FALSE           C                   '0'

Then, whenever I do comparisons or set the value of any of my "named indicators," I use the TRUE and FALSE constants. So the code might look something like this:

/free
 chain(en) Custno customer;
 if not %found;
    CustomerNbr_Error = TRUE;
 Endif;

/end-free

For those of you who are thinking that we're still using "indicators" and we've just given them names, you are correct. However, in my humble opinion, you are quibbling over semantics. I could make a case that a Boolean variable in C++ is simply another name for an "indicator," and I'd be right too. But I think we can all agree that the code shown above is more clear about what is actually happening than this code:

C     custno        chain     Customer                           21  

Or even this:

/free
 chain(en) Custno customer;
 if not %found;
    *in21 = *on;
 endif;
/end-free


Good luck, and don't use indicators...ever!

Jeff Olen is the owner of Olen Business Consulting, Inc., an iSeries development services company based in Orange, California. When he's not busy writing code or writing articles, you can find him jumping out of perfectly good airplanes (a.k.a. skydiving). To find out more about Jeff or Olen Business Consulting, Inc. go to www.olen-inc.com or email Jeff at This email address is being protected from spambots. You need JavaScript enabled to view it..



Jeff Olen

Jeff Olen is a super-spy now but keeps his cover identity intact by working for video game studios on the East Coast. So when he’s not out killing members of ISIS or rescuing refugees, you can find him playing Wolfenstein II or testing the new Fallout 76 releases at his beach house in Costa Rica. In any case, he can’t be reached. You can email his cat at This email address is being protected from spambots. You need JavaScript enabled to view it.. She will pass on your message…if she feels like it.


MC Press books written by Jeff Olen available now on the MC Press Bookstore.

The IBM i Programmer’s Guide to PHP The IBM i Programmer’s Guide to PHP
Get the scoop on how PHP can—and should—be deployed on IBM systems.
List Price $79.95

Now On Sale

BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  •  

  • 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.

  • 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

  • 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: