一、进入编译后的脱机文件中
在编译程序时如果出错,在命令行执行“WRKSPLF” ,然后用 SHIFT+F6 去到最末尾,
可以看到名称为“程序名”的脱机文件(SPOOL FILE) ,用 5进入,查看出错信息。
二、了解当前编译的错误信息的类型、数量
假设程序 FHS02R 编译时出错, 进入到编译后的脱机文件中, 先在 “Control”
处,填“B” ,确认,到最末尾,可看到类似于这样的信息:
F i n a l S u m m a r y
Message Totals:
Information (00) . . . . . . . : 1
Warning (10) . . . . . . . : 0
Error (20) . . . . . . . : 0
Severe Error (30+) . . . . . . : 2
--------------------------------- -------
Total . . . . . . . . . . . . . : 3
这就表示当前程序编译之后,有 2个 30 级的错误,1 个 00级的错误,总共有 3 个错误。
00 级的错误仅是信息级别(Information),可以不理会;
10 级的错误是警告,也可以不理会;
20、30 级别的错误就是正式的错误,也就是不解决它们,程序就无法编译通过
总之,级别越大,就表示错误的问题越严重,所以排错的顺序,是先大后小。即先排除
40 级错误,再来查 30 级错误,然后才是 20 级。所以说,排错顺序是先大后小。
三、查找出错信息对应的代码行
脱机文件的最后一页,是错误的汇总信息,向上翻页,查看具体错误信息,仍是上例:
M e s s a g e S u m m a r y
Msg id Sv Number Message text
*RNF7086 00 1 RPG handles blocking for the file. INFDS is updated only
blocks of data are transferred.
*RNF7030 30 1 The name or indicator is not defined.
*RNF7515 30 1 The move operation has operands that are not compatible.
* * * * * E N D O F M E S S A G E S U M M A R Y * * * * *
5722WDS V5R1M0 010525 RN IBM ILE RPG FHSLIB/FHS02R
注意看,这里有两个 30级错误,RNF7030,RNF7515。
以 7030 为例,在“Find”处,输入 7030,然后 SHIFT+F4 查找(也就是在脱机文件中
查找 7030) ,多找几下,就可以看到具体的错误信息:
Msg id Sv Number Seq Message text
*RNF7030 30 12 000009 The name or indicator FHS20 is not defined.
可以很清楚地看到,就是说代码第 12 行,字段“FHS20”没有定义。
这里,Number项的值,就表示代码行数。当然,这个代码并不是我们源代码中的行数,
而是指编译之后的执行代码中的行数。可以从脱机文件中的程序代码处从头开始看起,如:
12 C MOVE ‘ABCD’ FHS20
这个最左边的 12,就表示这是代码执行的第 12行。
当我们查看到是错误行的语句之后, 就可以回到源代码中, 按图索骥地找到错误的代码,然后修正它。
四、常见编译出错信息:
RNF2120 声明的文件不存在
RNF7030 变量未定义, 通常随着如果变量未定义, 那么与该变量有关的每一句话, 都会报错,
并且除了 7030 之外,还会有诸如类型不匹配这些的错误,所以排错时,一般都是先修改 7030 的错误。
RNF5177 使用了 DO、FOR、DOW、IF、SELECT 语句时,漏写了相应的 END语句