Exploring the Program Status and File Information Data Structures

No doubt the program status and file information data structures each contain a large number of fields. If you have never done an in-depth review of the data available in these data structures then this article should help.

For years programmers have been retrieving data assigned to physical files, display files, ICF (Intersystem Communications Function) files, and printer files in the form of the file information data structure.

Any fields that might be needed should be coded since if the field is not included in the source then the information will not be available to the program and will not be displayed in a formatted dump. If not sure then it is best to include any fields in question.

First, with the program status data structure (SDS) the programmer should be familiar, at a minimum, with the high-lighted fields in each data structure.

     D                SDS 
     D PROC_NAME        *PROC                      Procedure name 
     D PGM_STATUS       *STATUS                    Status code
     D PRV_STATUS             16     20S 0         Previous status
     D LINE_NUM               21     28            Src list line nu
     D ROUTINE          *ROUTINE                   Routine name
     D PARMS            *PARMS                     Num passed parms
     D EXCP_TYPE              40     42            Exception type
     D EXCP_NUM               43     46            Exception number 
     D PGM_LIB                81     90            Program library
     D EXCP_DATA              91    170            Exception data
     D EXCP_ID               171    174            Exception Id
     D DATE                  191    198            Date (DATE fmt)
     D YEAR                  199    200S 0         Year (YEAR fmt)
     D LAST_FILE             201    208            Last file used
     D FILE_INFO             209    243            File error info
     D JOB_NAME              244    253            Job name
     D USER                  254    263            User name
     D JOB_NUM               264    269S 0         Job number
     D JOB_DATE              270    275S 0         Date (UDATE fmt)
     D RUN_DATE              276    281S 0         Run date (UDATE)
     D RUN_TIME              282    287S 0         Run time (UDATE)
     D CRT_DATE              288    293            Create date
     D CRT_TIME              294    299            Create time
     D CPL_LEVEL             300    303            Compiler level
     D SRC_FILE              304    313            Source file
     D SRC_LIB               314    323            Source file lib
     D SRC_MBR               324    333            Source file mbr
     D PROC_PGM              334    343            Pgm Proc is in
     D PROC_MOD              344    353            Mod Proc is in
     D CURR_USER             358    367            Mod Proc is in


Many legacy programs use the SDS to check the number of parameters being passed and one might wonder about whether this method will still function with prototyping parameters. Generally such older programs will not need to be retrofitted but programmers should start relying on the new built-in function %parms instead of *PARMS.

As stated in a previous article on this website;
"At times it is necessary to determine how many parameters are being passed and the built-in function (BIF) %parms can be used for this purpose. The older method of coding a system data structure SDS with the *PARMS field still works but is no longer necessary nor is it preferable going forward. It is necessary to understand how parameters are passed with prototyping and procedure interface specifications."

Next, the file information data structure (INFDS) is divided into five sections. These sections are called feedback areas and are, in order of appearance, the File, Open, Input/Output, Device Specific, and the "Get Attributes" feedback areas. For files the INFDS name must be unique for each file.

The file information data structure (INFDS) looks like this (again the bold font emphasizes basic familiarity is required):

      * Standard RPG file feedback area 1-80
     DINFDS            ds
     D File              *FILE                          * File name
     D OpenInd                 9      9                 * File open?
     D EOFInd                 10     10                 * File at eof?
     D FileStatus        *STATUS                        * Status code
     D OpCode            *OPCODE                        * Last opcode
     D Routinr           *ROUTINE                       * RPG Routine
     D ListNum                30     37                 * Listing line
     D SpclStat               38     42S 0              * SPECIAL status
     D RecordFmt         *RECORD                        * Record name
     D MsgID                  46     52                 * Error MSGID
     D Screen_P          *SIZE                          * Screen size
     
      * Open feedback area 81-240
      * 
     D ODP_TYPE               81     82            * ODP Type
     D FILE_NAME              83     92            * File name
     D LIBRARY                93    102            * Library name
     D SPOOL_FILE            103    112            * Spool file name
     D SPOOL_LIB             113    122            * Spool file lib
     D SPOOL_NUM             123    124I 0         * Spool file num
     D RCD_LEN               125    126I 0         * Max record len
     D KEY_LEN               127    128I 0         * Max key len
     D MEMBER                129    138            * Member name
     D TYPE                  147    148I 0         * File type
     D ROWS                  152    153I 0         * Num PRT/DSP rows
     D COLUMNS               154    155I 0         * Num PRT/DSP cols
     D NUM_RCDS              156    159I 0         * Num of records
     D ACC_TYPE              160    161            * Access type
     D DUP_KEY               162    162            * Duplicate key?
     D SRC_FILE              163    163            * Source file?
     D VOL_OFF               184    185I 0         * Vol label offs
     D BLK_RCDS              186    187I 0         * Max rcds in bl
     D OVERFLOW              188    189I 0         * Overflow line
     D BLK_INCR              190    191I 0         * Blk increment
     D FLAGS1                196    196            * Misc flags
     D REQUESTER             197    206            * Requester name
     D OPEN_COUNT            207    208I 0         * Open count
     D BASED_MBRS            211    212I 0         * Num based mbrs
     D FLAGS2                213    213            * Misc flags
     D OPEN_ID               214    215            * Open identifie
     D RCDFMT_LEN            216    217I 0         * Max rcd fmt le
     D CCSID                 218    219I 0         * Database CCSID
     D FLAGS3                220    220            * Misc flags
     D NUM_DEVS              227    228I 0         * Num devs defin

     D* I/O feedback area 241-366
     D                                             * 241-242 not used
     D WRITE_CNT             243    246I 0         * Write count
     D READ_CNT              247    250I 0         * Read count
     D WRTRD_CNT             251    254I 0         * Write/read count
     D OTHER_CNT             255    258I 0         * Other I/O count
     D OPERATION             260    260            * Current operation
     D IO_RCD_FMT            261    270            * Rcd format name
     D DEV_CLASS             271    272            * Device class
     D IO_PGM_DEV            273    282            * Pgm device name
     D IO_RCD_LEN            283    286I 0         * Rcd len of I/O

     D* POST area 241-nnn
     D* Display
     D PGM_DEV_P             241    250            * Program device
     D DEV_DSC_P             251    260            * Dev description
     D USER_ID_P             261    270            * User ID
     D DEV_CLASS_P           271    271            * Device class
     D DEV_TYPE_P            272    277            * Device type
     D REQ_DEV_P             278    278            * Requester?
     D ACQ_STAT_P            279    279            * Acquire status
     D INV_STAT_P            280    280            * Invite status
     D DATA_AVAIL_P          281    281            * Data available
     D NUM_ROWS_P            282    283I 0         * Number of rows
     D NUM_COLS_P            284    285I 0         * Number of cols
     D BLINK_P               286    286            * Allow blink?
     D LINE_STAT_P           287    287            * Online/offline?
     D DSP_LOC_P             288    288            * Display location
     D DSP_TYPE_P            289    289            * Display type
     D KBD_TYPE_P            290    290            * Keyboard type
     D CTL_INFO_P            342    342            * Controller info
     D COLOR_DSP_P           343    343            * Color capable?
     D GRID_DSP_P            344    344            * Grid line dsp? 
        
     D* Device independent area 367-nnn
     D*

     D* Printer
     D CUR_LINE              367    368I 0         * Current line num
     D CUR_PAGE              369    372I 0         * Current page cnt
     D PRT_MAJOR             401    402            * Major ret code
     D PRT_MINOR             403    404            * Minor ret code

     D* Disk
     D FDBK_SIZE             367    370I 0         * Size of DB fdbk
     D JOIN_BITS             371    374I 0         * JFILE bits
     D LOCK_RCDS             377    378I 0         * Nbr locked rcds
     D POS_BITS              385    385            * File pos bits
     D DLT_BITS              384    384            * Rcd deleted bits
     D NUM_KEYS              387    388I 0         * Num keys (bin) 
     D KEY_LEN               393    394I 0         * Key length 
     D MBR_NUM               395    396I 0         * Member number
     D DB_RRN                397    400I 0         * Relative-rcd-num
     D KEY                   401   2400            * Key value (max
     D*                                            *   size 2000)

     D* Display
     D DSP_FLAG1             367    368            * Display flags
     D DSP_AID               369    369            * AID byte
     D CURSOR                370    371            * Cursor location
     D DATA_LEN              372    375I 0         * Actual data len
     D SF_RRN                376    377I 0         * Subfile rrn
     D MIN_RRN               378    379I 0         * Subfile min rrn
     D NUM_RCDS              380    381I 0         * Subfile num rcds
     D ACT_CURS              382    383            * Active window
     D*                                            *  cursor location
     D DSP_MAJOR             401    402            * Major ret code
     D DSP_MINOR             403    404            * Minor ret code

Also, some research into the major/minor error status codes (for program and file exceptions) is time well-spent. An exception handling subroutine INFSR can be specified on file specifications to assist with error-trapping. Of course ON-ERROR works great in many situations where some special processing is needed when an error occurs.