首页 > 学技术 > 技术网文 > IBM AS400应用论坛 > 正文

[精彩] RETURN与SETON LR结束程序区别


来源 chinaunix.net 酷勤网整理

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掉整个作业.




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=779578
转载请注明作者名及原文出处



收藏本页到: