RETURN结束不会强迫内存中数据写入磁盘,
而SETON LR结束时会强迫内存中的数据写入磁盘.
比如一个输出文件, 400缺省方式是BLOCK方式输出,即当数据记录数满一个BLOCK块时才会把这一块的记录写入到时磁盘. 假若当用RETURN结束程序时,最后一个BLOCK块并没有满, 那么这最后一个BLOCK的记录就不会立即写入磁盘. 假若随后有其他作业需要用到该文件, 那么这个不完整的数据文件就有可能让这个作业运行出现错误.
每个PF文件属性后面都有一个属性叫
Records to force a write,
在这里面也可以设定记录条数,当改变记录条数达到这个数时,会强制写入磁盘. 假若这里设置条数为1, 那么每次改变或增加一条记录,就会立即写入磁盘. 但这样就增加了I/O次数, BLOCK输出方式也失去了意义. 但可以确保有RETURN结束的程序不会引起其他程序因数据原因出错.
因此,使用RETURN结束程序一定要小心.
wnai 回复于:2006-06-24 16:22:46
好贴,终于明白这两者的区别了,但是我们是set on LR和Return一起用:)
还有,记得刚开始写程序时,有一次用set on LR,忘了写Return,结果F3时不会退出,这又是怎么回事呢?
tianyi 回复于:2006-06-24 18:04:57
我的观点:
SETON LR 正像楼主说的那样,但不是结束程序。
RETUN 才是结束程序的命令
l.rover 回复于:2006-06-24 23:04:09
我们也是一起使用。我也同意2楼的说法。
blogliou 回复于:2006-06-25 09:37:17
仅仅用return, 程序不会被purge出内存. 对于那些不涉及数据操作仅实现某些功能的公共函数,用return特别有效率.
胖有型 回复于:2006-06-29 16:13:48
那想再问一下, FREE呢?是指将程序PURGE的意思吗?和RETURN有什么异同?
blogliou 回复于:2006-06-29 16:49:59
现在新的RPGLE好象没有FREE操作码了? 现在FREE被用作"/FREE"自由格式标识了.
印象中老的RPG似乎有FREE? 它常用在程序中call一个程序之后, 加FREE,把所调程序purge出内存. 现在400内存一般都比较大,系统管理越来越自动化,能够自动管理内存中作业,比如能够把频繁调用的程序自动驻留内存一段时间,把不用的作业自动purge出内存, FREE也越来越没有多大意义.所以现在的RPGLE好象也找不到这个操作码了?
[ 本帖最后由 blogliou 于 2006-6-29 17:18 编辑 ]
luck_jogger 回复于:2006-07-03 16:04:20
明白了。
胖有型 回复于:2006-07-06 17:02:30
明白了。我是说以前的很多老程序都有个FREE,但是转成ILE的版本后都被注释了。
来生缘 回复于:2006-07-14 13:27:13
引用:原帖由 tianyi 于 2006-6-24 18:04 发表
我的观点:
SETON LR 正像楼主说的那样,但不是结束程序。
RETUN 才是结束程序的命令
同意。
lh000 回复于:2007-02-01 19:24:44
##1
1> MAIN BEGSR
2> Z-ADD 6 P1NBR 4 0
3> EXSR SFL20_1
4> ENDSR
##2
5> SFL20_1 BEGSR
6> ADD 1 P1NBR
7> ENDSR
一个程序里的两个函数,当MAIN被调用执行到第三行的时候,P1NBR的值是6.
但当去调用SFL20_1 的时候,P1NBR变成了其他的值.本来加1以后是7的结果就发生了错误.
真是百思不的其解. 看看各位高手有没有遇到过同样的问题.
在整个程序中使用过RETURN,不知道是不是它造成的.
bjrichard1 回复于:2007-02-02 09:10:17
3楼说得还可以!补充一下:
说到seton LR on 和 return的区别,要从rpg circle说起,rpg程序都遵守rpg circle的运行规则,LR置为1表示程序时会完全结束,按照rpg circle的运行规则,当LR=1时,程序并不立刻退出,什么时候退出呢?如果遇到RT=1,程序立刻退出,或者Detail Calculation全部运行结束后退出程序。我们可以看看我们写的程序,程序结束通常都是 set on lr 然后 return。有兴趣的人可以在两句话之间加上一个dsply,在return后面加上一个dsply,看看执行情况就明白了。
rt=1时,程序立刻返回,是否退出要看lr是否是1,如果是1,程序完全退出,如果不是1,那么程序驻留内存,包括打开的文件,此时程序再次被调用时,会很快,但是注意*inzsr段不被执行。就说这么多,有兴趣的人可以看看refferrence 中关于rpg circle的说明。
chinagirlwang 回复于:2007-02-02 16:55:10
RETURN 后面的语句不会在执行了。
zhihui.tree 回复于:2007-02-19 00:29:50
- seton lr 是针对主程序的 PROGRAM CIRCLE的, 说明至此要释放PROGRAM CIRCLE用到的所有资源;
- return 是个HLL退出原语, 用在RPG subprocedure里是返回, 用在 main procedure里是退掉PGM所在激活组;
- 二者一起用在MAIN PROCEDURE里是个隐含的错误: 在多线程应用里, 如果CALL了一个MAIN PROCEDURE中含RETURN OP 且 该PGM使用系统命名激活组(即ACTGRP(*NEW)); 那么该PGM的RETURN将END掉整个作业.
|