24
Tue, Dec
1 New Articles

Cool Things: Retrieving Program Information

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

 

Who writes the commands that IBM forgot to write?

 

Every now and then, I think that there are functions that IBM simply forgot to provide. One example is the inability to do a command like DSPPGM for all programs in a given library. I recently had a need for exactly this functionality. It seemed like a perfect opportunity to create a new utility. In this tip, I'll show you the GETPGMINFO utility.

The GETPGMINFO Command

The GETPGMINFO command is what will allow us to display program information for all programs in a library. This command accepts four parameters as shown below:

 

GETPGMINFO    PGMNAME(library/program) 
                   OUTTYPE(output-type
                   OUTFILE(output-library/output-file)
                   OUTMBR(output-member)

 

The PGMNAME parameter is used to supply the qualified library/program for the command. Note that *ALL can be used for the program name to show all programs in the supplied library. The OUTTYPE parameter is used to identify where the output should be sent. Valid options are * to send the output to the screen, *PRINT to generate a printer file with the results, and *OUTFILE to send the output to the physical file/member identified on the OUTFILE and OUTMBR parameters.

The Code

The key to this utility is the QCLRPGMI API. This API allows us to retrieve the same type of program information that can be displayed using the DSPPGM command. The difference here is that instead of being restricted to a single program, our command will call this API multiple times and send the output to a printer file, a physical file, or the display. The code for this tip is made up of a command, a CL program, an RPGLE program, and a physical file. The source for the CL program is shown below.

 

 

PGM       PARM(&QUALPGM &OUTTYPE &OUTFILE &OUTMBR)

 

 

 

DCL       VAR(&QUALPGM) TYPE(*CHAR) LEN(20)

 

DCL       VAR(&OUTTYPE) TYPE(*CHAR) LEN(8)

 

DCL       VAR(&OUTFILE) TYPE(*CHAR) LEN(20)

 

DCL       VAR(&OUTMBR) TYPE(*CHAR) LEN(10)

 

DCL       VAR(&OUTFLE) TYPE(*CHAR) LEN(10)

 

DCL       VAR(&OUTLIB) TYPE(*CHAR) LEN(10)

 

DCL       VAR(&PGMNAME) TYPE(*CHAR) LEN(10)

 

DCL       VAR(&PGMLIBR) TYPE(*CHAR) LEN(10)

 

 

 

CHGVAR VAR(&PGMNAME) VALUE(%SST(&QUALPGM 1 10))

 

CHGVAR VAR(&PGMLIBR) VALUE(%SST(&QUALPGM 11 10))

 

DSPOBJD   OBJ(&PGMLIBR/&PGMNAME) OBJTYPE(*PGM) +

 

          OUTPUT(*OUTFILE) OUTFILE(QTEMP/PGMS)

 

 

 

IF         COND(&OUTTYPE *EQ '*OUTFILE') THEN(DO)

 

   CHGVAR VAR(&OUTFLE) VALUE(%SST(&OUTFILE 1 10))

 

   CHGVAR VAR(&OUTLIB) VALUE(%SST(&OUTFILE 11 10))

 

ENDDO

 

ELSE CMD(DO)

 

   CHGVAR VAR(&OUTFLE) VALUE('PGMINFO')

 

   CHGVAR VAR(&OUTLIB) VALUE('QTEMP')

 

ENDDO

 

CRTDUPOBJ OBJ(PGMINFO) FROMLIB(*LIBL) OBJTYPE(*FILE) +

 

            TOLIB(&OUTLIB) NEWOBJ(&OUTFLE)

 

MONMSG     MSGID(CPD2104 CPF2130) EXEC(CLRPFM +

 

             FILE(&OUTLIB/&OUTFLE))

 

 

 

CHGPF     FILE(&OUTLIB/&OUTFLE) MAXMBRS(*NOMAX)

 

ADDPFM     FILE(&OUTLIB/&OUTFLE) MBR(&OUTMBR)

 

MONMSG     MSGID(CPF5812 CPF7306) EXEC(CLRPFM +

 

            FILE(&OUTLIB/&OUTFLE) MBR(&OUTMBR))

 

 

 

OVRDBF     FILE(PGMINFO) TOFILE(&OUTLIB/&OUTFLE) +

 

              MBR(&OUTMBR) OVRSCOPE(*JOB)

 

OVRDBF     FILE(QADSPOBJ) TOFILE(QTEMP/PGMS) +

 

             OVRSCOPE(*JOB)

 

 

 

CALL       PGM(GETPGMINFO)

 

 

 

IF COND(&OUTTYPE *EQ '*PRINT') THEN(DO)

 

   RUNQRY QRYFILE((QTEMP/PGMINFO *FIRST)) +

 

            OUTTYPE(*PRINTER)

 

ENDDO

 

IF COND(&OUTTYPE *EQ '*DISPLAY') THEN(DO)

 

RUNQRY     QRYFILE((QTEMP/PGMINFO *FIRST)) +

 

            OUTTYPE(*DISPLAY)

 

ENDDO

 

ENDPGM

 

 

This CL program performs all of the control functions for the command. It first generates a list of program objects matching what was supplied on the PGMNAME parameter. Note that this value can be a single program, a wildcard, or *ALL. Next, the program determines if it needs to create an output file based on the output type identified on the OUTTYPE parameter. Next, the GETPGMINFO RPGLE is used to extract the program information. This program reads through the output of the DSPOBJD command, which uses the format of the IBM file QADSPOBJ. That command was used to extract a list of program objects within the CL program described above. After that, our RPGLE program calls the IBM QCLRPGMI API to extract program information. This API returns a data structure containing the same information that is displayed by the DSPPGM command. The resulting data is written to the PGMINFO file. The layout for that file is shown in the table below.

 

File Layout for the File PGMINFO

Field Name

Type

Length

Description

PINNAME

Char

10

Program Name

PINLIBRARY

Char

10

Program Library

PINOWNER

Char

10

Object Owner

PINATTR

Char

10

Program Attribute (type)

PINCRTDTTM

Char

13

Date/Time Created

PINSRCFILE

Char

10

Source File

PINSRCFLLB

Char

10

Source Library

PINSRCMBR

Char

10

Source Member

PINSRCUPDT

Char

13

Source Update Date/Time

PINOBSRVBL

Char

1

Observable Flag

PINUSRPROP

Char

6

User Profile

PINUSEADAU

Char

1

Use Adopted Authority

 

A few notes on the values in this table: ILE programs do not show any of the source information because of the fact that they are created from a module. The link exists between the source and the module, not the source and the program. The RPGLE program GETPGMINFO is used to repeatedly call the QCLRPGMI API for each program in the list generated by the DSPOBJD command in our CL program.

 

     //------------------------------------------------------------------------

     // Program: GetPgmInfo

     //

      // Description: Retrieve program information using the QCLRPGMI API

     //

     // Copyright 2012 Mike Faust

     //------------------------------------------------------------------------

     FQADSPOBJ if   e             DISK

     Fpgminfo   o a e             DISK

 

     dpep             pr                 EXTPGM('GETPGMINFO')

     d parpgm                       10a

     d parlibr                       10a

 

     dpep             pi

     d parpgm                       10a

     d parlibr                      10a

 

     dRtvPgmInfo       pr                 ExtPgm('QCLRPGMI')

     d OutputData                 32767a   Options(*varsize)

     d Len                           10i 0 Const

     d Format                         8a   Const

     d PgmName                       20a   Const

     d ErrorCode                           LikeDS(ErrorDS)

 

     dPGMI0100         ds                 Qualified

     d BytesReturned                 10i 0

     d BytesAvailable               10i 0

     d Name                          10a

     d Library                       10a

     d Owner                         10a

     d Attribute                     10a

     d CrtDateTime                   13a

     d SrcFile                       10a

     d SrcFileLib                    10a

     d SrcMbr                       10a

     d SrcUpdDateTime               13a

     d Observable                     1a

     d UsrPrfOption                   1a

     d UseAdpAut                     1a

     d LogCmd                         1a

   d AlwRTVCLSRC                   1a

     d FixDec                         1a

     d Text                         50a

     d PgmType                       1a

     d TeraspaceEnabled...

     d                               1a

     d                              58a

     d MinParms                     10i 0

     d MaxParms                     10i 0

     d Size                         10i 0

     d AssocSpcSize                 10i 0

     d StaticStgSize                 10i 0

     d AutoStgSize                  10i 0

     d MICount                       10i 0

     d MIODTCount                   10i 0

     d State                         1a

     d CompilerID                   14a

     d OSCanRunOn                     6a

     d SrtSeqTbl                    10a

     d SrtSeqTblLib                 10a

     d LangID                       10a

     d Domain                         1a

     d ConvRequired                   1a

     d                               20a

     d Optimized                     1a

     d PagingPool                     1a

     d UpdPASA                       1a

     d ClrPASA                       1a

     d PagingAmt                     1a

     d                               18a

     d PEPMod                       10a

     d PEPModLib                     10a

     d ActGrpAttr                   30a

     d ObservInfoCompressed...

     d                               1a

     d RuntimeInfoCompressed...

     d                               1a

     d OSCrtOn                       6a

     d SharedActGrp                   1a

     d AlwUpd                         1a

     d CCSID                         10i 0

     d ModCount                     10i 0

     d SrvPgmCount                   10i 0

     d CopyrightCount               10i 0

     d UnresolveRefCount...

     d                               10i 0

     d OSCrtFor                       6a

     d AlwStaticReinit...

     d                               1a

     d CrtDta                         1a

     d AlwBndSrvPgmLibUpd...

     d                               1a

     d ProfilingData                 10a

     d TeraspaceEnabledModules...

     d                               1a

     d StgMdl                         1a

     d                               87a

 

     dErrorDS        ds                 Qualified

     d BytesProvided                 10i 0 Inz(%Size(ErrorDS))

     d BytesAvailable               10i 0

     d MsgID                         7a

     d                               1a

     d Text                         500a   Varying

 

     dwrkQualPgm       s             20a

 

     /free

 

       read QLIDOBJD;

       dow not %eof();

         wrkQualPgm = ODOBNM + ODLBNM;

         RtvPgmInfo (pgmi0100: 540: 'PGMI0100': wrkQualPgm: ErrorDS);

         if ErrorDS.BytesAvailable = 0;

             clear pgminfor;

             pinNAME = PGMI0100.Name;

             pinLIBRARY = PGMI0100.Library;

             pinOWNER = PGMI0100.Owner;

             pinATTR = PGMI0100.Attribute;

             pinCRTDTTM = PGMI0100.CrtDateTime;

           pinSRCFILE = PGMI0100.SrcFile;

             pinSRCFLLB = PGMI0100.SrcFileLib;

             pinSRCMBR = PGMI0100.SrcMbr;

             pinSRCUPDT = PGMI0100.SrcUpdDateTime;

             pinOBSRVBL = PGMI0100.Observable;

             select;

              when PGMI0100.UsrPrfOption = 'U';

                   pinUSRPROP = '*USER';

               when PGMI0100.UsrPrfOption = 'O';

                   pinUSRPROP = '*OWNER';

             endsl;

             pinUSEADAU = PGMI0100.UseAdpAut;

             write pgminfor;

         endif;

         read QLIDOBJD;

       enddo;

       *inlr = *on;

       return;

 

As you can see, the code here simply loops through the file, calling QCLRPGMI and writing the results to the PGMINFO file. That file is then used to generate either the printed report, physical file, or display output. Figure 1 below shows a sample of the output as generated using *DISPLAY output type.

 

 

Figure 1: This is the output generated by the GETPGMINFO command.

 

This was generated for all programs in the QSYS library. Below is the command that was called to generate this sample:

 

GETPGMINFO PGMNAME(QSYS/*ALL) OUTTYPE(*DISPLAY)  

The "Why"

The reasons why you might want this command are numerous. It may simply be that you want to identify all of the programs in a given library that are owned by a specific user. Possibly, you might want to find every program that uses adopted authority. Whatever your reason, I hope this utility helps to make your job a little easier.

 

 

 

 

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: