Question

I'm trying to compile my RPGLE program and I keep getting errors stating that a file i declared at the top is ignored due to no external description. What does this mean? I've been trying to figure it out and still can't come up with a solution. The errors are below the code.

 FSHIFTRATESIF   E             DISK    RENAME(SHIFTRATES:SHIFTRATER)
 FALLSHIFT  IF   E           K DISK    RENAME(ALLSHIFT:ALLSHIFTER)
 FCONFIRMPAYCF   E             WORKSTN
 FPAYRPT    O    E             PRINTER OFLIND(*IN01)
 DHOURSOVER        S              3  0
  /FREE

   READ SHIFTRATES;
   WRITE TITLE;
   WRITE COLHDG;
   READ ALLSHIFT;
   DOW NOT %EOF;
     EXSR PAYSR;
     IF *IN01;
       WRITE TITLE;
       WRITE COLHDG;
       *IN01 = *OFF;
       ENDIF;
       WRITE EMPDETAIL;
       READ ALLSHIFT;
   ENDDO;

       WRITE TOTALS;
       EXFMT RECORD1;
       *INLR = *ON;
       RETURN;

       BEGSR PAYSR;
       SELECT;
         WHEN WORKSHIFT = 'D';
           HOURLYRATE = DAYRATE;
           WHEN WORKSHIFT = 'A';
             HOURLYRATE = AFTRATE;
             WHEN WORKSHIFT = 'N';
               HOURLYRATE = NIGHTRATE;
       ENDSL;

       SELECT;
         WHEN PAYGRADE = '1';
           HOURLYRATE = HOURLYRATE * 1.07;
           WHEN PAYGRADE = '2';
             HOURLYRATE = HOURLYRATE * 1.05;
             WHEN PAYGRADE = '3';
               HOURLYRATE = HOURLYRATE * 0.95;
       ENDSL;

       IF HRSWORKED > 40;
         REGULARPAY = 40 * HOURLYRATE;
         HOURSOVER = HRSWORKED - 40;
         OVERPAY = HOURSOVER * HOURLYRATE * 1.5;
         TOTREGPAY = TOTREGPAY + REGULARPAY;
         TOTOVTPAY = TOTOVTPAY + OVERPAY;

         ELSE;
           REGULARPAY = HRSWORKED * HOURLYRATE;
           TOTREGPAY = TOTREGPAY + REGULARPAY;
           TOTALPAY = OVERPAY + REGULARPAY;
           OVERPAY = 0;
           ENDIF;
           TOTEMPPAY = TOTREGPAY + TOTOVTPAY;
           ENDSR;

           /END-FREE

      FSHIFTRATESIF   E             DISK    RENAME(SHIFTRATES:SHIFTRATER)
 FALLSHIFT  IF   E           K DISK    RENAME(ALLSHIFT:ALLSHIFTER)
 FCONFIRMPAYCF   E             WORKSTN
 FPAYRPT    O    E             PRINTER OFLIND(*IN01)
 DHOURSOVER        S              3  0
  /FREE

   READ SHIFTRATES;
   WRITE TITLE;
   WRITE COLHDG;
   READ ALLSHIFT;
   DOW NOT %EOF;
     EXSR PAYSR;
     IF *IN01;
       WRITE TITLE;
       WRITE COLHDG;
       *IN01 = *OFF;
       ENDIF;
       WRITE EMPDETAIL;
       READ ALLSHIFT;
   ENDDO;

       WRITE TOTALS;
       EXFMT RECORD1;
       *INLR = *ON;
       RETURN;

       BEGSR PAYSR;
       SELECT;
         WHEN WORKSHIFT = 'D';
           HOURLYRATE = DAYRATE;
           WHEN WORKSHIFT = 'A';
             HOURLYRATE = AFTRATE;
             WHEN WORKSHIFT = 'N';
               HOURLYRATE = NIGHTRATE;
       ENDSL;

       SELECT;
         WHEN PAYGRADE = '1';
           HOURLYRATE = HOURLYRATE * 1.07;
           WHEN PAYGRADE = '2';
             HOURLYRATE = HOURLYRATE * 1.05;
             WHEN PAYGRADE = '3';
               HOURLYRATE = HOURLYRATE * 0.95;
       ENDSL;

       IF HRSWORKED > 40;
         REGULARPAY = 40 * HOURLYRATE;
         HOURSOVER = HRSWORKED - 40;
         OVERPAY = HOURSOVER * HOURLYRATE * 1.5;
         TOTREGPAY = TOTREGPAY + REGULARPAY;
         TOTOVTPAY = TOTOVTPAY + OVERPAY;

         ELSE;
           REGULARPAY = HRSWORKED * HOURLYRATE;
           TOTREGPAY = TOTREGPAY + REGULARPAY;
           TOTALPAY = OVERPAY + REGULARPAY;
           OVERPAY = 0;
           ENDIF;
           TOTEMPPAY = TOTREGPAY + TOTOVTPAY;
           ENDSR;

           /END-FREE

  FSHIFTRATESIF   E             DISK    RENAME(SHIFTRATES:SHIFTRATER)
 FALLSHIFT  IF   E           K DISK    RENAME(ALLSHIFT:ALLSHIFTER)
 FCONFIRMPAYCF   E             WORKSTN
 FPAYRPT    O    E             PRINTER OFLIND(*IN01)
 DHOURSOVER        S              3  0
  /FREE

   READ SHIFTRATES;
   WRITE TITLE;
   WRITE COLHDG;
   READ ALLSHIFT;
   DOW NOT %EOF;
     EXSR PAYSR;
     IF *IN01;
       WRITE TITLE;
       WRITE COLHDG;
       *IN01 = *OFF;
       ENDIF;
       WRITE EMPDETAIL;
       READ ALLSHIFT;
   ENDDO;

       WRITE TOTALS;
       EXFMT RECORD1;
       *INLR = *ON;
       RETURN;

       BEGSR PAYSR;
       SELECT;
         WHEN WORKSHIFT = 'D';
           HOURLYRATE = DAYRATE;
           WHEN WORKSHIFT = 'A';
             HOURLYRATE = AFTRATE;
             WHEN WORKSHIFT = 'N';
               HOURLYRATE = NIGHTRATE;
       ENDSL;

       SELECT;
         WHEN PAYGRADE = '1';
           HOURLYRATE = HOURLYRATE * 1.07;
           WHEN PAYGRADE = '2';
             HOURLYRATE = HOURLYRATE * 1.05;
             WHEN PAYGRADE = '3';
               HOURLYRATE = HOURLYRATE * 0.95;
       ENDSL;

       IF HRSWORKED > 40;
         REGULARPAY = 40 * HOURLYRATE;
         HOURSOVER = HRSWORKED - 40;
         OVERPAY = HOURSOVER * HOURLYRATE * 1.5;
         TOTREGPAY = TOTREGPAY + REGULARPAY;
         TOTOVTPAY = TOTOVTPAY + OVERPAY;

         ELSE;
           REGULARPAY = HRSWORKED * HOURLYRATE;
           TOTREGPAY = TOTREGPAY + REGULARPAY;
           TOTALPAY = OVERPAY + REGULARPAY;
           OVERPAY = 0;
           ENDIF;
           TOTEMPPAY = TOTREGPAY + TOTOVTPAY;
           ENDSR;

           /END-FREE

RNF2120: External descriptions for file ALLSHIFT not found. file is ignored

RNF2120: External desciptions for file SHIFTRATE not found. file is ignored

Was it helpful?

Solution

The most common cause would be that those files are not on the library list when compiling.

OTHER TIPS

Maybe I can help you here with a couple of RDi things that will make life easier in the long run plus help you out here.

RDI like it's predecessor WDSc has 3 modes that it can run things in. In green on black (5250) you only have two which are Batch and Interactive. RDi has Batch, Interactive, and one called Normal. Normal is where RDi will compile RPG code in.

The normal mode is very flexible and typically loads a library list from the job description that is attached to your user profile when you sign on. So if you sign on multiple boxes, you could have differing library lists depending on how you are set up. Expect inconsistency, because it is much more consistent.

Depending on what you are working on you may want to be able to have several library lists to choose from. A great way to do that is to create a library list loader program(s) to load various library lists with a single click.

To do this, create a CLLE (or CLP) source member in your development library. In the source member between the PGM and ENDPGM commands, use the change library list command (CHGLIBL) and enter in the library list that you wish to use. Have QTEMP at the top, and QGPL at the bottom (just a strong suggestion). Compile this program. For a naming convention, I use SET@XXX to let me know that these programs are library list loaders. It's your call here. Another tip, use green on black to build this CLLE program when you prompt up the CHGLIBL command, it is easier to cut and paste the libraries from an actual library list into the command. Old school but it is fast.

In RDI, in the Remote Systems Explorer you can create your own commands per system. Create a command that specifically calls your new CLLE program. Specify the library, program name, and select NORMAL as how it should run.

You can view your current library list in the Remote Systems Explorer. View it once you have signed on. Then double click on the new command you have created. Then view the library list again. It will reload with the updated library list.

Try it out. Once you get used to using the three runtime modes of RDi, there are many ways you can expand your work within this marvelous tool.

Change Library list CHGLIBL documentation:

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fcl%2Fchglibl.htm

Also, make sure that your library you are editing is inside of your EDITLIBL list. That was my issue.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top