AS400开发经验点滴.doc_第1页
AS400开发经验点滴.doc_第2页
AS400开发经验点滴.doc_第3页
AS400开发经验点滴.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AS/400开发经验点滴(一)AS/400开发经验点滴(一) AS/400系统开发工具及开发语言很多,有许多技术性的东西并不是我们能经常碰到的,但这些东西在一些实际应用中很有用处。本人在几年AS/400系统上的开发中,也有一些经验。有些东西如果不把其形成文字,过一段时间后,本人都会很快忘掉,比如我现在要写两年前的经验就很费劲。现把其中一些经验总结出来,与大家共享也行,自娱自乐也行。本文不是学术论文,仅仅是一些开发经验总结,有不严谨的地方必定在所难免。 一如何在CL程序自动回复询问类消息(InquiryMessage) 在AS/400系统开发中,经常要与各种各样的消息打交道。有一类叫“EscapeMessage”的消息,是当程序出现错误后,会强迫程序异常结束,并告诉错误类型和原因。但经常时候我们不希望因为这些错误而使程序异常停止,在CL程序中,通常做法是用MONMSG命令来监视这些消息,而后采取相应的正确动作,或者引导程序结束。MONMSG一样还可以监视“StatusMessage”和“NotifyMessage”。 但是有一类“InquiryMessage”,MONMSG还是无法监视,这类消息通常有多个回复选择项,要求用户必须给一个选择答复,因而通常会暂停程序运行,而显示一个要求用户给消息进行回复的画面。那么如何在程序中让程序自动选择一个正确的回复项回复呢?如能自动答复,就不需要手工再回复了。 在作业JOBD里,有INQMSGRPY选择项,有三个选择:*RQD,*DFT,*SYSRPYL,这个INQMSGRPY就是表示指定InquiryMessage的答复方式,通常创建JOBD的时候INQMSGRPY项缺省是*RQD,这就表示需要操作员手工答复方式。而*DFT和*SYSRPYL就表示了两种程序可以自动答复的方式。 1 消息答复缺省值法 如果在作业JOBD里INQMSGRPY选项指定为*DFT方式,则程序会自动使用消息的缺省答复项,询问消息就不会再在屏幕上显示。消息的缺省答复项,可以用CHGMSGD命令事先手工改好,也可以在程序中加入。比如下面的命令可以先在程序中设定: CHGMSGDMSGID(CPA3E01)MSGF(QCPFMSG)DFT(G) 此语句表示修改QCPFMSG消息文件中的CPA3E01消息的缺省答复为G(表示继续执行)。 2 系统答复列表法 如果在作业JOBD里INQMSGRPY选项指定为*SYSRPYL方式,则程序会自动使用系统答复列表中定义的答复项。AS/400系统有一系统答复列表(SystemReplyList)。SystemReplyList允许用户指定某已定义在列表中消息的答复方式。SystemReplyList包含有序号、消息表示符、答复值、选择比较数据等。可以用WRKRPYLE命令查看SystemReplyList的所有内容。下面就是用WRKRPYLE命令查看到的内容: code:1:4399c2b5682=Change4=Delete SequenceMessage OptNumberID Reply CompareValue -10 CPA0700 D *NONE -20 RPG0000 D *NONE -30 CBE0000 D *NONE -40 PLI0000 D *NONE -50 CPF7025 I *NONE -60 CPA3E01 G *NONE -1111 CPA3708 G *NONE/code:1:4399c2b568 可以用ADDRPYLE命令把你自己要定义的消息及缺省答复值加入。注意加入的时候SequenceNumber项不能跟SystemReplyList已存在的重复。 但是用系统答复列表法有个缺陷,那就是把ADDRPYLE命令加入到程序中不方便,因为SystemReplyList里的SequenceNumber要求唯一,所以不能重复加入。而且当程序移到不同机器运行时,还必须把消息缺省答复重新加入SystemReplyList。 除了在JOBD可以指定消息答复方式外,还可以用BCHJOB和SBMJOB提交作业时在INQMSGRPY选择项里指定消息回复类别。BCHJOB和SBMJOB命令将会覆盖JOBD的答复方式。如果使用缺省答复方式和SBMJOB命令结合,可以先编一CL程序,就可以做到自动回复与机器和JOBD无关性,例子如下: code:1:4399c2b568CHGMSGDMSGID(CPA3E01)MSGF(QCPFMSG)DFT(G) SBMJOBCMD(CALLPGM(SMCRTRDBCL)JOB(SMCRTRDBCL)+ INQMSGRPY(*DFT)/code:1:4399c2b568二如何在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),则文件应只有一个记录格式(RecordFormat)。 (3) 在文件规范描述里(F行),不能使用RECNO关键词。 如果要使文件输入记录以块方式(BLOCK)读入,则F行必须指定BLOCK关键词,并赋值为*YES,比如,下面定义了一外部描述的DISK类型的文件,其读入方式采用BLOCK方式: code:1:f176636ef4FJRNRBUFPIFEDISKBLOCK(*YES)/code:1:f176636ef4 2使用CL程序调用,并用OVRDBF覆盖文件属性 光是在RPG的文件描述里定义BLOCK(*YES),并不能使程序按BLOCK方式工作。需要先使用OVRDBF命令改变一下文件的属性。OVRDBF是个不错的命令,它不仅可以在程序内部改变文件名称,还可以在不改变文件名称的情况下,改变文件的一些属性参数,或者同时改变文件名称及文件属性参数。要使BLOCK方式正常工作,就需要先用OVRDBF命令改变文件的属性。要使BLOCK正常工作,需要指定SEQONLY(*YES)属性,即文件是按顺序读,RPG程序中不能有随机读写函数,比如READE等。SEQONLY(*YES)允许把多个记录放进内部数据管理缓冲区(Internaldatamanagementbuffer),然后在一个时间点一次性把这些记录传给RPG程序。 在指定文件为SEQONLY(*YES)属性的同时,还应指定一次读取到内部缓冲区最大记录数,该记录数与缓冲区和记录的大小有关,缓冲区越大,记录长度越小,能够一次读取的最大记录数越多。系统缺省最大记录数为4,实际工作中可以通过反复测试来验证系统能够一次读取的最大记录数,当设定的最大记录数*记录长度内部缓冲区后,程序会报一错误。OVRDBF修改文件属性示范例子如下: code:1:f176636ef4OVRDBFFILE(JRNRBUFP)SEQONLY(*YES34)/code:1:f176636ef4 上面语句规定了RPG程序可以对JRNRBUFP文件进行顺序BLOCK读写,一次可以读取34条记录进内部缓冲区。 注意事项: (1) 要使用BLOCK方式,必须先用CL命令OVRDBF定义文件属性,然后调用RPG程序,不可以在RPG程序内部调用OVRDBF。 (2) 使用BLOCK方式,要求文件为顺序读写方式,所以RPG程序中不能使用READE等随机读写函数 (3) 通常对大文件进行批处理时,文件都是顺序读写的,这时候使用BLOCK方式,效果特别明显,实际经验发现速度可以提高5-10倍。三如何在RPG程序里捕捉与文件操作有关的系统消息 AS/400系统里有大量各类消息,应用程序经常会因为意外情况被这些消息所打断,应用程序或者弹出消息窗口,或者在作业状态中报MSGW,等待人工干预。在CL程序里可以使用MONMSG命令来捕捉消息或自动答复消息机制来处理各样的消息,使程序始终能够正确地运行。但在RPG程序里,又怎么捕捉消息然后对消息进行特别处理呢? RPG程序实际主要是对各类各样的文件操作,比如DISK文件(物理文件、逻辑文件)、显示文件、通信文件、打印文件等等。下面以DISK文件为例示范如何在RPG程序里捕捉错误消息。 1 在文件描述规范(F行)里定义INFDS关键词 在RPG文件描述规范的关键词里,有一INFDS关键词。这个关键词是用来定义文件信息数据结构的,这个结构对每个文件都是唯一的。里面包含有几种FeedbackInformation。其中从1-80位是FileFeedbackInformation,在FileFeedbackInformation的第46-52位定义了MessageID,当对文件操作出现错误消息时,这个错误消息就会保存在这个位置。在数据规范定义(D行)里把INFDS结构里的46-52位定义一变量,这样我们就可以获得错误消息了。下面是F行和D行的示范例子 code:1:7bfbacd568FTESTMSGOF3750DISKUSROPN FINFDS(MSGFD) DMSGFDDS DMSGID4652/code:1:7bfbacd568 2 在文件描述规范里定义INFSR(*PSSR)关键词 实际上如上义后,我们仍然不能捕捉系统错误消息,因为文件出现错误消息后,就会发生以外退出了。在文件规范描述里还有一个INFSR关键词,这个关键词里指定一个子例程,来接收文件意外错误后的控制。这个子例程的名字可以是*PSSR。通常我们是指定这个子例程来对异常错误进行相同的处理。但是如果我们与上面定义的文件信息结构的中MSGID相结合,我们就可以对单独的信息进行特别的处理了,从而实现了对系统消息的捕捉与特别处理。下面是F行改正后例子: code:1:7bfbacd568FTESTMSGOF3750DISKUSROPN FI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论