2023年RPGAS400程序员培训手册.doc
《2023年RPGAS400程序员培训手册.doc》由会员分享,可在线阅读,更多相关《2023年RPGAS400程序员培训手册.doc(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、2.8.4.4 O-R ON-ERROR (On-Error) 没用过 OPEN (E) (Open File for Processing) 打开文献 Factory 1 Operation Factory 2 Result HI LO EQ OPEN 文献名 OPEN 后面的目的,必须是在当前程序中已声明的文献名(不是文献的记录格式名), 并且在OPEN 操作之后,在程序结束之前之前,必须有相应的CLOSE 操作。 使用OPEN 操作,文献在声明时,必须使用USROPN 关键字(详见D 行说明)。 ORxx (Or) 逻辑判断或 Factory 1 Operation Factory 2
2、Result HI LO EQ FLD01 IFGT FLD03 FLD01 OREQ FLD02 等价于 IF FLD01FLD03 OR FLD01=FLD02 与IF、IFxx,AND、ANDxx 类似,RPGLE 的写法OR,比RPG 的写法ORxx 要灵活, 并且可以用来表达一些复杂的逻辑关系。有鉴于此,所以通常IF 语句中,我会以OR 为主, 基本不用ORxx。假如在编程序方面,公司/项目组无硬性规定,那我觉得还是少用ORxx 吧, 总觉得这种写法的逻辑关系看起来不直接,特别是有很复杂的AND,OR 时。 OTHER (Otherwise Select) 分支语句的判断 与分支语句
3、SELECT 一起使用,表达不符合上述所有条件时的操作,如下: Factory 1 Operation Factory 2 Result HI LO EQ SELECT WHEN 条件判断1 解决语句1 WHEN 条件判断2 解决语句2 OTHER 解决语句3 ENDSL 在这个例子中,当满足条件判断1 时,运营解决语句1,运营结束后跳至ENDSL 处; 假如不满足条件判断1,则程序继续向下执行,判断是否满足条件判断2。 当满足条件判断2 时,运营解决语句2,跳至ENDSL;当不满足 当不满足条件判断2 时,程序继续向下执下,当读到OTHER 操作码时,无条件运 行解决语句3(即当程序当前不满
4、足以上所以条件判断时,则执行OTHER 之后的语句。 解决语句允许有很多句; 条件判断可以写得很复杂,也允许对不同的字段进行判断;比如说C 语言也有分支语 句switch,但是这个语句只能对一个字段进行分支判断,ILE 语言与它不同,允许对不同的 字段进行判断 就我目前掌握的测试情况,上述的SELECTWHEN-OTHERENDSL,其实也可以 写做: IF 条件判断1 解决语句1 ELSEIF 条件判断2 解决语句2 ELSE 解决语句3 ENDIF 即WHEN 与ELSEIF 是类似的,这样说,应当可以明白了吧。 总之,SELECTENDSL 是一个很好用的语法,特别是在表达很多不同的分支
5、解决时。 OUT (E) (Write a Data Area) 没用过,讲数据域的。 PARM (Identify Parameters) 定义入口参数 Factory 1 Operation Factory 2 Result HI LO EQR *ENTRY PLIST PARM FLD01 关于具体内容讲解,详见前面所说“入口参数”一章。 允许做为入口参数的有:普通变量、结构变量、数组变量 关于PARM、PLIST,尚有一种在Factory 1, Factory 2 也填写变量或指示器的用 法,但是我不知道它具体表达什么意思,也不知道该怎么用。请用过的来补充。 PLIST (Identi
6、fy a Parameter List) 同上 POST (E) (Post) 没用过 READ (N | E) (Read a Record) 读取记录 1. 基本语法: Factory 1 Operation Factory 2 Result HI LO EQ READ 文献记录格式名 45 46 READ后面跟的,必须是声明的文献记录格式名; LO 指示器表达锁表指示器,当在指定的时间(CHGPF,WAITRCD 项可看到), 需要读取的记录仍被锁,将会打开LO 指示器,即*IN45=1; EQ指示器为是否读到指示器。当未读到任何记录时,打开EQ 指示器,即*IN46=1 2. 当文献在
7、程序中,是用只读的方式声明时,READ 操作并不会导致锁表; 假如文献在程序中是用修改的方式声明,READ 操作成功后,该记录被锁;直到执 行解锁操作(UNLOCK,或UPDATE),或READ 该文献的其它记录,才会解锁 假如文献是用修改的方式声明,但希望READ 操作不锁表时,那么就用READ(N), 即 Factory 1 Operation Factory 2 Result HI LO EQ READ(N) 文献记录格式名 45 46 这样读文献,就不会锁记录,但是同时也不能修改记录。假如需要修改记录,那么 在修改之前(涉及对文献字段赋值之前),还必须再对该记录进行一次定位操作(比如
8、CHAIN、READ 语句均可)。也就是说,假如要修改记录,必须先锁住当前记录(很合 理吧) 3. 当执行READ 操作时,程序是根据游标当前在文献中所指向的位置,顺序读取下 一条记录。关于游标是如何指向,还不是一个很简朴的问题,所以将会在下一章“数 据库相关知识”中具体讲解。 4. 执行READ 操作时,允许声明的文献没有键值。(即PF 文献) READC (E) (Read Next Changed Record) 没用过,读下一次修改过的记录? READE (N | E) (Read Equal Key) 读取键值相等的记录 语法与READ 操作码大体同样,这里不再反复,只说不同的: 假
9、设程序中已声明逻辑文献PFFHSL3(键值为FHS01+FHS02) Factory 1 Operation Factory 2 Result HI LO EQ FHSKEY KLIST KFLD FLD01 KFLD FLD02 FHSKEY SETLL FMTFHS DOW 1=1 FHSKEY READE FMTFHS 15 IF *IN15=1 LEAVE ENDIF ENDDO 这段话的意思,就是定义组合键值FHSKEY,然后根据这个FHSKEY 在逻辑文献 PFFHSL3 中去定位,循环读取PFFHSL3 中,FHS01、FHS03 与FLD01、FLD02 相等的记 录。当读取记
10、录结束,或键值不等时,退出循环(*IN15 是EQ 指示器)。假如将READE 操 作码换成READ 操作码的话(当然,Factory 1 处也就不能有值),就没有“键值不等时退出 循环”这一层意思,只是读不到记录时就退出循环,但有时我们使用逻辑文献,仅仅是需要 它的排序,而不需要读不到键值相等的记录就退出循环。所以说,使用READ 操作码,还 是READE 操作码,需要根据实际的规定来决定。 以上的Factory 1 处填写值的系统解决,当READE 操作码在Factory 1 处未填写值时, 系统事实上是将当前的值与读到的上一条记录的关键字进行比较,而不是与SETLL 时的键 值做比较(读
11、第一条记录不做比较!),假如键值不等时,置EQ 指示器为1。也就是说, 假如没有与FHSKEY 键值相同的录,那么系统并不是直接找开EQ 指示器,而是会一直保 持正常地往下读,直到找到与读到的第一条记录关键字不同的记录,才会打开EQ 指示器, 所以要注意。 READP (N | E) (Read Prior Record) 读取记录游标上移 简朴来说,READ、READE 操作时,游标在数据文献中,是下移的;即读完第一条记 录,游标指向第二条记录;读完第二条记录,游标指向第三条记录,依此类推,直至最后一 条记录。但READP 则正好相反,游标是上移的,即读完第三条记录后,游标指向第二条记 录;
12、读完第二条记录后,游标指向第一条记录,直至读完第一条记录。 一般来说,用READ、READE 的概率会比READP、READPE 的概率高得多,但是在 某些情况下,使用READP 操作,又的确会很省事,这个一时间想不起例子来,大家可在编 程序时多实践。 READPE (N | E) (Read Prior Equal) 虽然我没用过,但猜想它应当就是指游标上移,按键值去读取文献。与READP 的关系, 就类似于READE 与READ 的关系。 REALLOC (E) (Re-allocate Storage) 没用过 REL (E) (Release) 没用过 RESET (E) (Reset
13、) 将数据结构赋值成为初始值。 注意是初始值,不是清空。 如定义结构: D FHSDS DS D FHS01 10 INZ(ABCD) D FHS02 5 INZ(EFGH) 那么,不管对该结构如何赋值,当执行语句: C RESET FHSDS 之后,FHS01 将会变成ABCD,FHS02 将会变成EFGH,即恢复成为初始值。 RETURN (H | M | R) (Return to Caller) RETURN 是程序结束。 在前面,“简朴的程序流程”中,我们讲过,“SETON LR” 与RETURN 这两句话一 起,做为程序的结束。这里,再具体解释一下两者之间的区别,以及关系: 假如不
14、写RETURN,只写“SETON LR”,程序执行完最后一句之后,将会再从第一 句开始执行,导致死循环。在简朴的程序流程这个例子中,程序本来只想修改读到的第一条 记录,而假如没有RETURN 的话,将会把所有的记录都修改掉,直到最后找不到可修改的 记录,然后系统报错,异常中断。(这种离奇的现象现在又测试不到了,也许是当时写错程 序了?把F 写成了P?不管它,当是我写错了,总之RETURN 是表达程序结束,没有 RETURN,主程序无可执行的语句时,它也会结束;假如RETURN 出现在主程序的中间, 那么RETURN 后面的语句将不会执行) 假如只写RETURN,不打开指示器*INLR,根据bl
15、ogliou 所说 “程序不会强制将内存 中的数据写到磁盘中。400 缺省的是BLOCK 输出,即数据记录满一个BLOCK 块时才会将 这一组记录写到磁盘上。那么假如这时BLOCK 没满,数据信息不会立刻写到磁盘上。之后 有其它作业用到该文献,读取的数据就不完整。” 但假如文献有唯一键字,或记录日记,必须同步写时,其实BLOCK 实际被忽略,也就 是此时不会有错。目前我们用的是MIMIX 备份,客户事实上将所有的文献都列入日记,这 时不写也不会出现上述错误。但为避免一些潜在的问题,养成良好的编程风格,建议将 SETON LR 与RETURN 一同,做为程序结束的标志。当然,假如某个程序频繁被调
16、用,且 不涉及文 操作时,可考虑不打开指示器*INLR,仅用RETURN 作为结束,这样程序不 会被PURGE 出内存,可提高调用效率。 假如没写RETURN,也没有打开指示器*INLR,在编译时,系统将会报40 级错,说找 不到程序结束的语句,所以大可放心。 ROLBK (E) (Roll Back) 1. 基本语法 Factory 1 Operation Factory 2 Result ROLBK 2. 该操作码无其它参数,就是指对事务解决进行回滚操作。 3. ILE 程序中,ROLBK 操作可随时进行,也允许在没有声明COMMIT 类型的文献 的情况下,仍进行ROLBK 操作(对该进程
17、这前的事务进行确认解决)f 4. 关于日记的确认回滚操作,在后面会另设专门章节讲述。 2.8.4.5 S-Z SCAN (E) (Scan Character String) 扫描字符串 扫描字符或字符串Factory 1 在目的字符串Factory 2 中是否存在 Factory 1 Operation Factory 2 Result HI LO EQ FLD01 SCAN FLD02 N 26 FLD01 可以是字符,也可以是字符变量;可以是一位长,也可以是多位长。 当FLD01 在FLD02 中存在时,EQ 指示器打开,即*IN26=1,同时将FLD02 中的起始 位置,赋值给N; 当
18、FLD01 在FLD02 中不存在时,EQ 指示器保持关闭状态,即*IN26=0,同时N=0 允许从FLD02 中的指定位置开始检查: FLD01 SCAN FLD02:2 N 26 如上句,即表达从FLD02 的第2 位,开始扫描。 在实际使用中,比如说我们判断某个字符是否为数字,就可以先定义一个09 的常量, 然后将要判断的字符去SCAN 一下这个常量 SELECT (Begin a Select Group) 分支语句 在操作码“OTHER”中讲过,为方便读者,列出简朴语法如下: Factory 1 Operation Factory 2 Result HI LO EQ SELECT W
19、HEN 条件判断1 解决语句1 WHEN 条件判断2 解决语句2 OTHER 解决语句3 ENDSL 要注意,SELECT 操作码,必须有相应的ENDSL 操作码,否则编译无法通过。 SETGT (E) (Set Greater Than) 定位操作大于 举个例子吧,假设文献中有一个字段,是标记顺序号的,1、2、3、4。即该字段为1, 表达第一条记录,该字段为2,表达第2 条记录。那么: Factory 1 Operation Factory 2 Result HI LO EQ 2 SETGT 文献记录格式名 READ 文献记录格式名 这个READ 操作,READ 到的,是第3 条记录。也就是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 RPGAS400 程序员 培训 手册
限制150内