RPG AS400程序员培训手册6

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5 CL、CMD

其实有关这一章,以及屏幕文件的,在网上已经有很多人写过了,想了想,还是说一下吧。

5.1 CL 程序

5.1.1 基本认识

简单的理解,CL 程序就是和RPG 相对应的,是控制语言(Control Language)。类型为CLP、CLLE 的源代码编译出来的程序,都属于CL 程序。

可能还是不够直观,这么说吧,我们在交互式命令行上输入的命令,用程序的方式来执

行,这个执行的程序,就是CL 程序。

学过UNIX 的会比较好懂,CL 程序有点类似于SHELL,不过SHELL 是可以直接执行的,而且不用编译;CL 程序需要编译,而且要用CALL 的方式来执行。不过原理是接近的,都是在程序中直接调用命令行的语句。

所以说,CL 程序其实很好写,只要会输入命令,就可以写CL 程序了。在编辑CL 程

序时,也可以用“命令+ F4”的方式来写,不需要老老实实的整行输入。

CL 程序不像RPGLE 程序,在编写时,可以使用自由格式书写;一行的内容如果太长

要,在最末尾处用“+”表示换行

举个最简单的例子,比如说新建个名为FHS01CL 的CLP 源程序,代码如下:

PGM

WRKACTJOB

ENDPGM

编译此程序,然后CALL 之,系统就会执行命令WRKACTJOB,查看当前的活动作业,

效果与在交互式命令行下输入WRKACTJOB 是一样的。

当我们输入F12,退出WRKACTJOB 时,系统就会继续向下执行,发现是ENDPGM,

表示程序结束了,于是判定执行完毕,退出至交互式画面。

5.1.2 CL 程序的常用语法及命令:

一、程序的开始与结束:

PGM PARM(&A &B) /* 开始CL 程序*/

ENDPGM /* 结束CL 程序*/

CL 程序,和RPGLE 程序一样,也可以有程序的入口参数,而且程序的入口参数

都是可传递的(也就是输入的参数如果在程序中被修改过,那么原调用的程序中的相应参数也会进行变化。不过CL 的入口参数只能为字符型,或数字型的单个字段,不能象RPGLE 程序中那么多样化(字段、结构、数组、指针)。

如果CL 程序没有入口参数时,那么就可以不需要后面的PARM 语句,直接写成

PGM

即可。

写CL 程序时,不妨多使用F4,看看系统的帮助,这样就不用记那么多命令的参

数名。

二、变量及其定义

CL程序中的所有变量,都使用&做为前缀,这一点与RPGLE 程序不同。比如说

PGM PARM(&A &B)

就表示入口参数为A、B 这两个变量

在CL 程序中使用到的变量,都必须使用DCL 语句来定义:

DCL VAR(&FLD01) TYPE(*CHAR) LEN(10)

DCL VAR(&FLD02) TYPE(*DEC) LEN(10 2)

上述语句表示:

定义变量FLD01,10 位长的字符型变量

定义变量FLD02,10 长,其中2 位小数的数字型变量

除了字符、数字之外,CL 程序还可以定义逻辑变量(*LGL),逻辑变量允许的值只

能为’1’或’0’。不过通常有字符与数字也就够了。CL 程序的主要功能在于进行命令处理,

而不是处理字符串以及数据库

三、CL 常用命令:

CHGVAR -- 变量赋值

CHGVAR VAR(&FLD01) VALUE(‘ABCD’)

即是将变量FLD01 赋值成为’ABCD’(左对齐),同理,VALUE 的括号中也可以填写一个变量,即表示将此变量的值赋值到变量FLD01 中。

数字型变量的赋值同样也是使用CHGVAR 语句。

当变量中只包含数字时(0—9),数字型变量与字符型变量可以使用CHGVAR 语句进行转换,这一点与RPGLE 中的MOVE 语句比较类似。

IF -- 条件判断语句

IF COND(&FLD01 *EQ '1') THEN(CHGVAR VAR(&FLD02) +

VALUE('0'))

当变量FLD01 等于’1’时,将变量FLD02 中的值更改为’0’

THEN 后面,即是当符合条件时,要执行的命令。写起来其实没有看上去那么复杂,多用F4 就会发现CL 程序写简单。

就比如上例,先写IF,然后按F4,在Condition 处填写条件语句,然后在Command 处填上CHGVAR,再按F4,再去填相应的处理语句,这样写,就比直接把整句抄下来就简单多了。

上面这种写法,只能在符合条件时,执行一条CL 语句;如果要执行多条,就

必须写做:

IF COND(&FLD01 *EQ '1') THEN(DO)

CHGVAR VAR(&FLD02) VALUE(‘0’)

其它执行语句

ENDDO

也就是THEN 后面,用DO,表示接下来的语句都是在这个IF 条件成立时才

执行(DO)的。

然后结束处用ENDDO,必须要有。ENDDO 在这里和循环没有任何关系,表

示的是ENDIF 的意思,但是CL 语句里没有ENDIF,只有ENDDO。

IF 语句中,表示判断的关键字与RPGLE 中的Ifxx 操作码类似,有

*EQ *GT *LT *GE *LE *NE

用来表示逻辑关系的关键字有

*AND, *OR, *NOT

GOTO -- 跳转语句

GOTO 语句与RPGLE 中的GOTO 是一样的,都是跳转的意思。

FHSTAG:

GOTO CMDLBL(FHSTAG)

注意,这里定义标签是用“:” 冒号

MONMSG -- 监控错误信息

我们使用CL 语句时,执行的命令可能会报出一些异常错误,从而导致整个程

序中断,需要手工干预。MONMSG 命令可以监控我们预定的错误信息,使CL 程序正常的向下运行。举例而言,如果CL 程序中有如下语句:

CALL PGM(FHS01R)

MONMSG MSGID(CPF4131)

则表示当系统调用程序FHS01R 时,如果发现有CPF4131(声明的文件重新编

译过,但程序未重新编译)的错,那么CL 程序将不会异常中断,仅仅只是不运行程序FHS01R,然后继续向下执行CL 程序

MONMSG 还可以用于在监控到错误信息之后,进行处理,如下:

CALL PGM(FHS01R)

相关文档
最新文档