假设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