我正在尝试编译我的RPGLE程序,并且我不断收到错误,指出由于没有外部描述而忽略了我在顶部声明的文件。这是什么意思?我一直试图弄清楚它仍然无法提出解决方案。错误低于代码。
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:找不到文件ALLSHIFT的外部描述。文件被忽略
RNF2120:找不到文件SHIFTRATE的外部描述。文件被忽略
答案 0 :(得分:2)
最常见的原因是编译时这些文件不在库列表中。
答案 1 :(得分:1)
也许我可以在这里帮助你一些RDi的东西,从长远来看会让生活更轻松,并帮助你在这里。
RDI喜欢它的前身WDSc有3种模式可以运行。绿色黑色(5250)你只有两个是Batch和Interactive。 RDi有Batch,Interactive和一个名为Normal的。 Normal是RDi将编译RPG代码的地方。
正常模式非常灵活,通常会在您登录时从作业说明中加载库列表,该列表会附加到您的用户个人资料中。因此,如果您在多个框上签名,则可能会有不同的库列表,具体取决于您的设置方式。期待不一致,因为它更加一致。
根据您的工作情况,您可能希望能够有多个库列表供您选择。一个很好的方法是创建一个库列表加载器程序,只需单击一下即可加载各种库列表。
为此,请在开发库中创建CLLE(或CLP)源成员。在PGM和ENDPGM命令之间的源成员中,使用更改库列表命令(CHGLIBL)并输入要使用的库列表。 QTEMP在顶部,QGPL在底部(只是一个强烈的建议)。编译这个程序。对于命名约定,我使用SET @XX来告诉我这些程序是库列表加载器。这是你的电话。另一个提示是,当你提示CHGLIBL命令时,使用黑色绿色来构建这个CLLE程序,更容易将库从实际的库列表中剪切并粘贴到命令中。老派但它很快。
在RDI中,在远程系统资源管理器中,您可以为每个系统创建自己的命令。创建一个专门调用新CLLE程序的命令。指定库,程序名称,然后选择NORMAL作为它应该如何运行。
您可以在远程系统资源管理器中查看当前库列表。登录后查看。然后双击您创建的新命令。然后再次查看库列表。它将使用更新的库列表重新加载。
试一试。一旦习惯了使用RDi的三种运行时模式,有很多方法可以在这个奇妙的工具中扩展你的工作。
更改库列表CHGLIBL文档:
http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Fcl%2Fchglibl.htm
答案 2 :(得分:0)
另外,请确保您编辑的库位于EDITLIBL
列表中。这是我的问题。