原文:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=216871
AS/400系统开发工具及开发语言很多,有许多技术性的东西并不是我们能经常碰到的,但这些东西在一些实际应用中很有用处。本人在几年AS/400系统上的开发中,也有一些经验。有些东西如果不把其形成文字,过一段时间后,本人都会很快忘掉,比如我现在要写两年前的经验就很费劲。现把其中一些经验总结出来,与大家共享也行,自娱自乐也行。本文不是学术论文,仅仅是一些开发经验总结,有不严谨的地方必定在所难免。
一 如何在CL程序自动回复询问类消息(Inquiry Message)
在AS/400系统开发中,经常要与各种各样的消息打交道。有一类叫“Escape Message”的消息,是当程序出现错误后,会强迫程序异常结束,并告诉错误类型和原因。但经常时候我们不希望因为这些错误而使程序异常停止,在CL程序中,通常做法是用MONMSG命令来监视这些消息,而后采取相应的正确动作,或者引导程序结束。MONMSG一样还可以监视“Status Message”和“Notify Message”。
但是有一类“Inquiry Message”,MONMSG还是无法监视,这类消息通常有多个回复选择项,要求用户必须给一个选择答复,因而通常会暂停程序运行,而显示一个要求用户给消息进行回复的画面。那么如何在程序中让程序自动选择一个正确的回复项回复呢?如能自动答复,就不需要手工再回复了。
在作业JOBD里,有INQMSGRPY选择项,有三个选择:*RQD,*DFT,*SYSRPYL,这个INQMSGRPY就是表示指定Inquiry Message的答复方式,通常创建JOBD的时候INQMSGRPY项缺省是*RQD,这就表示需要操作员手工答复方式。而*DFT和*SYSRPYL就表示了两种程序可以自动答复的方式。
1. 消息答复缺省值法
如果在作业JOBD里INQMSGRPY选项指定为*DFT方式,则程序会自动使用消息的缺省答复项,询问消息就不会再在屏幕上显示。消息的缺省答复项,可以用CHGMSGD命令事先手工改好,也可以在程序中加入。比如下面的命令可以先在程序中设定:
CHGMSGD MSGID(CPA3E01) MSGF(QCPFMSG) DFT(G)
此语句表示修改QCPFMSG消息文件中的CPA3E01消息的缺省答复为’G’(表示继续执行)。
2. 系统答复列表法
如果在作业JOBD里INQMSGRPY选项指定为*SYSRPYL方式,则程序会自动使用系统答复列表中定义的答复项。AS/400系统有一系统答复列表(System Reply List)。System Reply List允许用户指定某已定义在列表中消息的答复方式。System Reply List包含有序号、消息表示符、答复值、选择比较数据等。可以用WRKRPYLE命令查看System Reply List的所有内容。下面就是用WRKRPYLE命令查看到的内容:
- 2=Change 4=Delete
- Sequence Message
- Opt Number ID Reply Compare Value
- - 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
可以用ADDRPYLE命令把你自己要定义的消息及缺省答复值加入。注意加入的时候Sequence Number项不能跟System Reply List已存在的重复。
但是用系统答复列表法有个缺陷,那就是把ADDRPYLE命令加入到程序中不方便,因为System Reply List里的Sequence Number要求唯一,所以不能重复加入。而且当程序移到不同机器运行时,还必须把消息缺省答复重新加入 System Reply List。
除了在JOBD可以指定消息答复方式外,还可以用BCHJOB和SBMJOB提交作业时在INQMSGRPY选择项里指定消息回复类别。BCHJOB和SBMJOB命令将会覆盖JOBD的答复方式。如果使用缺省答复方式和SBMJOB命令结合,可以先编一CL程序,就可以做到自动回复与机器和JOBD无关性,例子如下:
- CHGMSGD MSGID(CPA3E01) MSGF(QCPFMSG) DFT(G)
- SBMJOB CMD(CALL PGM(SMCRTRDBCL)) JOB(SMCRTRDBCL) +
- INQMSGRPY(*DFT)