IBM_AS400_RPG学习手册(7)

2019-05-18 20:13

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学习手册(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:邮政从业资格考试试卷2014

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: