AS400程序使用手册(6)

2019-08-31 12:10

假设FLD01为8位长字符,且当前值为’12345678’ 而FLD02为5位长字符,且当前值为’34ABDC’

那么执行CHECK操作后,N=3,*IN42=’1’ (即第三位“A”,不存在于变量FLD01中)

CHECKR {(E)} (Check Reverse) 反向检查目标变量中的字符

1. 基本语法:

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 CHECKR FLD02:3 N 42

语句CHECKR的意思,是指字段FLD02中,从第三位字符开始,向左查找(含第三位字符),是否包含有FLD01中没有的字符。(基本与CHECK类似,所不同的,就是CHECK是自左向右的查找;而CHECKR是自右向左查找)

如果有,将字符所在位置赋值到变量N中,同时打开EQ指示器;

如果从第二位字开始,向左读取的所有字符,都可以在变量FLD01中找到,那么N为0,EQ指示器处于关闭状态。

“FLD02:3”表示从变量FLD02的第三位开始,向左作比较。如果仅仅只是“FLD02”,那么就表示从变量FLD02的末位开始,向左查找

2. 实例

假设FLD01为8位长字符,且当前值为’12345678’ 而FLD02为5位长字符,且当前值为’23A56’

那么执行上述CHECK操作后,N=0, *IN42=’0’(从第三位开始,向左,23都存在于变量FLD01中)

假设FLD01为8位长字符,且当前值为’12345678’ 而FLD02为5位长字符,且当前值为’BC3B45’

那么执行CHECK操作后,N=2,*IN42=’1’ (即第二位“C”,不存在于变量FLD01中)

3. 计算字符实际长段

根据CHECKR的这个操作码的用法,我们可以使用它来取出变量截去尾部空格后的实际长度:

Factory 1 Operation Factory 2 Result HI LO EQ

‘ ‘ CHECKR FLD02 N 42 Factory 1项,是一个空格字符。

N表示的意思是:从变量FLD02的尾部,向前数第一个非空格字符,在FLD02中所处的位置。那么这个N当然就是变量FLD02的实际长度;

如果指示器未打开,那么说明整行都是空,实际长度为0,也没错。 有趣吧。

CLEAR (Clear) 清除内容

1. 基本语法

Factory 1 Operation Factory 2 Result

CLEAR 目标名 这个目标名,可以是程序中定义的结构、文件的记录格式名。

所谓文件的记录格式名,包括了程序中声明的磁盘文件、打印报表文件、屏幕文件 CLEAR操作的意思,就是将目标所对应的所有变量/字段都赋上空值。 2. 对结构体的清空

关于结构体,后面会另设章节专门讲述,这里只说明对结构体初始化清空 Factory 1 Operation Factory 2 Result

CLEAR *ALL 目标名 CLOSE {(E)} (Close Files) 关闭文件

1. 基本语法

Factory 1 Operation Factory 2 Result

CLOSE 目标文件名

2. CLOSE所对应的,是文件名,不是文件的记录格式名,要注意

3. CLOSE操作码,仅适用于声明文件时,keyword使用“USROPN”关键字的文件 4. 每一个CLOSE的操作,在之前都必须有OPEN文件的操作。也就是,文件必须打

开了之后,才能关闭。不能关闭未打开的文件

5. 允许使用*ALL变量,来表达关闭所有已打开的文件:

CLOSE *ALL

COMMIT {(E)} (Commit) 日志事务处理的确认操作

1. 基本语法

Factory 1 Operation Factory 2 Result

COMMIT

2. 该操作码无其它参数,就是指对事务处理进行确认操作。

3. ILE程序中,COMMIT操作可随时进行,也允许在没有声明COMMIT类型的文件

的情况下,仍进行COMMIT操作(对该进程这前的事务进行确认处理)f 4. 关于日志的确认操作,在后面会另设专门章节讲述。 COMP (Compare) 比较

1. 基本语法:

将Factory 1与Factory 2进行比较。

当Factory 1 > Factory 2 时,打开HI指示器; 当Factory 1 = Factory 2 时,打开LO指示器; 当Factory 1 < Factory 2 时,打开EQ指示器。 Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 COMP FLD02 56 57 58 当FLD01=2,FLD02=1时,*IN56=’1’, *IN57=’0’, *IN58=’0’ 当FLD01=2,FLD02=2时,*IN56=’0’, *IN57=’0’, *IN58=’1’ 当FLD01=1,FLD02=2时,*IN56=’0’, *IN57=’1’, *IN58=’0’

字符也可以进行比较,好象是按字母排序,然后将内码相加,再比较(类似于ASCII码一样,不过不是特别清楚这个规律,所以一般没用)

坦白说,我觉得这个操作码有点无聊。

2.8.4.2 D--E

DEALLOC {(E | N)} (De-allocate Storage)

没用过,好象是对定义的指针型变量,对其分配地址空间之后,用这个操作码可以回收空间。

DEFINE (Field Definition) 根据已知的字段,来定义新字段,如下:

Factory 1 Operation Factory 2 Result HI LO EQ

*LIKE DEFINE FLD01 FLD02 这句话的意思,就是说“象定义字段FLD01一样,定义字段FLD02的类型、长度” 这个字段FLD01,必须是个已定义的字段/变量。 DELETE {(E)} (Delete Record) 删除当前记录,语法如下:

Factory 1 Operation Factory 2 Result HI LO EQ

DELETE 文件记录格式名 这里,在做DELETE操作前,必须先定位到具体的记录上(使用CHAIN、READ等语句);同时,文件在F行必须使用修改的方式来声明。 当文件定位到目标记录时,目标记录会被锁定,此时,目标记录无法被其它程序修改;如果执行了DELETE操作,自然会解锁,不过别的程序也找不到目标记录了(因为被删除)

实际使用中,通常并不会对文件中的记录进行物理删除,而是修改某个标识状态的字段的值,所以使用这条命令要慎重。 DIV {(H)} (Divide) 数学运算—除

DIV操作码,表示数学运算的“除”,常与操作码MVR一起来使用。

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 DIV FLD02 N MVR M 上面两句话的意思,是说,用FLD01来除FLD02,将商赋值到变量N中,将余数,赋值到变量M中。(N,M都是数字型变量) 再具体一点,如果FLD01 = 10, FLD02 = 3,执行完这两句操作码之后 N = 3 (10 / 3的商) M = 1 (10 / 3的余数) DO (Do) 循环 我最常用的循环方法之一,适用于已知循环次数的循环,与ENDDO搭配使用,每一个DO,必须要配合一个ENDDO。基本语法如下

Factory 1 Operation Factory 2 Result HI LO EQ

1 DO 10 循环中处理的内容 ENDDO 上面的意思,就是说固定循环10次。 不过呢,在实际使用中,我们常常需要知道当前循环到了第几次处理,这里,可以:

Factory 1 Operation Factory 2 Result HI LO EQ

1 DO 10 N 处理过程 ENDDO

这个N,是一个整数型变量(小数位为0的P型吧),它所表示的就是循环的次数。如第一次循环,N=1;第二次循环,N=2

所以, 1 DO 1,就表示只循环一次,而不是表示死循环。 DOU {(M | R)} (Do Until) 还是循环 也是循环,不过当满足Extend Factory 2项的条件之后,结束循环。如下:

Factory 1 Operation Factory 2 Result HI LO EQ

DOU FLD01>FLD02 处理过程 ENDDO 上面这句话,就是说当FLD01小于或等于FLD02时,进行循环;当满足条件,即FLD01大于FLD02时,结束循环。 在RPGLE的写法中,这个条件可以写得很复杂。当然,很复杂的时候,要记得多用括号,以免得逻辑判断与设计不一致。

DOUxx (Do Until) 又是循环 这应该是RPG的写法,上面的循环也可以写做:

FLD01 DOUGT FLD02 ENDDO

不过,正如果前面所说的“ANDxx”操作码一样,RPGLE的表示手法可以比RPG更直观,更好维护,所以这里也是一样的原理,有了“DOU”之后,我们就可以不用“DOUxx”了。

DOW {(M | R)} (Do While) 循环,又见循环 这个循环的意思,与DOU正好相反,它的意思是满足Extend Fatcory 2项的条件时,才进行循环,不满足条件时,不循环

Factory 1 Operation Factory 2 Result HI LO EQ

DOW FLD01>FLD02 处理过程 ENDDO 上面这句话,就是说当FLD01小于或等于FLD02时,不进行循环循环;当满足条件,即FLD01大于FLD02时,才进行循环。 在RPGLE的写法中,这个条件可以写得很复杂。当然,很复杂的时候,要记得多用括号,以免得逻辑判断与设计不一致。 注意:在实际使用过程中,我常常只使用DO,DOW这两种循环。而且使用DOW时,常常使其条件永远成立(即死循环,比如说1=1就永远成立,那么 DOW 1=1就是个死循环),然后在循环体中用IF语句判断何时退出循环(使用LEAVE语句),我认为这样会比较直观,而且很少会在逻辑上出错。还是那句话,我宁愿多写几行代码,而免去每次读到这里的时候都要想想逻辑上有没有问题的麻烦。 DOWxx (Do While) 最后一个循环了 跟 DOU与DOUxx的关系一样,有了DOW之后,就不需要DOWxx了,不多说了。 DSPLY {(E)} (Display Function) 屏幕显示

Factory 1 Operation Factory 2 Result HI LO EQ

FLD01 DSPLY 就是在屏幕上,显示FLD01的内容。FLD01可以是字符、数字型变量。也可以直接就是字符、数字。

DUMP (Program Dump)

没用过

ELSE (Else) 逻辑判断语句 常见用法:

Factory 1 Operation Factory 2 Result HI LO EQ IF 条件判断 处理内容一 ELSE 处理内容二 ENDIF

不满足条件判断的时候,就执行ELSE与ENDIF之间的处理内容二; 满足条件判断时,执行IF与ELSE之间的处理内容一。 IF与它最临近的ELSE、ENDIF配对;

同理,ELSE也是与它最临近的IF、ENDIF配对。

注意多层IF嵌套时的逻辑判断,这个要自己多尝试,不讲了。 ELSEIF {(M | R)} (Else/If) 逻辑判断语句 与ELSE类似,不过将条件判断语句也写在了同一行。 ELSEIF不需要相应的ENDIF语句。即 IF 条件判断1 处理内容一 ELSEIF 条件判断2 处理内容二 ELSE 处理内容三 ENDIF 当程序满足条件判断1,将执行IF与ELSEIF之间的处理内容一; 当程序不满足条件判断1,满足条件判断2,执行ELSEIF与ELSE之间的处理内容二; 当程序连条件判断2的内容都不满足时,执行ELSE与ENDIF之间的内容处理内容三。 也就是说,这时的ELSE,是和ELSEIF进行配对的,要注意。 ENDyy (End a Structured Group) ENDIF 对应 IF、IFxx ENDSR 对应 BEGSR ENDDO 对应 DO、DOW、DOU、DOUxx、DOWxx ENDSC 对应 CASxx ENDSL 对应 SELECT ENDFOR对应 FOR

ENDSR (End of Subroutine) 子过程结束语句 EVAL {(H | M | R)} (Evaluation) 赋值语句

1. 基本语法:

Factory 1 Operation Factory 2 Result HI LO EQ EVAL FLD01=FLD02

赋值,使用FLD01的值,等于FLD02的值。FLD01与FLD02的类型必须相同(即同为字符型,或同为数字型,但长度可以不同。

2. 当FLD01、FLD02同为字符型时,EVAL语句其实等价于:

EVAL FLD01=*BLANKS


AS400程序使用手册(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:L1-U811.1客开培训文档--UAP

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

马上注册会员

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