IBM_AS400_RPG学习手册
更新时间:2024-05-09 00:14:01 阅读量: 综合文库 文档下载
- as400 rpg推荐度:
- 相关推荐
1 2
简单说明................................................................................................................... 3 程序代码行的编写..................................................................................................... 3 2.1 最简单的RPGLE程序 ................................................................................. 3 2.2 2.3 2.4 2.5
举例准备..................................................................................................... 3 简单的程序流程 .......................................................................................... 4 常见的程序流程 .......................................................................................... 5 F行说明 ..................................................................................................... 5 2.5.1 2.5.2 2.5.3 2.6
内容说明.............................................................................................. 5 常用例子.............................................................................................. 9 补充说明............................................................................................ 10
D行说明................................................................................................... 10 2.6.1 内容说明............................................................................................ 10 2.6.2 2.6.3
常用例子............................................................................................ 13 补充说明............................................................................................ 14
2.7 2.8
入口参数................................................................................................... 14 C行说明 ................................................................................................... 16 2.8.1 写在前面............................................................................................ 16 2.8.2 2.8.3 2.8.4
内容说明............................................................................................ 17 ILE操作码分类: .............................................................................. 18 ILE操作码 ......................................................................................... 19
2.8.4.1 A--C ............................................................................................ 19 2.8.4.2 D--E ............................................................................................ 27 2.8.4.3 F--N............................................................................................. 32
2.8.4.4 O--R ............................................................................................ 39 2.8.4.5 S--Z ............................................................................................. 43
和程序相关的数据库知识 ........................................................................................ 49 3.1 LF(逻辑文件)........................................................................................ 49
3.1.1 逻辑文件概念..................................................................................... 49
3.1.2 3.1.3 3.2 3.3
有关编译的问题 ..................................................... 错误!未定义书签。 逻辑文件对效率的影响....................................................................... 51
3
MEMBER ................................................................................................. 51 游标.......................................................................................................... 52 3.3.1 3.3.2 3.3.3
游标的概念 ........................................................................................ 52 不同操作码对应的游标的处理 ............................................................ 52 “有且仅有”的游标 .......................................................................... 53
3.3.4 LOVAL、HIVAL对应的游标操作 ....................................................... 53 3.4 事务处理 -- COMMIT ............................................................................... 54
3.4.1
3.4.2
概念描述............................................................................................ 54 使用方法............................................................................................ 54
4
3.4.3 注意事项............................................................................................ 55 3.5 关于锁表的问题 LCKW ............................................................................ 56 DEBUG调试以及常见出错信息............................................................................... 56
4.1 4.2
写在前面................................................................................................... 56 常规用法................................................................................................... 57 4.2.1 程序编译............................................................................................ 57 4.2.2 执行DEBUG命令 .............................................................................. 57 4.2.3 运行程序............................................................................................ 57 4.2.4 4.2.5 4.2.6 4.2.7
在DEBUG模式中进行调试 ................................................................ 58 跟踪被当前程序调用的程序................................................................ 58 一定要退出DEBUG模式 ................................................................... 59 补充................................................................................................... 59
4.3 4.4
跟踪批处理程序( From qingzhou) ............................................................... 60 常见的出错信息 ........................................................................................ 60 4.4.1
编译程序时的出错信息....................................................................... 60
5
4.4.2 运行时的出错信息.............................................................................. 62 CL、CMD............................................................................................................... 62 5.1
CL程序 .................................................................................................... 62 5.1.1 基本认识............................................................................................ 62 5.1.2 5.1.3
CL程序的常用语法及命令: .............................................................. 63 不常用的语法..................................................................................... 65
6 7
5.2 CMD......................................................................................................... 66 屏幕文件及使用 ...................................................................................................... 67 其它........................................................................................................................ 67 7.1 7.2 7.3 7.4 7.5
报表打印................................................................................................... 72 SAVF,备份与恢复 ................................................................................... 77 菜单--MENU ............................................................................................. 78 开发时常用的命令..................................................................................... 78 一点想法................................................................................................... 81
1 简单说明
内部交流、或可作培训使用。对用户作如下假定: 1、 能COPY、修改、编译源代码(RPGLE、CLP),并能运行编译后的程序 2、 能COPY、修改、编译文件(PF、LF、PRTF、DSPF);
3、 对数据文件(PF)有简单的认识(FIELD ? RECORD ? PF),并知道LF与PF的
对应关系。
2 程序代码行的编写
2.1 最简单的RPGLE程序
为便于理解,这里写一个最简单的RPGLE程序
CL0N01Factor1+++++++Opcode&ExtFactor2+++++++Result++++++++Len++D+HiLoEq *************** Beginning of data ************************************* 0001.00 C 'HELLO WORLD' DSPLY 0002.00 C RETURN
****************** End of data ****************************************
这个程序编译成功,并调用(CALL 程序名),就是在屏幕上反白显示“HELLO WORLD”字样。(其中,绿色字样,是系统自动显示的,下同)
与自由风格的C语言不同,RPGLE中的编码,是有一定的格式,如果写错,将会在当前代码行上高亮反绿显示。初学者如果不太清楚从何处开始下手,可以使用“F4”键查看(F4键只有用2进入的编辑状态才有效,用5进入的查看状态是无效的)
Level N01 Factor 1 Operation Factor 2 Result 'HELLO WORLD' DSPLY Decimal Length Positions HI LO EQ Comment 关于每一项所对应的内容代表什么意思,该如何填写,即如何写程序,将会在下面的具体讲解。
2.2 举例准备
列出表名,字段,以方便下面的举例。
假设有PF文件叫PFFHS,文件的记录格式叫FMTFHS
每条记录,都是由FHS01、FHS02、FHS03三个字段组成,每个字段都是两位长的字符
型变量。
逻辑文件PFFHSL1的键值为FHS01 逻辑文件PFFHSL2的键值为FHS02
逻辑文件PFFHSL3的键值为FHS01、FHS02
注:
文件的记录格式,可以理解为给这个文件整条记录起的一个名字;或者是说将每条记录视都视做一个类型相同大变量,然后给这个大变量起的名字。所以文件的记录格式信息中,包含有一条记录由多少个字段组成,总计长度是多少这样的信息。
文件的记录格式,与各个字段同时定义。(写文件的源码时) 文件的记录格式在RPGLE的程序中,不能与文件名相同。
2.3 简单的程序流程
为方便起见,系统自动显示的就不再贴出来了,只贴代码段。
FPFFHS UF E DISK C READ FMTFHS C C
C
EVAL
FHS01=”01” FMTFHS
LR
UPDATE SETON
C RETURN
这个程序的意思,是说读PFFHS这个文件,然后将读到的第一条记录中的FHS01这个字段的值修改为“01”。 “SETON LR”,LR的位置可在HI、LO、EQ中任选一处。意思是指将打开指示器*INLR,即赋值使指示器*INLR的值等于1。等价于 “ EVAL *INLR=’1’ ”,意思是强制将内存中的数据写到磁盘中。(基于效率因素,系统在修改文件时,会先将修改的结果先放在内存中,在同一程序中,读取数据也是先从内存中查询。)LR,取自是Last Record
RETURN,表示程序结束,在后面“操作码”一节中,会有讲述。
如果不太明白,就记住 C C 或
C
SETON RETURN EVAL
LR
*INLR=’1’
C RETURN
这两句话加在一起,表示程序结束就可以了。
从这个程序中,我们可以看到,RPGLE的程序,大致上可以分为两个部分:
1、 声明、定义部分:声明程序中使用到的文件(F行),定义程序中使用的变量(D行) 2、 程序运行部分 :即C行,也就是程序段。
在RPGLE程序中,F行必须在D行前面,D行必须在C行前面。
程序执行的起始顺序,将从定义部分之后,第一个C行开始,顺序向下执行。
程序中的F行、D行都不是必须项,一个程序可以没有F行(如仅完成计算功能的公共函数,比如计算利息),也可以没有D行(没有需要特别定义的变量,或者所有变量都在C行进行定义),但不应该没有C行,因为F行与D行都属于非执行行,是起定义作用;C行是执行行。没有C行的程序,是无执行意义的。
2.4 常见的程序流程
FPFFHS UF E DISK D LSFLD01 C
C C C
C C C C C C C
S
2
EVAL EXSR EVAL EXSR
LSFLD01=’01’ SUB#UPD LSFLD02=’02’ SUB#UPD
FMTFHS
//声明文件PFFHS //定义临时变量LSFLD01 //给变量LSFLD01赋值 //执行子过程SUB#UPD //给变量LSFLD02赋值 //执行子过程SUB#UPD LR
//数据写入磁盘
//程序结束 //子过程SUB#UPD开始 //读PFFHS文件 //给字段FLD01赋值 //修改文件 //子过程结束
SETON RETURN BEGSR READ EVAL UPDATE ENDSR
SUB#UPD
FLD01=LSFLD01 FMTFHS
“//”后面的,只是简单的解释,如果自已动手写,不需要输入这些内容。 系统在运行这个程序时,是按如下的顺序来执行: 1. 首句EVAL赋值语句,直接执行;
2. 当系统发现操作码“EXSR”时,根据后面的变量名“SUB#UPD”,去查找对应的
“SUB#UPD BEGSR”语句; 3. 然后从“SUB#UPD BEGSR”之后,顺序向下执行,直至“ENDSR”语句 4. 执行到“ENDSR”之后,将会再回到当初的“EXSR SUB#UPD”处,继续向下
执行,直到RETURN语句为止
这里提出一点要注意,如果子过程中,又执行了自身,即在SUB#UPD程序中,又出现了“EXSR SUB#UPD”,是可以编译通过的,但在执行过程中,系统会因为无法定位,而出现死循环,直至报错异常中断退出。也就是RPGLE的程序中,子过程不允许出现递归。
2.5 F行说明 2.5.1
内容说明
首位填上F,然后按F4,会出现如下内容:
MOVEL FLD02 FLD01 即先清空FLD01(当FLD01长度长于FLD02,且有初始值时,这个操作就有意义了),然后再将FLD02左对齐赋值到FLD01中。所谓左对齐的含义,就是说将FLD02至左向右(含空字符),依次向FLD01字段中赋值。当FLD02长度大于FLD01时,右边的字符在赋值时将会被截去。
3. 当FLD01、FLD02同为数字型时,且FLD02的值,超过FLD01的长度时,EVAL
语句会直接报错,程序异常中断; 4. 当FLD01、FLD02同为字符型时,且FLD01的长度大于FLD02时,将会将FLD02
的值左对齐赋值到FLD01中,并且将后面内容全部清空。
比如FLD01=’12345678’(8位字符型),FLD02=’54321’(5位字符型) 执行了 EVAL
FLD01=FLD02
之后,FLD01=’54321 ‘
5. 当FLD01、FLD02同为字符型,且FLD01的长度小于FLD02时,会将FLD02的内容左对齐,再赋值到FLD02中。 6. 字符的拼接:
Factory 1 Operation Factory 2 Result HI LO EQ EVAL FLD01=FLD02+FLD03+’AAA’+’BB’+FLD04
FLD01、FLD02、FLD03、FLD04都必须是字符。FLD02、FLD03如果字符未满,有空格,EVAL操作码不会将空格去掉。如果太长,可以分多行写,“+ ”在上在下都可。即
EVAL
FLD01 = FLD02 +
FLD03
等价于
FLD01 = FLD02 + FLD03
Factory 2 Result HI LO EQ
FLD01 =(((LD02+FLD03)* FLD04) / 2) - FLD05
EVAL 7. 数学运算:
Factory 1
Operation
EVAL
加、减、乘、除都在了。注意多用括号。
如果运算公式太长,一行写不完,也可以分行写,运算符在上行、下行都可以。 8. 四舍五入:
对于数字运算,EVAL(H),是四舍五入的运算,如。
EVAL(H) FLD01 = FLD02 / FLD03 而EVAL,仅仅只是四舍,没有五入。
EVAL {(M | R)} (Evaluation Right Adjust) 不知道 EXCEPT (Calculation Time Output) 不知道 没用过
EXFMT {(E)} (Write/Then Read Format) 显示屏幕文件并等待输入 这个操作码的意思,是显示屏幕,并等待输入,语法为:
Factory 1 Operation Factory 2 Result HI LO EQ EXFMT 记录格式名 当程序执行到这一句时,表示显示“记录格式名”所对应的子文件(由DSPF定义,显示在屏幕上),同时等待用户进行输入操作。 当用户输入预定义的热键(F3,F4等等)、或执行输入操作后(按下输入键),程序才会继续向下执行。
EXSR (Invoke Subroutine) 执行子过程
Result
HI LO EQ
Factory 1 Operation Factory 2 EXSR 子过程名 子过程名必须存在。没有特别的
EXTRCT {(E)}(Extract Date/Time) 取日期、时间型变量中的具体内容 首先,必须要有一个日期或时间型变量,这个可以在D行定义,然后使用该变量中有值,比如
D FLD01 D FLD02 C
S S
D T
FLD01
MOVE *DATE
C TIME FLD02
这样,就有了一个日期型变量FLD01,一个时间型变量FLD02,且两个变量中都有值。
HI LO EQ
再假设变量FLDYEAR为四位字符型、FLDHOUR为两位数字型
Factory 1 Operation Factory 2 Result
EXTRCT FLD01:*Y FLDYEAR EXTRCT FLD02:*H FLDHOUR
这时,FLDYEAR表示当前的年份;FLDHOUR表示当前的小时
所以说,EXTRCT操作码对应的目标变量,可以是字符型,也可以是数字型,但长度一定要与预期的目标长度相等(比如年份可以是字符,也可以是数字,但长度必须为4位;月份必须为2位,依此类推)
而冒号后面所跟的参数,与ADDDUR操作码一样,如下:
对应于日期型变量: *D表示天,也可用*DAYS *M表示月,也可用*MONTHS *Y表示年,也可用*YEARS 对应于时间型变量
*H 表示小时,也可用*HOURS
*MN表示分钟,也可用*MINUTES *S 表示秒, 也可用*SECONDS
2.8.4.3 F--N
FEOD {(E)} (Force End of Data) 没用过
FOR (For) 又是循环 FOR操作码,也是一种指定次数的循环,与“DO”循环有异曲同工之妙。
Factory 1 Operation
FOR 处理语句 ENDFOR
Factory 2 10
Result N
HI LO EQ
Factory 2
Result
HI LO EQ
N=1 TO 10
等价于
1
Factory 1 Operation
DO
处理语句
ENDDO
都是循环10次,并且将当前循环次数赋值到数字型变量N中 FORCE (Force a Certain File to Be Read Next Cycle) 没用过
GOTO (Go To) 跳转语句 GOTO,跳转语句。跳转到指定的标签处,需要用“TAG”语句来定义,如: Factory 1 Operation Factory 2 处理语句1
IF
条件判断
Result
HI LO EQ
GOTO FHSTAG ENDIF 处理语句2 FHSTAG TAG 在这里,执行完处理语句1时,如果“条件判断”成立,将会直接跳至“FHSTAG TAG”处,不执行处理语句2。
主过程不能跳转至子过程;(主过程我用来表示是与子过程相对应的词,指C行顺序第一行,至程序结束语句之间的语句) 子过程不能跳转至其它子过程,只能在本子过程内部跳转,或跳转到主过程;
技术可以使用跳转语句来实现循环,不过不建议。 IF {(M | R)} (If) 条件判断 条件判断语句,必须与ENDIF一起使用 Factory 1
Operation
IF 处理语句
Factory 2 Result HI LO EQ ((FLD01=FLD02) OR (FLD01>FLD03)) AND (FLD03=FLD04)
ENDIF 当条件判断成立时,才会执行下面的处理语句。 条件判断可以使用括号,OR,AND,来表达复杂的逻辑关系 IF 必须有对应的ENDIF,所以建议写程序时,写无IF就加个ENDIF,然后再来写中间的处理语句,以免遗漏。
IF语句,还可以这种用法: IF *IN(20) ENDIF 这时,等价于
IF
*IN20=’1’
ENDIF
不过,暂时没看出这种写法有什么实用性。
IFxx (If) 条件判断 与ANDxx类似,这是RPG的语法,一行代码只能表示一个条件,如
Factory 1 FLD01 FLD01
Operation IFEQ ORGT
Factory 2 FLD02 FLD03
Result
HI LO EQ
处理语句
ENDIF 与AND和ANDxx类似,由于IF语句在表达复杂的逻辑关系时更直观,所以通常我只使用IF,而不是IFxx了。
IN {(E)} (Retrieve a Data Area) 对数据区?的操作 没用过,看书上的意思,是对数据区?的操作。数据区有什么具体优势,实用性如何,是否可被普通的程序替代,都希望有人来补充。 ITER (Iterate) 循环中,不处理此语句之后的语句 怎么解释都费劲,直接举例吧:
Factory 1 1
Operation
Factory 2
Result N
HI LO EQ
DO 10 处理语句1 IF ITER
条件判断
ENDIF 处理语句2 ENDDO Operation DO
Factory 2 10
Result N
HI LO EQ
等价于
1
Factory 1
ITERTAG
TAG
处理语句1 IF 条件判断 GOTO ITERTAG ENDIF 处理语句2
ENDDO 不知道这个例子能不能让人明白,都是在说当条件判断成立时,就不执行处理语句2,直接从循环头开始处理。
ITER语句执行后,程序相当于跳转至循环体中的第一句,重新向下运行(即执行循环)。
当有多层循环嵌套时,ITER仅作用于最里层的循环。
当循环中执行了子过程时,子过程中不能对该循环进行ITER操作。也就是说:DO,ENDO,ITER这些语句必须在一块(即要么都在主过程中,要么都在同一个子过程中) KFLD (Define Parts of a Key) 定义组合键值中的字段 这个其实应该与KLIST一起来讲,因为这两个操作是在一起使用的。 一个PF对应的逻辑文件LF,可能会有多个KEY值,那么,我们要根据多个KEY值对于该逻辑文件进行查询定位操作时,就需要使用KLIST、KFLD这两个操作码:
Factory 1 FHSKEY
Operation KLIST KFLD KFLD
Factory 2
Result
HI LO EQ
//定义组合键值FHSKEY
FLD01 //组合键的首个字段为FLD01 FLD02 //组合键的第二个字段FLD02
组合键值的使用方式,就是将组合键视为一个变量,进行各种操作,如: FHSKEY 或
CHAIN
FMTFHS
FHSKEY SETLL FMTFHS 意思,就是说按组合键值,查询定位到逻辑文件PFFHSL3中去。 这里要注意,PFFHSL3的键值是FHS01、FHS02(即PF文件中的字段),而程序中的组合键值为FLD01、FLD02两个程序中定义的变量,只要类型、长度与键值FHS01、FHS02相等即可。同时,对文件进行查询定位操作后,在没有对FLD01、FLD02赋值之前,这两个字段的值是不会发生变化的(即不会更改组合键的键值); 但是,组合键中的字段,也可以直接定义为PF文件中的字段,如
Factory 1 FHSKEY
Operation KLIST KFLD
Factory 2
Result
HI LO EQ
FHS01
KFLD FHS02
此时,可以将PF文件中的字段FHS01、FHS02先视为两个普通的变量,进行赋值,然
后用组合键FHSKEY对PFFHSL3进行查询定位;当执行完CHAIN,或READ语句后,因为读取到了文件中的数据,所以FHS01、FHS02的值将发生变化,也即是组合键FHSKEY的键值发生了变化。 基于此,所以通常我不会将组合键的字段设置为查询文件中的字段,而是定义为几个独立的临时字段,以免需要过于频繁的考虑键值的更改。 KLIST (Define a Composite Key) 以上面的KFLD操作码 LEAVE (Leave a Do Group) 退出当前循环 退出当前循环,语法和注意事项基本与“ITER”相同:
Factory 1 1
Operation
Factory 2
Result N
HI LO EQ
DO 10 处理语句1 IF 条件判断 LEAVE ENDIF 处理语句2 ENDDO Operation
Factory 2
Result N
HI LO EQ
等价于
1
Factory 1
DO 10 处理语句1 IF GOTO ENDIF 处理语句2 ENDDO
条件判断 LEAVETAG
LEAVE TAG
这两个例子都是在说当条件判断成立时,就不执行剩余的循环体,直接跳出循环。
LEAVE语句执行后,程序相当于跳转至ENDDO循环结束处,然后向下执行ENDDO之后的循环外的执行语句。
当有多层循环嵌套时,LEAVE仅作用于最里层的循环。
当循环中执行了子过程时,子过程中不能对该循环进行LEAVE操作。也就是说:DO,ENDO,LEAVE这些语句必须在一块(即要么都在主过程中,要么都在同一个子过程中)
正在阅读:
IBM_AS400_RPG学习手册05-09
外研版英语八年级上册Module7练习题03-08
十招教你如何处好人际关系03-11
2017届高三数学一轮复习 专题突破训练 数列 文 - 图文10-14
冬天的精灵雪作文500字06-18
第一章整式的运算测试题04-12
浅议中国的“和谐世界”外交理念12-09
职高和中专的差别 什么是职高03-30
视听说unit7-111-26
餐馆酒店众筹方案01-04