RPG Ⅳ基础
> BREAK 40 WHEN *IN02=1 > BREAK 40 WHEN DATA1=100
CLEAR:清除断点 > CLEAR 40
> CLEAR PGM (清除程序断点)
EQUATE:分配给表达式、变量、调试命令一个短的命名。 > EQUATE EP EVAL (Itemprice*qtyord) (表达式) 键入EP(相当于EVAL (Itemprice*qtyord)),将返回Itemprice*qtyord的值。 > EQUATE EP(Itemprice*qtyord)
键入 EVAL EP,将返回Itemprice*qtyord的值。
DISPLAY EQUATE:显示使用了EQUATE的缩写。
EVAL:显示或修改变量的值。(evaluate)(变量、表达式、记录、数据结果或数组) 用EVAL修改变量的值,要注意被修改变量本身的定义。 > EVAL String (6 characters) STRING = '123456'
> EVAL TableA (3 characters) TABLEA = 'aaa' > EVAL String=TableA
STRING=TABLEA = 'aaa ' > EVAL LastName='Williamson'
LASTNAME='Williamson' = 'Williamson' > EVAL String = %SUBSTR(Lastname 1 8)
STRING = %SUBSTR(LASTNAME 1 8) = 'Willia' (STRING定义为6位) Displaying the Contents of an Array
> EVAL Arry 3S 2 DIM(2) INZ(1.23) ARRY(1) = 1.23 ARRY(2) = 1.23 > EVAL Arry(2) ARRY(2) = 1.23 > EVAL Arry(1..2) ARRY(1) = 1.23 ARRY(2) = 1.23
Displaying Data Structures > EVAL DS3
SET:修改调试选项,例如:the ability to update production files、指定FIND操作是否区分大小写等。
STEP:在调试期间执行一句或多句程序。
RPG Ⅳ基础
FIND:查找指定的行号、字符串或文本。
UPx、DOWNx:上移或下移x行。
LEFTn、RIGHTn:左移或右移n列。
TOP、BOTTOM:移到头部或尾部。
NEXT、PREVIOUS:移到下一处或上一处断点。
HELP:获得调试命令的帮助信息。
跟踪被当前程序调用的程序
在DEBUG 过程中,有时我们希望当前程序在CALL 另一个程序时,还可以跟踪被CALL的程序,比如说当前跟踪的程序是DEBUG#1,DEBUG#1 中CALL 了DEBUG#2,我们跟踪到DEBUG#1 中,运行了一部分代码,现在想看看DEBUG#2 被调用时,是如何运行,这时我们可以通过如下操作来增加跟踪调试的程序:
一、SHIFT+F2(F14),出现如下画面:
Opt Program/module Library Type *LIBL *PGM DEBUG#1 AS06V3LIB *PGM DEBUG#1 *MODULE Selected
二、增加程序
在光标所指向的第一行,OPT 项输入1(即表示增加跟踪的模块),Program/module 项 输入DEBUG#2,然后确认,画面将会变成:
Opt Program/module Library Type DEBUG#2 AS06V3LIB *PGM DEBUG#2 AS06V3LIB *PGM DEBUG#2 *MODULE DEBUG#1 AS06V3LIB *PGM DEBUG#1 *MODULE Selected
三、进入增加的程序
在第三行,也就是DEBUG#2 MODULE这一行,选择“5”,就进入了程序DEBUG#2 中。
四、跟踪调试程序DEBUG#2
进入程序DEBUG#2 之后,仍然是设置断点
接下来按F10,或F12,系统执行到程序DEBUG#1 中的“CALL ‘DEBUG#2’”的语句时,就会进行我们设置的程序DEBUG#2 的断点处。
当程序DEBUG#2 执行完毕之后,程序还会退回到最开始我们DEBUG 的程序中,也即是
RPG Ⅳ基础
DEBUG#1 中。
补充说明:
以上的跟踪被当前程序所调用的程序,仅限于两个程序都是RPGLE 程序。 一定要退出DEBUG 模式
当我们结束DEBUG 调试之后,必须输入“ENDDBG”用来结束DEBUG 调试模式。否则无法进行下次DEBUG 操作,而且可能会带来一些不可预知的错误。
跟踪批处理程序
1。以HOLD(*YES)参数提交JOB到QBATCH JOB中,让JOB暂时挂起; 2。使用WRKSBMJOB查看所提交的JOB的以下3个参数值: *Job id 、*User Name 、*Job Number
3。执行STRSRVJOB,填入第2步骤获得的3个参数进行QBATCH JOB服务过程; 4。执行STRDBG开始DEBUG;
5。利用F21键切换到命令行,在命令行执行WRKSBMJOB,使用6=Release释放挂起的第1步骤提交的JOB,然后系统允许你按F10输入DEBUG命令(注意:不要键入执行,否则在设立断点之前键入执行,程序就会运行,因而无法进行debug断点设置);
6。在OS/400命令行窗口;执行DSPMODSRC后,可通过F6设置断点;然后按F3退出,再按F12退出命令行; 7。键入执行释放挂起的JOB;程序将在断点中停留;可以使用交互式DEBUG使用DEBUG命令进行处理;
8。一旦程序或者JOB结束,使用ENDDBG和ENDSRVJOB结束操作。 补充:
如果在批处理作业的RPGIV 程序中出现交互语句,如:DSPLY;显示文件输入输出语句程序的调用,如:EXFMT,作业将会被挂起处于MESSAGE WAIT 状态,这是因为批处理作业无法处理显示信息而引起的。
常见的出错信息
1 编译程序时的出错信息
一、进入编译后的脱机文件中
在编译程序时如果出错,在命令行执行“WRKSPLF”,然后用SHIFT+F6(F18)去到最末尾,可以看到名称为“程序名”的脱机文件(SPOOL FILE),用5 进入,查看出错信息。 File . . . . . : DEBUG#2 Page/Line 1/1 Control . . . . . Columns 1 - 75 Find . . . . . .
二、了解当前编译的错误信息的类型、数量
如上例,即假设程序DEBUG#2编译时出错,进入到编译后的脱机文件中,先在“Control”处,填“B”,确认,到最末尾,可看到类似于这样的信息: F i n a l S u m m a r y Message Totals:
RPG Ⅳ基础
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 级,以及传说中50 级的错误。40 级的错误通常是程序中声明的文件不存在;50 级的我没见过,只是有人吹嘘他曾经写出过,表示他的RP 与众不同。 总之,级别越大,就表示错误的问题越严重,所以排错的顺序,是先大后小。即先排除40 级错误,再来查30 级错误,然后才是20 级。
举个例子,如果在写代码时,将声明的文件名写错,那么30 级错误可能会有上百个,凡是涉及到与该文件中字段有关的语句,肯定都会报错;此时排除40 级错误(文件名声明错误)之后,会发现30 级错误将会大减少。 所以说,排错顺序是先大后小。
三、查找出错信息对应的代码行
脱机文件的最后一页,是错误的汇总信息,向上翻页,查看具体错误信息,仍是上例: 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(F16)查找(也就是在脱机文件中查找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 行。
当我们查看到是错误行的语句之后,就可以回到源代码中,按图索骥地找到错误的代码,然后修正它。
系统对于错误的提示很准,不用怀疑。(与C 不同,C 编译后,只是说疑似某行出错) 再一次提起要注意,系统提示的,是系统编译时的代码行行数,不是我们自已写的源代码的行数,要注意比对。Number 项标识错误的代码行行数
RPG Ⅳ基础
四、常见编译出错信息: RNF2120:声明的文件不存在
RNF7030:变量未定义,通常随着如果变量未定义,那么与该变量有关的每一句话,都会报错,并且除了7030 之外,还会有诸如类型不匹配这些的错误,所以排错时,一般都是先修改7030 的错误。
RNF5177:使用了DO、FOR、DOW、IF、SELECT 语句时,漏写了相应的END 语句
运行时的出错信息
CPF4328:对声明的文件使用了COMMIT 关键字,但该文件未加入到日志文件中 CPF4131:文件重新编译过,但之后未重新编译该程序
CPF128:这个比较麻烦,好像是说PF 文件damage(被破坏)。似乎只能恢复PF 文件,或者是重新编译。
Decimal Error:通常是给数值型变量赋值时,超长溢出
Attempt to write a duplicate record to file:试图向文件中写入重复键值
Unit 8. Accessing the DB2 Database Using RPG IV
物理文件和逻辑文件的DDS格式: 列 顺序号 格式类型 注释标记 不使用 位置 1-5 6 7 8-16 注释 A或空白 * 表示本行为注释行 以下对PF有效: R:“记录格式名称” 空白字符:保存字段空白以指示“字段名称” K:“关键字段名称” Note: 物理文件只能指定一个记录格式 以下对LF有效: 空白字符:保存字段空白指示“字段名称”或为AND 的条件 R:“记录格式名称” K:“关键字段名称” J:以指示连接说明(LF) S:“选择字段名称” O:“略去字段名称” 记录格式名 字段名 键标字段名 选择/忽略字段名(LF) R表示引用前面定义过的字段属性(PF) 内容 名称类型 17 (Type of Name or Specification) 不使用 名称 18 19-28 引用 29