如何在RPG程序里捕捉与文件操作有关的系统消息

 

如何在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行的示范例子

代码:

  1. FTESTMSG     O    F 3750        DISK    USROPN         
  2. F                                          INFDS(MSGFD)   
  3.  
  4. D MSGFD              DS                        
  5. D  MSGID                 46     52   


2. 在文件描述规范里定义INFSR(*PSSR)关键词

实际上如上义后,我们仍然不能捕捉系统错误消息,因为文件出现错误消息后,就会发生以外退出了。在文件规范描述里还有一个INFSR关键词,这个关键词里指定一个子例程,来接收文件意外错误后的控制。这个子例程的名字可以是*PSSR。通常我们是指定这个子例程来对异常错误进行相同的处理。但是如果我们与上面定义的文件信息结构的中MSGID相结合,我们就可以对单独的信息进行特别的处理了,从而实现了对系统消息的捕捉与特别处理。下面是F行改正后例子:

代码:

  1. FTESTMSG     O    F 3750        DISK    USROPN         
  2. F                                          INFDS(MSGFD)   
  3. F                                          INFSR(*PSSR)
  4.  
  5. D MSGFD              DS                        
  6. D  MSGID                 46     52   

下面是接收错误消息控制的子例程的例子:

代码:

  1. C     *PSSR         BEGSR                                    
  2. C     MSGID        IFEQ      'CPF5006'                        
  3. C                   。。。。。            
  4. C                   GOTO      XXXTAG                        
  5. C                   ENDIF                                      
  6. C                   。。。。
  7. **
  8. C                   MOVE      '*DETC '      RETURN  
  9. **                 (Continue at the beginning)
  10. C                   ENDSR     RETURN

以下是补充:
3 非*PSSR方式

*PSSR可以帮助我们在以意外情况下知道是什么错误,但是不知道是在哪里出错.一般情况下我们更需求知道在哪里出错的. 我们可以利用RPG操作码出错指示器来判断,然后也可以判断MSGID,例如:

  1.      C     SWRTFCIF0     BEGSR
  2.      C                   WRITE     F_TESTF                               70
  3.      C                   IF        *IN70
  4.      C                   SELECT
  5.       *
  6.       *----------------*
  7.       * ()
  8.       *----------------*
  9.      C                   WHEN      MSGID = 'CPF5026' OR MSGID = 'CPF5009'
  10.      C                   MOVEL     *BLANKS       MSGID
  11.     ........  
  12.       *
  13.       *-----------------------------*
  14.       * (+())
  15.       *-----------------------------*
  16.      C                   WHEN      MSGID = 'CPF5034'
  17.      C                   MOVEL     *BLANKS       MSGID
  18.   .........
  19.       *
  20.      C                   OTHER
  21. ........
  22.       *
  23.      C                   ENDSL
  24.      C                   ENDIF
  25.      C                   ENDSR
  26.       *

也可以利用RPG4的Function,例如:

CHAIN(E)(e)  somefile
IF %ERROR
SELECT
when msgid = recordlock
.....

ENDSL
ENDIF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值