yoyoage 回复于:2003-12-05 12:59:17 |
嗯,挺不错,对我是新知识哦 |
xuguopeng 回复于:2003-12-05 13:01:09 |
不错不错 ,加油~~ 等着你继续呢 |
dfangyang 回复于:2003-12-05 15:27:51 |
不错,continue |
blogliou 回复于:2003-12-05 17:58:01 |
二 如何在RPG程序使用BLOCK关键词提高读写文件速度
RPG编程通常要与物理文件、逻辑文件等各类文件打交道。在RPG的F定义行里有一BLOCK关键词,善加使用这一关键词可以大幅度提高文件的读写速度。这在对具有大量数据的文件进行批处理时,效果特别明显。使用方法如下: 1. 定义RPG程序F行(文件描述规范): 文件描述规范里有一BLOCK(*YES|*NO)关键词。它控制着文件的块读写方式。该关键词只对DISK或SEQ类型的文件有效。我们常见的物理文件(PF)或逻辑文件(LF)就是DISK文件。 在缺省情况下,即F行关键词位置没有定义BLOCK时,在编译RPG程序时,对于输入记录,BLOCK缺省值为*NO,即文件不会以块的方式读入;对于输出记录,BLOCK缺省直为*YES。但上面编译缺省值需要先符合下面条件: (1) 文件是程序描述文件(program-described)。 (2) 文件如果是外部描述文件(externally-described),则文件应只有一个记录格式(Record Format)。 (3) 在文件规范描述里(F行),不能使用RECNO关键词。 如果要使文件输入记录以块方式(BLOCK)读入,则F行必须指定BLOCK关键词,并赋值为*YES, 比如,下面定义了一外部描述的DISK类型的文件,其读入方式采用BLOCK方式: [code:1:f176636ef4]FJRNRBUFP IF E DISK BLOCK(*YES) [/code:1:f176636ef4] 2.使用CL程序调用,并用OVRDBF覆盖文件属性 光是在RPG的文件描述里定义BLOCK(*YES),并不能使程序按BLOCK方式工作。需要先使用OVRDBF命令改变一下文件的属性。OVRDBF是个不错的命令,它不仅可以在程序内部改变文件名称,还可以在不改变文件名称的情况下,改变文件的一些属性参数,或者同时改变文件名称及文件属性参数。要使BLOCK方式正常工作,就需要先用OVRDBF命令改变文件的属性。要使BLOCK正常工作,需要指定SEQONLY(*YES)属性,即文件是按顺序读,RPG程序中不能有随机读写函数,比如READE等。SEQONLY(*YES)允许把多个记录放进内部数据管理缓冲区(Internal data management buffer),然后在一个时间点一次性把这些记录传给RPG程序。 在指定文件为SEQONLY(*YES)属性的同时,还应指定一次读取到内部缓冲区最大记录数,该记录数与缓冲区和记录的大小有关,缓冲区越大,记录长度越小,能够一次读取的最大记录数越多。系统缺省最大记录数为4,实际工作中可以通过反复测试来验证系统能够一次读取的最大记录数,当设定的最大记录数*记录长度>内部缓冲区后,程序会报一错误。OVRDBF修改文件属性示范例子如下: [code:1:f176636ef4]OVRDBF FILE(JRNRBUFP) SEQONLY(*YES 34)[/code:1:f176636ef4] 上面语句规定了RPG程序可以对JRNRBUFP文件进行顺序BLOCK读写,一次可以读取34条记录进内部缓冲区。 注意事项: (1) 要使用BLOCK方式,必须先用CL命令OVRDBF定义文件属性,然后调用RPG程序,不可以在RPG程序内部调用OVRDBF 。 (2) 使用BLOCK方式,要求文件为顺序读写方式,所以RPG程序中不能使用READE等随机读写函数 (3) 通常对大文件进行批处理时,文件都是顺序读写的,这时候使用BLOCK方式,效果特别明显,实际经验发现速度可以提高5-10倍。 |
blogliou 回复于:2003-12-05 17:58:50 |
三 如何在RPG程序里捕捉与文件操作有关的系统消息
AS/400系统里有大量各类消息,应用程序经常会因为意外情况被这些消息所打断,应用程序或者弹出消息窗口,或者在作业状态中报MSGW,等待人工干预。在CL程序里可以使用MONMSG命令来捕捉消息或自动答复消息机制来处理各样的消息,使程序始终能够正确地运行。但在RPG程序里,又怎么捕捉消息然后对消息进行特别处理呢? RPG程序实际主要是对各类各样的文件操作,比如DISK文件(物理文件、逻辑文件)、显示文件、通信文件、打印文件等等。下面以DISK文件为例示范如何在RPG程序里捕捉错误消息。 1. 在文件描述规范(F行)里定义INFDS关键词 在RPG文件描述规范的关键词里,有一INFDS关键词。这个关键词是用来定义文件信息数据结构的,这个结构对每个文件都是唯一的。里面包含有几种Feedback Information。其中从1-80位是File Feedback Information, 在File Feedback Information的第46-52位定义了Message ID,当对文件操作出现错误消息时,这个错误消息就会保存在这个位置。在数据规范定义(D行)里把INFDS结构里的46-52位定义一变量,这样我们就可以获得错误消息了。下面是F行和D行的示范例子 [code:1:7bfbacd568]FTESTMSG O F 3750 DISK USROPN F INFDS(MSGFD) D MSGFD DS D MSGID 46 52 [/code:1:7bfbacd568] 2. 在文件描述规范里定义INFSR(*PSSR)关键词 实际上如上义后,我们仍然不能捕捉系统错误消息,因为文件出现错误消息后,就会发生以外退出了。在文件规范描述里还有一个INFSR关键词,这个关键词里指定一个子例程,来接收文件意外错误后的控制。这个子例程的名字可以是*PSSR。通常我们是指定这个子例程来对异常错误进行相同的处理。但是如果我们与上面定义的文件信息结构的中MSGID相结合,我们就可以对单独的信息进行特别的处理了,从而实现了对系统消息的捕捉与特别处理。下面是F行改正后例子: [code:1:7bfbacd568]FTESTMSG O F 3750 DISK USROPN F INFDS(MSGFD) F INFSR(*PSSR) D MSGFD DS D MSGID 46 52 [/code:1:7bfbacd568] 下面是接收错误消息控制的子例程的例子: [code:1:7bfbacd568]C *PSSR BEGSR C MSGID IFEQ 'CPF5006' C 。。。。。 C GOTO XXXTAG C ENDIF C 。。。。 ** C MOVE '*DETC ' RETURN ** (Continue at the beginning) C ENDSR RETURN[/code:1:7bfbacd568] |
mamei 回复于:2003-12-05 18:29:18 |
精华! |
qingzhou 回复于:2003-12-05 18:32:38 |
不错,不错!
让我们也共同分享你的成功! |
layyf 回复于:2003-12-05 18:44:47 |
thank you |
dashuai 回复于:2003-12-08 20:45:27 |
收藏,期待下篇。 |
偷偷的学 回复于:2003-12-11 20:19:05 |
:P
宝哥,看了你的这几篇贴子真是受益匪浅。 以前在农联社的时候就向你偷师不少,佩服佩服。 以后会多多向你请教 |
hanyu 回复于:2003-12-12 08:41:39 |
谢谢 |
andrewleading_he 回复于:2004-01-05 17:26:39 |
厲害! |
fairyboy 回复于:2004-12-01 08:03:00 |
晕死了,这么好的东西,我怎么到今天才看到呢?
偶像啊,加油楼主 |
Red_Crow 回复于:2004-12-01 08:52:02 |
支持! |
thursday 回复于:2004-12-01 09:32:50 |
收藏,帮顶! |