Chinaunix首页 | 论坛 | 博客
  • 博客访问: 72033
  • 博文数量: 15
  • 博客积分: 575
  • 博客等级: 中士
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-25 14:49
文章分类

全部博文(15)

文章存档

2011年(1)

2006年(14)

我的朋友

分类:

2006-05-29 14:55:31

第八章  处理信息

 

       这章介绍在用户和程序之间用信息做通讯的一些方法,信息可以用如下方法发送:

       从一个系统用户到另一个系统用户,信息的接收者当前没使用系统也可。

              从一个OPM程序或ILE过程到另一个OPM程序或ILE过程。

       从过程或程序向系统用户,信息的接收者当前没使用系统也可。

交互系统用户仅可发送立即信息和回答信息。

OPM程序或ILE过程可发送立即信息或预先定义的有用户定义数据的信息,另外,过程或程序也能:

       接收信息

       从信息文件中取得信息描述且把它放到程序变量中

       从信息队列中移出信息

       监控信息

 

8.1  给系统用户发送信息

       下列命令可用来向系统用户发送信息:

              SNDMSG(发送信息)

              SNDBRKMSG(发送中断信息)

              SNDPGMMSG(发送程序信息)

              SNDUSRMSG(发送用户信息)

       SNDUSRMSGSNDPGMMSG可用在批及交互的OPM程序和ILE过程中,不能在命令行中输入。SNDMSGQSYSOPR,显示工作站信息队列或用户信息队列中发送信息或查询。

       可以同时向多个信息队列发送查询信息,也可只向一个信息队列发送查询信息,信息是由信息队列规定的交付方式交付的,如果信息不是中断方式,就不能中断用户的当前操作。

       下面的SNDMSG命令由显示工作站用户发送信息给系统操作员:

 

     SNDMSG   MSG('Mount tape on device TAP1') TOUSR(*SYSOPR)

 

       SNDBRKMSG命令从工作站、程序或作业送一个立即信息给一个或多个工作站,它会以中断方式交付而不管接收的信息队列是什么方式。这个命令只能往显示工作站信息队列发送信息,可在需要工作站用户立即干预时用此命令,但不能保证此信息都会引起中断。因为每个作业可用CHGJOB命令中的BRKMSG参数来控制这件事。

       如果发送查询信息,可规定回答返回给哪个信息队列而不是你的显示工作站。

       下面的命令是由系统操作员给所有的工作站用户发送信息:

 

     SNDBRKMSG MSG('System going down in 15 minutes')

               TOMSGQ(*ALLWS)

 

       此命令把信息发送给所有用户,而不是此时正活动的用户。

 

8.2  CL程序中发送信息

       SNDPGMMSGSNDUSRMSG命令从CL过程或程序中发送信息。

       SNDPGMMSG命令可发送下列类型的信息:

              消息、查询、完成、诊断、请求、逃逸、状态、通知。

       可从CL过程或程序往下列类型的队列发送信息:

              作业的外部信息队列(看7.4.2

              程序的调用信息队列(看7.4.2

              QSYSQPR队列

              工作站信息队列

              用户信息队列

       要从过程或程序中发送信息,在SNDPGMMSG命令中要规定下列内容:

              信息标识或立即信息:信息标识是预先定义信息的信息描述的名字。

              信息文件:在发送预先定义信息时,包含信息描述的信息文件的名字。

              信息数据字段:如果发送预先定义信息,这些字段包含信息中替换变量的值。每

  个字段的格式化须在信息描述中说明。如果发送立即信息,就没 

  有信息数据字段。

接收信息的信息队列或用户。

       信息类型:下表给出哪类信息可以发送给哪类队列(=有效)

 

信息类型

外部

调用

QSYSOPR

工作站

用户

消息

查询

 

完成

诊断

请求

 

 

 

逃逸

 

 

 

 

状态

 

 

 

通知

 

 

 

 

       CCSID:规定提供信息或信息数据所用的编码字符集标识。

       回答信息队列:接收对查询回答的信息队列的名字,缺省为回答送往发送查询信息的

过程或程序的调用信息队列。

    键字变量名:包含信息引用键的CL变量名。

要往7.2.9生成的信息队列发送信息,可用下列命令:

 

     SNDPGMMSG   MSGID(USR4310) MSGF(QGPL/USRMSG) +

                 MSGDTA(&CUSNO) TOPGMQ(*EXT) +

                 MSGTYPE(*INFO)

 

信息的替换变量是客户号,由于客户号可变,不能在信息中规定确切的客户号,那么,要在过程或程序中对客户号说明一个CL变量(&CUSNO),然后把它规定为信息数据字段。在发送信息时,变量的当前值传给信息。

 

      customer  number  35500  not  found

 

    另外,也不总是知道哪个显示工作站使用过程或程序,       故在TOPGMQ参数中也不能规定确切的显示工作站信息队列。这样,可以规定外部信息队列*EXE

8.2.1  信息

8.2.1.1  查询和消息

       SNDUSRMSG命令,可向显示工作站用户、系统操作员或用户定义的信息队列发送查询或消息。如果发送查询信息,过程或程序要等待用户的回答,信息可以是立即信息或预先定义的信息,对交互作业,信息用缺省值送往显示工作站用户,对批作业,信息用缺省值送往系统操作员。要用SNDUSRMSG发送信息,可在命令中规定以下内容:

              信息标识或立即信息:信息标识是预先定义信息的信息描述的名字

              信息文件:发送预先定义信息时,包括信息描述的信息文件的名字

              信息数据字段:如果发送预先定义信息,这些字段包含信息中替换变量的值。每

  个字段的格式化须在信息描述中说明。如果发送立即信息,就没 

  有信息数据字段

              对查询信息有效的回答

              信息类型

              接收的信息队列

              信息回答:一个CL变量,它包括对查询信息响应的回答

              转换表:用来转换回答值,通常用来做大小写转换

              CCSID:规定提供信息或信息数据所用的编码字符集

 

8.2.1.2  完成和诊断信息

       SNDPGMMSG命令,可发送诊断和完成信息,可发送给任何信息队列。诊断信息告诉调用过程或程序检查到的错误,完成信息告诉所做的工作结果。

       通常,逃逸信息是送往过程或程序来告诉调用者有什么问题或发送诊断信息。对完成信息,通常不发送逃逸信息,因为所要求的功能已经完成。例如,假定系统操作员用菜单来调用程序SAYPAY来保存某个目标,用下面的程序来保存然后发布完成信息:

 

     PGM

     SAVOBJ OBJ(PAY1 PAY2) LIB(PAYROLL) CLEAR(*YES)

     SNDPGMMSG MSG('Payroll objects have been saved') MSGTYPE(*COMP)

     ENDPGM

 

       如果SAVOBJ失败,CL功能检测且系统操作员要显示详细的信息来发布逃逸信息,以解释失败的原因。如果成功地完成SAVOBJ,要往显示菜单程序的调用信息队列发送完成信息,完成信息要与IBM支持的命令一致。多数IBM命令会发送完成信息指出成功地完成,查看送往作业日志的信息类型会有助于做问题分析。

 

8.2.1.3  状态信息

       可用SNDPGMMSG命令从CL过程或程序中往作业的调用信息队列或*EXT发送状态信息。在送往调用信息队列时,接收的过程或程序能监控状态信息的到达及能处理描述的条件。如果不能监控这些信息,控制要返给发送者来重处理。请看8.3的说明。

 

8.2.1.4  逃逸和通知信息

       可用SNDPGMMSG命令从CL过程或程序中往调用过程或程序的调用信息队列发送逃逸信息,它告诉调用者过程或程序非正常结束以及原因。调用者能监控逃逸信息的到达且处理发生的条件,当调用者处理这个条件时,控制不会返给逃逸信息的发送者。假如调用者是同一程序用的另外过程,程序本身不结束,发出逃逸的过程也可以继续。如果逃逸信息送往程序本身的调用者,所有程序中活动的过程都立即结束,结果是程序不能继续运行。如果调用者没有监控这个逃逸信息,那么采取缺省的系统动作。

       可以从CL过程或程序往调用程序或过程的信息队列或外部信息队列发送通知信息,它告诉调用者继续运行的条件,调用过程或程序能监控这些信息的到达并处理它产生的条件。如果调用者是ILE过程,过程能处理这个条件返回一个回答然后让过程或程序继续进行。如果没有监控,则返回给发送者一个缺省值,然后发送者重新操作,请看8.3

       不能用立即信息做逃逸和通知信息,系统定义了信息CPF9898,它用做立即的逃逸和通知信息。例如:

 

     SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Error condition') +

               MSGTYPE(*ESCAPE)

 

8.2.2  发送信息的例子

       1:此例允许显示工作站用户调用有这个过程的CL程序来提交作业而不用

SBMJOB命令,在提交作业后会发送一个完成信息。

 

     PGM

     SBMJOB JOB(WKLYPAY) JOBD(USERA) RQSDTA('CALL WKLY PARM(PAY1)')

     SNDPGMMSG MSG('WKLYPAY job submitted') MSGTYPE(*COMP)

     ENDPGM

 

       2:此例基于从被调用程序接收的参数来修改信息,然后由过程发送一个完成信息。

 

     DCL &RCDCNT TYPE(*CHAR) LEN(3)

     CALL PGMA PARM(&RCDCNT)

     SNDPGMMSG MSG('PGMA completed' *BCAT &RCDCNT *BCAT +

               'records processed') MSGTYPE(*COMP)

     ENDPGM

 

       3:此过程发送信息请示系统操作员装入一个特别格式,RCVMSG命令等待回答。

系统操作员要给出至少一个字符做回答,但过程不使用这个回答的值。

 

     PGM

     DCL &MSGKEY TYPE(*CHAR) LEN(4)

     SNDPGMMSG   MSG('Load special form') TOUSR(*SYSOPR) +

                 KEYVAR(&MSGKEY) MSGTYPE(*INQ)

     RCVMSG MSGTYPE(*RPY) MSGKEY(&MSGKEY) WAIT(120)

     .

     .

     .

     ENDPGM

 

       RCVMSG命令中必须规定WAIT参数,这样过程能等待回答。如果没规定WAIT,过程继续执行RCVMSG后的指令,而不接收回答,在RCVMSG中使用的MSGKEY参数允许过程接收回答,在SNDPGMMSG中的变量&MSGKEY返给过程用在RCVMSG命令中。

       4:下面过程在批作业时把信息发送给系统操作员,作业在工作站运行时发送给工

作站用户,过程接收大写或小写的YN(小写由转换表(TRNTBL参数)转

成大写)。如果回答的不是这四种,操作员发送信息指出回答无效。

 

     PGM

     DCL &REPLY *CHAR LEN(1)

     .

     .

     SNDUSRMSG MSG('Update YTD Information Y or N') VALUES(Y N) +

          MSGRPY(&REPLY)

     IF (&REPLY *EQ Y)

      DO

      .

      .

      .

      ENDDO

     ELSE

      DO

      .

      .

      ENDDO

      .

      .

      .

     ENDPGM

 

       5:下面的过程使用CPF9898发送逃逸信息,信息内容为‘procedure  detected 

failure。立刻信息不能做逃逸信息,故CPF9898用做信息数据。

 

        PGM

        .

        .

        .

     SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGTYPE(*ESCAPE)

          MSGDTA('Procedure detected failure')

        .

        .

        ENDPGM

 

 

 

       6:下面的过程允许系统操作员给几个显示工作站发送信息。在系统操作员调用程

序时,这个过程包括在被调用程序中,显示一个提示让系统操作员进入发送信息

类型以及信息正文,过程连接时间、       日期和信息正文。

 

                PGM

                DCLF WSMSGD

                DCL &MSG TYPE(*CHAR) LEN(150)

                DCL &HOUR TYPE(*CHAR) LEN(2)

                DCL &MINUTE TYPE(*CHAR) LEN(2)

                DCL &MONTH TYPE(*CHAR) LEN(2)

                DCL &DAY TYPE(*CHAR) LEN(2)

                DCL &WORKHR TYPE(*DEC) LEN(2 0)

                SNDRCVF RCDFMT(PROMPT)

                IF &IN91 RETURN /* Request was ended  */

                RTVSYSVAL QMONTH RTNVAR(&MONTH)

                RTVSYSVAL QDAY RTNVAR(&DAY)

                RTVSYSVAL QHOUR RTNVAR(&HOUR)

                IF (&HOUR *GT '12') DO

                CHGVAR &WORKHR &HOUR

                CHGVAR &WORKHR (&WORKHR - 12)

                CHGVAR &HOUR &WORKHR /* Change from military time */

                ENDDO

                RTVSYSVAL QMINUTE RTNVAR(&MINUTE)

                CHGVAR    &MSG ('From Sys Opr ' *CAT &MONTH *CAT '/' +

                          *CAT &DAY +

                          *BCAT &HOUR *CAT ':' *CAT &MINUTE +

                          *BCAT &TEXT)

                IF (&TYPE *EQ 'B') GOTO BREAK

     NORMAL:    SNDPGMMSG MSG(&MSG) TOMSGQ(WS1 WS2 WS3)

                GOTO ENDMSG

     BREAK:     SNDBRKMSG MSG(&MSG) TOMSGQ(WS1 WS2 WS3)

     ENDMSG:    SNDPGMMSG MSG('Message sent to display stations') +

                          MSGTYPE(*COMP)

                ENDPGM

 

       用在程序中的显示文件WSMSGDDDS如下:

 

     |...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8

          A                                      DSPSIZ(24 80)

          A          R PROMPT                    TEXT('Prompt')

          A                                      BLINK

          A                                      CA03(91 'Return')

          A                                  1  2'Send Messages To Work Stations'

                                                  DSPATR(HI)

          A                                  3  2'TYPE'

          A            TYPE           1   1    +2VALUES('N' 'B')

          A                                      CHECK(ME)

                                                 DSPATR(MDT)

          A                                    +3'(N = No breaks  B = Break)'

          A                                  5  2'Text'

          A            TEXT         100   1    +2LOWER

          A

          A

 

       如果系统操作员在提示中输入:

 

          B

         

          please  sign  offf  by  3:30  today

 

       则发送下面的中断信息:

 

     from  sysopr  10/30  02:00  please  sign  off  by  3:30  today  

 

8.2.3  SNDPGMMSG的调用堆栈入口标识

       如果CL过程往OPM程序或另外的ILE过程发送一个信息,你必须标识调用堆栈入口来指出信息发送到哪儿,信息会送往标识的调用堆栈入口的调用信息队列。

       SNDPGMMSGTOPGMQ参数用来标识要发送的调用堆栈入口。标识由二部分组成:

              规定基本入口:规定TOPGMQ*PRV  *)指出基本入口是一个在运SNDPGMMSG

命令的过程中,偏移是对此基本入口的前一个入口,这个规定标识过的调用者正在使用这个命令。

              规定基本入口的偏移:偏移是(TOPGMQ的一个值)指明你是否给基本入口发送

信息(*SAME)或给基本入口的调用者(*PRV)发送信息。

       为了了解如何标识基本入口TOPGMQ的二个值,也需要了解ILE程序运行时的调用堆栈。用两个程序来做解释。程序CL PGM1是一个OPM程序,程序CL PGM2是一个ILE程序。既然CL PGM2ILE,它就能由几个过程组成,比如:CL PROC1CL PROC2CL PROC3,在运行时发生下列调用:

                     先调用CL PGM1

                     CL PGM1调用CL PGM2

              CL PGM2调用CL PROC1

                     CL PROC1调用CL PROC2

                     CL PROC2调用CL PROC3CL PROC4

       8-1用来解释在CL PROC2调用CL PROC4时的调用堆栈结构:

       在调用堆栈入口和OPM程序间是一一对应关系,对每一次的调用OPM程序,

都有一个新的入口加到调用堆栈中。

       一个ILE程序,做为一个单元,不在堆栈中出现,在调用ILE程序时调用的每个

过程要往堆栈中加一个入口,结果是往ILE过程中送信息,而不是往ILE程序中送。

       注:在调用ILE程序时,运行的第一个过程是程序的PEP(程序入口例程)。在CL中,

这个例程由系统生成(-CL-PEP),且调用你提供的第一个例程。在此例中,PEP

入口是在CL PGM1的入口和CL PROC1之间。

       下面是规定基本调用堆栈入口的不同方法。

              用命令做为基值的过程:

              如果TOPGMQ参数规定了TOPGMQ(*SAME  *)TOPEMQ(*PRV  *)。则使用

SNDPGMMSG命令的过程入口用做基本入口,如果规定TOPGMQ*SAME  *),

过程往其自身发送信息,如果规定TOPGMQ(*PRV  *),过程往调用者发送信息。

       注:在过程用TOPGMQ(*PRV  *)给调用者发送信息时要注意下列信息:

              CL PROC4CL PROC2给调用者送回信息时,信息不留在后续程序中,信息

在同程序中的过程之间发送。

如果目的是往程序的调用者发送信息,(此例中的CL PGM1),最好不要规定TOPGMQ(*PRV  *)

              CL PROC1发送信息给调用者时,跳过程序入口例程,即使调用得是PEP信息

也送往CL PGM1,在规定TOPGMQ(*PRV  *)PEP入口不是可视的,且不包括在发送操作中,如果用其它方法规定TOPGMQPEP对发送者来说是可视的。

       8-2解释了在CL PROC1CL PROC2CL PROC4分别给过程调用者发回信息时的结果。

 

 

 

过程

-CL-PEP

(CL PGM2)

 

 

 

 


   调用CL PROC1

过程CL PROC1

( CL PGM2)

 

 

 


   调用CL PROC2

过程CL PROC2

( CL PGM2)

 

 

 


   调用CL PROC4

过程CL PROC4

( CL PGM2)

 

 


                                                                                             

8-1运行时调用堆栈的例子

 

 

                                    调用CL PGM1

OPM程序

   CL PGM1

 

 

 


                                    调用CL PGM2

过程-CL-PEP

(CL  PGM2)

 

 

 


                                    调用CL PROC1

过程CL PROC1

(CL  PGM2)

 


SNDPGMMSG TOPGMQ(*PRV *)

                     ……

                                    调用CL PROC2

过程CL PROC2

(CL  PGM2)

 

 


                                                     SNDPGMMSG TOPGMQ(*PRV*)

 

                                    调用CL PROC4

过程CL PROC4

(CL  PGM2)

 

 


SNDPGMMSG TOPGMQ(*PRV *)

                     ……

                                                                                             

8-2  TOPGMQ(*PRV  *)的例子

 

 

 

       用名字标识基本入口:

              能提供一个在此入口运行的OPM程序或ILE过程的名字 来标识基本入口。名字

可以是简单名(一部分)或组合名(二部分或三部分),如下所述:

              简单名:用来标识OPM程序或ILE过程

                            如果简单名是10个字符或少于10个字符,那么由系统确定它是OPM

程序还是ILE过程。基本入口是最新用名字调用的OPM程序或ILE过程来标识,如果名字长度大于10个字符,那么系统确定它为ILE过程名,基本入口是用最新用名字调用的过程来标识,运行OPM程序的入口不做考虑。

       8-3是用简单名发送信息的例子,CL PROC4发送信息给CL PROC2CL PROC2CL PGM1发送信息。            

 

 

 

                              调用CL PGM1

OPM程序

   CL PGM1

 

 

 


                              调用CL PGM2

过程-CL-PEP

(CL  PGM2)

 

 

 


                              调用CL PROC1

过程CL PROC1

(CL  PGM2)

 

 

 


                              调用CL PROC2

过程CL PROC2

(CL  PGM2)

 

 


                                               SNDPGMMSG TOPGMQ(*SAME CL PGM1) 

                                                                                           ……

                              调用CL PROC4

过程CL PROC4

(CL  PGM2)

 

   SNDPGMMSG TOPGMQ

  (*SAME CL PROC2)

        ……

                                                                                    

8-3  使用简单名的例子

 

 

 

组合名:组合名由二部分或三部分组成,它们是:

                     模块名,编译过程的模块名

程序名,连编过程的程序名

过程名

       在要唯一标识信息送往的过程时,采用由下列部分组成的组合名:

过程名、模块名、程序名

过程名和模块名

过程名和程序名

如果是组合名,标识的基本入口不能由OPM程序运行。图8-4是用组合名发送息

的例子。此例中,CL PROC4用二部分的组合名往CL PROC1发送信息。

       不用全OPM程序名或全ILE过程名,可以使用部分名,详细内容请看CL 参考一书。

 

                                    调用CL PGM1

OPM程序

   CL PGM1

 

 

 


                                    调用CL PGM2

过程-CL-PEP

(CL  PGM2)

 

 

 


                                    调用CL PROC1

过程CL PROC1

(CL  PGM2)

 

 

 


                                    调用CL PROC2

过程CL PROC2

(CL  PGM2)

 

 


                                                 

过程CL PROC4

(CL  PGM2)

 

 


                                    调用CL PROC4

SNDPGMMSG TOPGMQ

*SAME CL PROC1

        *NONE CL PGM2)

……

                                                                                          

8-4  使用组合名的例子

 

 

 

       程序边界做基本入口:

              可用*PGMBDY或程序名来标识一个CL程序的PEP,标识的CL程序的PEP入口做为基本入口。在从程序边界外的过程中发送信息时,这个选项很有用。

       8-5是用*PGMBDY发送信息的例子。此例中,CL PROC4直接往CL PGM1发信息,而CL PGM1是调用CL PGM2的。CL PROC4能做这个操作不用知道哪个程序调用CL PGM2,也不知道发送信息过程与PEP的相关位置,用*PGMBDY而不用一起规定程序名,意思是标识程序的边界是发送信息过程所在的程序。图8-6是用*PGMBDY和一个程序名发送信息的例子,在图8-6中,使用下列过程或程序:

       CL PGM1CL PGM2,它们是在前面例子中定义过的。

       CL PGM3,它是另外一个ILE程序。

       CL PROCACL PGM3中,从CL PROCA中往CL PGM2的调用者发信息。信息是从CL PROCA中用*PGMBDYCL PGM2CL PGM2的调用者发信息。在此例中,如果规定TOPGMQ(*PRV -CL-PEP),信息会送往CL PGM3的调用者而不是CL PGM2的调用者。这是由于用名字调用的最新调用是CL PGM3PEP

 

 

 

                                    调用CL PGM1

OPM程序

   CL PGM1

 

 

 


                                    调用CL PGM2

过程-CL-PEP

(CL  PGM2)

 

 

 


                                    调用CL PROC1

过程CL PROC1

(CL  PGM2)

 

 

 


                                    调用CL PROC2

过程CL PROC2

(CL  PGM2)

 

 


                                                         

 

过程CL PROC4

(CL  PGM2)

 

                                    调用CL PROC4

SNDPGMMSG TOPGMQ

        (*PRV *PGMBDY)

            ……

                                                                                             

8-5  *PGMBDY的例子

 

 

 

                                                          调用CL PGM1

OPM程序

   CL PGM1

 

 

 


                                    调用CL PGM2

过程-CL-PEP

(CL  PGM2)

 

 

 


                                    调用CL PROC1

过程CL PROC1

(CL  PGM2)

 

 

 


                                   调用CL PROC2

过程CL PROC2

(CL  PGM2)

 

 


                                                         

 

   调用CL PROC4

过程CL PROC4

(CL  PGM2)

 

 

 

 


                                    调用CL PGM3

过程-CL-PEP

(CL  PGM3)

 

 

 

 


                                                          调用CL PROCA

过程CL PROCA

(CL  PGM2)

 

SNDPGMMSG TOPGMQ

    (*PRV *PGMBDY *NONE

CL PGM2)

            ……

                                                                                             

8-6  *PGMBDY的第二个例子

 

 

 

*PGMBDY也能用在OPM程序中。如果与*PGMBDY一起规定了一个OPM程序名,它的结果与仅用一个程序名是一样的,即TOPGMQ(*SAME *PGMBDY *NONE  OPM程序名)发送的信息与TOPGMQ(*SAME  OPM程序名)发送到同一个地方。

这种情况的一个例外是再发生往调用者本身的OPM程序发送信息。TOPGMQ(*SAME  程序名)是往最后一次再发生层送信息,但TOPGMQ(*SAME *PGMBDY *NONE  程序名)是往第一次再发生层上送信息。图8-7给出怎样调用PGM1及如何重复二次以上再调用过程本身,在第三次中,PGM1调用PGM2,然后PGM2PGM1发信息。如果程序仅用PGM1做名字发送信息,信息会到达PGM1的第三层。如果用*PGMBDYPGM1结合起来发信息,信息送到PGM1的第一层。

 

 

 

                                                       调用CL PGM1

OPM程序

   PGM1

  第一层

 

 

 


                               

                                                       调用PGM1

   PGM1

   第二层

 

 

 


                                    调用PGM1

    PGM1

    第三层

 

 

 

 


                                    调用PGM2

  OPM PGM2

 

 


    SNDPGMMSG TOMSGQ                               SNDPGMMSG TOMSGQ(*SAME  PGM1)

*SAME *PGMBDY

  *NONE  PGM1)                                              

                                                                                             

8-7  *PGMBDY的第三个例子

 

 

 

       用最新调用的过程做基本入口:

              虽然不知道过程名,但想往最新调用的ILE程序中的模块发送信息,可用

*PGMNAMEILE程序名一起用做基本入口名字,做为最新调用程序中过程的名字。

在例子中用的程序为:

              CL PGM1是一个ILE程序,其中有过程PROCAPROCB

              CL PGM2CL PGM3都是OPM程序。

              CL PGM3CL PGM1发信息但不知道哪个过程是最新调用的。

       *PGMNAMECL PGM1来完成发送。请看图8-8

       如果要把某些CL程序而不是所有CL程序转换为ILE程序,*PGMNAME是很有用的。例如,CL PGM1OPM程序,CL PGM3CL PGM1送信息且规定了TOPGMQ(*SAME  CL PGM1)。如果CL PGM1转换为ILE程序,仅在CL PGM3中的SNDPGMMSG起作用。由于在CL PGM1的调用堆栈中没有入口,所以CL PGM1不工作,如果规定TOPGM1(*SAME  *PGMNAME  *NONE  CL PGM1)CL PGM3会成功的往CL PGM1发送信息,而不管你是否使用过程名,*PGMNAME也能与OPM程序名一起使用,作用与仅用名字相同。例如,TOPGMQ(*SAME  *PGMNAME  *NONE OPM程序)TOPGMQ(SAME  OPM程序)往同一地方发送信息,在不能确定信息是发送给OPMILE程序名时可考虑使用*PGMNAME

 

 

 

                                                           调用CL PGM1

过程-CL-PEP  

 

 


                                  调用CL PPROCA

过程PROCA

(CL  PGM1)

 

 

 


                                    调用CL PROCB

过程PROCB

(CL  PGM1)

 

 

 


                                   调用CL PGM2

OPM CL PGM2

 

 


                                                         

   调用CL PGM3

OPM CL PGM3

 

 


                SNDPGMMSG TOPGMQ

    (*PRV *PGMNAME

  *NONECL CLPGM1)

            ……

                                                                                             

8-8  运行时调用堆栈的例子

 

 

 

       用控制边界做基本入口:

       可用特殊值*CTLBDY标识基本入口为最近的一个控制边界。如果两个入口在两个不同的活动组中运行,那么在两个调用堆栈之间存在一个控制边界,用*CTLBDY的一个标志是在同活动组运行做为发送信息的入口。

       看图8-9。例中CL PGM1CL PGM2CL PGM3是三个ILE程序,CL PGM1在活动组AG1中运行,CL PGM2CL PGM3在活动组AG2中运行,PROC3A往紧换AG2边界前的入口发送信息。

 

 

 

                                                     调用CL PGM1

                                          活动组AG1

过程-CL-PEP

(CL PGM1)

 

 

 


                                    调用PROC1A

过程PROC1A

(CL  PGM1)

 

 

 


                                    调用CL PGM2

                                          活动组AG2

过程-CL-PEP

(CL  PGM2)

 

 

 


                                   调用CL PROC2A

过程PROC2A

(CL  PGM2)

 

 


                                                         

 

   调用CL PPGM3

过程-CL-PEP

(CL  PGM2)

 

 

 

 


                                    调用CL PROC3A

过程PROC3A

(CL  PGM3)

 

SNDPGMMSG TOPGMQ

        (*PRV *CTLBDY)

            ……

                                                                                             

8-9  使用*CTLBDY的例子

 

 

 

       服务程序的考虑:

       上面介绍的内容对ILE程序和ILE服务程序都适用,它们之间的最重要的区别是有关的信息管理,服务程序没有PEP

       用来标识基本入口的任何选项,都不需要PEP,一个例外是是在明显的使用-CL-PEP情况。例如,TOPGMQ(*PRV  *PGMBDY)总是把信息发送给ILE程序或服务程序的调用者。如果是ILE程序,PEPPGMBDY值标识做基本入口,如果是ILE服务程序,在服务程序中第一个被调用的入口是由*PGMBDY值指定的。

 

8.2.4  CL过程或程序中接收信息

       RCVMSG命令从过程或程序的信息队列接收信息,可用下列方式接收信息:

              由信息类型:可以规定要接收的所有类型或某些类型(MSGTYPE参数),新信息

FIFO顺序接收,但逃逸信息用LIFO顺序接收。

              由信息引用键:可做下列之一:

              用它的信息引用键接收,系统会给在队列中的每个信息分配一个引用键,且把

   它做为一个变量数据传送。因此必须在过程或程序说明这个变量(DCL命令), 

   必须在RCVMSG命令中规定CL变量,通过它传送键(MSGKEY参数)

接收队列中指定信息引用键后的下一个信息,除了规定MSGKEY外,还必须

   规定MSGTYPE(*NEXT)

接收队列中指定信息键前的信息,除了规定MSGKEY外,还必须规定

   MSGTYPE(*PRV)

       由它在信息队列中的位置:对第一个信息规定MSGTYPE(*FIRST)

                                                 对最后一个信息规定MSGTYPE(*LAST)

              由信息类型和引用键一起(MSGTYPEMSGKEY

              要接收一个信息,可以规定:

              信息队列:接收用的信息队列

              信息类型:可规定某个信息类型或所有类型

是否等待一个信息的到达:等待超时而没有信息,需要返回的CL变量要填空格

(如果是数字则为零)且控制返给运行RCVMSG

过程或程序。

在接收后是否从队列中取消信息:如果不取消,则它成为队列中的老信息,仅能

  用信息引用键再被接收,但如果用CHGMSGQ

  命令把它变为新信息,就不用信息引用键接收

  它,但已经回答的查询信息不能置为新信息(详

  细信息请看8.2.6

       要转换的CCSID:规定信息正文返回的CCSID

              一组CL变量可以在其中放下列信息(每一个相应于一个变量):

                     信息在队列中的引用键(4个字符长的变量)

信息(可变长的字符变量)

信息长度,包括替换变量数据的长度(十进变量,5位小数)

联机帮助信息(可变为的字符变量)

联机帮助信息的长度,包括替换变量数据的长度(十进变量,5位小数)

信息发送者提供的替换变量的信息数据(可变长字符变量)

信息数据的长度(十进变量,5位小数)

信息标识(7位字符变量)

严重码(十进变量,2位长)

信息的发送者(最小为80个字符的变量)

接收信息的类型(2位长的字符变量)

接收信息的报警选项(9位长的字符变量)

包括预先定义信息的信息文件(10位长的字符变量)

用来接收信息的信息文件所在的库名(10位长的字符变量)

用来发送信息的信息文件所在的库名(10位长的字符变量)

与取代返回数据相关的信息数据的CCSID5位长十进变量)

     由信息和信息帮助参数返回的与正文有关的正文CCSID5位长十进变

               量)

 

    RCVMSG MSGQ(QGPL/INVN) MSGTYPE(*ANY) MSG(&MSG)

 

       接收的信息放在变量&MSG中,&ANYMSGTYPE参数的缺省值。

       在处理非CL语言写的ILE过程的调用堆栈入口信息队列时,可能接收到一个没有被处理的例处信息(逃逸或通知信息)。RCVMSG可用来接收一个信息并告诉系统已经处理了例外情况。这种情况也可用RMV键字控制,如果对此键字规定*NO,则处理例外且信息做为老信息放在信息队列中,如果规定*KEEPEXCP,则不处理例外且信息做为新信息留在信息队列中,如规定*YES,则处理例外且信息从信息队列中取消。

       也可用RTNTYPE键字来确定接收的信息是否为例外信息。如果是,怎么样处理它。

 

8.2.4.1  请求信息

       接收到的请求信息是CL过程或程序处理CL命令的一种方法。例如,过程或程序从显示工作站得到输入,然后处理程序分析和操作的结果信息。通常,是从作业的外部信息队列(*EXT)接收请求信息的,接收到的请求是从输入流中读到的,对交互作业,接收到的请求是显示工作站用户在命令入口显示中输入的内容。例如,CL命令是由IBM支持的CL处理接收到的请求。

       你的过程或程序必须在请求信息中定义数据的语法。请求的中断及错误诊断,在分析请求或运行请求时,可检查任何错误,做为结果,会有信息送往过程或程序的调用信息队列中。过程或程序处理这些信息然后接收下一个请求信息,这样,就定义了一个请求处理的循环:接收请求信息,分析请求及运行,显示结果信息,然后接收下一个请求。如果在批作业中没有多个要接收的请求信息,则有逃逸信息送给过程或程序来指出这点。

       一个作业的多个OPM程序或ILE过程能接收请求信息来处理。由较近程序调用接收的请求要嵌套在更高层程序调用之中,每个嵌套层的请求处理循环都互相独立。在ILE程序中,多个过程都能接收请求信息,如果多个过程处理请求而不是在同一ILE程序中发生嵌套,则嵌套层次保持独立。

       下图解释由QCMD怎样处理请求信息。

       PIC10

 

 

 

       程序堆栈                    作业信息队列

 

  命令入口显示

‥命令请求1

‥诊断信息1

   .

   .

   .

  诊断信息n

  逃逸信息

Program QCMD

   .

Œ .

   .

RCVMSG MSGTYYPE(*RQS)

        PGMQ(*EXT)

   .

   .

   .

CALL CPP

PROGRAM CPP 

   .

   .

   .

SNDPGMMSG TOPGMQ(*PRV)

    MSGTYPE(*DIAG)

   .

   .

   .

SNDPGMMSG TOPGMQ(*PRV)

    MSGTYPE(*ESCAPE)

                                                          Ž

*EXT

 

QCMD程序信息队列

命令请求1

诊断信息1

   .

   .

   .

诊断信息n

逃逸信息

 

CPP

 

 

 

 

 


                                                                            

 


                                                               作业日志

 

                                                                   

 


                          

      

 

 

 

 


解释如下:

1CL处理程序QCMD*EXT接收一个请求信息。

2、如果在*EXT中没有信息,显示命令入口显示,用户在显示中进入命令,它做为一

   个请求信息放在*EXT中。

3、命令送到QCMD调用信息队列的未尾,且从这儿传送给QCMD

4、分析命令,调用命令处理程序(CPP)。

5CPP发送诊断信息给QCMD的调用信息队列。

6CPP发送逃逸信息给QCMD的调用信息队列,此信息通知QCMD诊断信息在队列

   中,QCMD将结束处理CPP

7QCMD将监控请求检测(CPF9901)或功能检测(CPF9999)信息,然后QCMD

将接收下一个请求信息。如果接收到CPF9901 CPF999,则运行RCLRSC命令,  

它也监控CPF1907(结束请求)和CPF2415(用户在命令入口显示按F3F12键)。

8、由于处理了请求信息,QCMD的调用信息队列的所有信息都写在命令入口显示上,

   提示用户输入另外的命令。

9、前面的请求信息和相关信息都写到作业日志中,详细情况请看8.7

 

8.2.4.2  写请求处理的过程或程序

       在一个程序中写一个CL过程管理请求处理有很多优点。它们是:

              处理请求信息,如8.2.4.1所述。

              允许使用结束请求命令(ENDRQS),可以从系统请求菜单中使用,或做为断开

作业功能的一部分。

       允许过滤产生的信息。

要做为请求处理的过程或程序,必须包括SNDPGMMSGRCVMSG命令。下面的命令能使一个过程或程序成为请求处理器。

 

     SNDPGMMSG  MSG('Request Message') TOPGMQ(*EXT) MSGTYPE(*RQS)

     RCVMSG     PGMQ(*EXT) MSGTYPE(*RQS) RMV(*NO)

 

    PGMQ *EXT中接收信息,在接收到请求信息时,它移到规定RCVMSG命令程序的调用信息队列中,这样,在信息移出时,必须使用正确的调用信息队列。

       如果是由信息引用键(MRK)移动的请求信息,应该从RCVMSG命令的KEYVAR键字中得到标志,而不是从SNDPGMMSG中得到,(在信息到达移出后,信息引用键会改变)。如果信息请求是从调用信息队列移出的,必须在RCVMSG命令中规定RMV*NO),这是因为过程或程序不是一个请求处理器。

       在接收到信息请求时,标识过程或程序是用请求菜单中的选项2(结束请求)来结束。请求处理器的过程或程序要包括一个对CPF1907的监控,由于结束请求功能会对请求处理器发送这个信息,所以监控它是很必要的。

       在过程结束(正常或非正常)或运行RMVMSG命令从请求处理器的调用信息队列取消所有信息请求之前,过程或程序都要保留请求处理器。下面的命令从信息队列移出所有的信息请求,也结束请求处理:

 

              RMVMSG  CLEAR(*ALL)

 

       调用QCAPCMD API和规定信息收回键来使AS/400命令分析器来处理来自AS/400命令的信息请求,在接收信息请求时会得到一个信息收回键,QCAPCMD会更新作业日志中的信息请求且加上提供的新值,QCAPCMD也隐藏一些参数值,例如口令等。在下面两个条件之一存在时,系统不修改作业日志中的信息请求:

              QCMDEXCQCAEXEC

              QCAPCMD提供信息回收键动作失败。

 

8.2.4.3  确定是否有请求处理器

       要确定一个作业是否有请求处理器,可显示作业调用堆栈,在DSPJOB中选11或用WRKJOB命令,或在WRKACTJOB中选10。如果在显示作业堆栈的request  level列有数字,与此数相关的过程或程序就是一个请求处理器。在下例中,QCMDQTEVIREF都是请求处理器。

 

 

                                                                                     

                               Display Call Stack                                   

                                                                System:   S0000000  

    Job:   WS31           User:   QSECOFR        Number:   000173                   

                                                                                    

    Type options, press Enter.                                                      

      5=Display details                                                              

                                                                                    

         Request   Program or                                                       

    Opt   Level    Procedure      Library        Statement      Instruction         

                   QCMD           QSYS                             01DC             

           1       QCMD           QSYS                             016B             

                   QTECADTR       QSYS                             0001             

           2       QTEVIREF       QSYS                             02BA             

                                                                                    

                                                                                     

                                                                                    

                                                                                    

                                                                            Bottom  

                                                                                    

    F3=Exit   F10=Update stack   F11=Display activation group   F12=Cancel          

    F17=Top   F18=Bottom                                                             

                                                                                    

                                                                                    

  

 

       下面是请求处理过程的例子:

 

     PGM

         SNDPGMMSG  MSG('Request Message') TOPGMQ(*EXT) MSGTYPE(*RQS)

         RCVMSG     PGMQ(*EXT) MSGTYPE(*RQS) RMV(*NO)

           .

           .

           .

         CALL   PGM(PGMONE)

         MONMSG MSGID(CPF1907)

           .

           .

           .

         RMVMSG CLEAR(*ALL)

         CALL   PGM(PGMTWO)

           .

           .

           .

     ENDPGM

 

       过程中的头两个命令使它成为请求处理器,在运行RMVMSG命令后才取消请求处理器,在调用程序PGMONE后放一个MONMSG命令,这是因为可能从PGMONE往请求处理器送一个结束请求。如果没有监控,那么对结束请求会产生一个功能检测。在调用PGMTWO后没有信息监控,这是因为RMVMSG结束了请求处理。如果在没有请求处理过程或没有调用程序时试图做结束请求,会有错误信息且不做结束操作。

       注:在样板程序中,RCVMSG命令使用必须的最少的参数成为一个请求处理器,你需要说明只想接收一个信息请求而不想取消它,也要标识一个特别的调用队列,从它取出信息请求。如果必要,可以增加其它参数。

 

8.2.5 CL过程中回收信息

       可用RTVMSG命令从信息文件中回收信息正文放在一个变量中,RTVMSG对预先定义的信息描述操作,可以规定信息标识和信息文件名,以及下列内容:

       要转换的CCSID:规定信息正文和数据返回用的CCSID

       信息数据字段:替换变量的信息数据

       信息数据CCSID:提供的信息数据要考虑的CCSID

       一组CL变量,可以放置下列信息:

信息(变长的字符变量)

信息长度,包括替换变量数据的长度(5位小数的十进变量)

信息联机帮助(变长的字符变量)

信息联机帮助的长度,包括替换变量数据的长度(5位小数的十进变量)

严重码(2位小数的十进变量)

       报警选项(9位的字符变量)

服务活动日志中的问题记录(一位的字符变量)

信息数据CCSID,它与返回数据位置有关(5位小数的十进变量)

正文数据CCSID,定与由信息和信息帮助参数返回的正文有关

       例如,下列命令把信息USR1001的信息描述加到信息文件USRMSG中:

 

     ADDMSGD   MSGID(USR1001) MSGF(QGPL/USRMSG) +

               MSG('File &1 not found in library &2') +

               SECLVL('Change file name or library name') +

               SEV(40) FMT((*CHAR 10) (*CHAR 10))

 

       下列命令把回收信息USR1001的文件名INVENT放在10个字符的变量&FILE中,把库名放在10个字符的变量&LIB中:

 

     DCL &FILE TYPE(*CHAR) LEN(10) VALUE(INVENT)

     DCL &LIB TYPE(*CHAR) LEN(10) VALUE(QGPL)

     DCL &A TYPE(*CHAR) LEN(20)

     DCL &MSG TYPE(*CHAR) LEN(50)

     CHGVAR VAR(&A) VALUE(&FILE||&LIB)

     RTVMSG   MSGID(USR1001) MSGF(QGPL/USRMSG) +

              MSGDTA(&A) MSG(&MSG)

 

&1&2的数据放在过程变量&A中,在&FILE&LIB中的值已连接起来。在&MSG中放下列信息:

 

        File INVENT not found in library QGPL

 

如果在RTVMSG中没用MSGDCA参数,则&MSG中的信息为:

 

        File not found in library

 

在把信息放到&MSG中后,可以做以下事情:

       SNDPGMMSG发送信息

              用变量做DDS中的信息行正文(38列为M

              使用信息子文件

              打印或显示信息

       注:不能用包括在正文中的变量名来回收信息正文 RTVMSGD用来返回能够发送的信息,要访问用ADDMSGD进入的信息,看QUSRTOOL中的CVTMSGF工具。

 

8.2.6  从信息队列取消信息

       可用下列命令及参数把信息从信息队列取消:

              RMVMSGCLRMSGQRCVMSG中的RMV参数,SNDRPY中的RMV参数。

       也可在显示信息屏中用取消功能键,或在处理信息队列显示中用清理信息队列选项,可以取消的信息是:

              一个信息

              所有信息

              没回答的例外信息

              所有旧信息

              所有新信息

              从所有非活动程序中来的所有信息

       在用RMVMSG取消一个信息或用RCVMSG取消一个旧信息时,要规定要取消信息的信息引用键。

       注:信息引用键也可用来接收信息或回答信息。

       如果取消的是没有回答的查询信息,要给信息发送者送出缺省回答,然后取消它们。如果取消的是已回答的查询信息,则查询信息和回答信息都取消。

       如果从用户的作业信息队列中取消所有非活动过程或程序的所有信息,要在RMVMSG命令中规定PGMQ(*ALLINACT)CLEAR(*ALL),如果要在取消所有非活动信息前打印作业日志,要用DSPJBOLOG命令,规定QUTPUT(*PRINT)

       在处理ILE过程的所有调用信息队列时,在运行RMVMSG命令时队列中可能有没处理的例外信息,可用命令中的RMVEXCP键字来控制对这类信息采取动作。如果规定RMVEXCP(*YES),则RMVMSG处理例外情况且取消信息。如果规定*NO,就不取消信息,结果是不处理例外。下列命令从用户信息队列JONES中取消一个信息,信息引用键是在变量MRKEY中:

 

     DCL &MRKEY TYPE(*CHAR) LEN(4)

     RCVMSG MSGQ(JONES) RMV(*NO) KEYVAR(&MRKEY)

     RMVMSG MSGQ(JONES) MSGKEY(&MRKEY)

 

       下列命令从信息队列取消所有信息:

 

        RMVMSG  CLEAR(*ALL)

 

注:在用户信息队列或工作站信息队列中每种类型发送的信息的最大数为65535,即

在队列中可有65535个诊断信息,65535个完成信息等等,对所有调用信息队列或*EXT,每类的最大数没有限制。

 

8.3  CL过程或程序中监控信息

       可在过程或程序中用命令,或在另外的过程或程序中的命令来监控送到过程或程序中的逃逸、通知和状态信息。MONMSG命令监控在命令中规定条件的送往调用信息队列中的信息,如果条件存在,则运行MONMSG中规定的命令。MONMSG的功能如下:

       逃逸信息:它告诉过程或程序有错误条件发生,强行结束发送者。要监控这类信息,

  你要采取适当的动作或清理及结束过程或程序。

       状态或通知信息:它告诉过程或程序是一个正常结束的条件,它不至于结束发送者。

要监控这类信息,过程或程序可以检查这些条件,也能使功能不继

续进行。

       可用二级MONMSG命令监控信息:

       过程级:在CL过程或程序的DCL命令后立即用MONMSG命令来监控逃逸、通知或

状态信息,这叫做过程级的MONMSG命令,在一个过程或OPM程序中可

以使用至多100个这样的MONMSG命令,这就让你对所有命令用同一种方

法来处理相同的逃逸信息,EXEC参数是可选的,且在EXEC中只能规定GOTO

命令。

 

 


                         从命令来

                                           的信息

4

1

        消息                           逃逸

        诊断                           状态

完成MONMSG中的EXEC

        完成                           通知         在命令       YES

                          信息类型             中有MONMSG

                                                 

2

 

 


完成MONMSG中的EXEC

                                                  除功能检查     YES

                                                              外的程序级

                                                  MONMSG

 

 


继续处理命令

                                状态通知

                                                   信息类型

 

完成MONMSG中的EXEC

 

 


3

                                                   功能检查

                                                 的程序级监控

 

 


                                               CPA0701信息

                                             交互作业:工作站操作员

                                             批作业:系统操作员

 

 


                              回答                                取消、转储

                                                操作员给的回答

 

 


                                                        忽略

再重复命令

继续执行下一条命令

程序结束发送给

调用者功能检查

 

 

 

 

 


解释:

1.MONMSG、检查消息、诊断和完成信息。

2.CPF0000的程序级MONMSG由逃逸、状态、通知信息激活。

3.CPF9999(功能检查)的程序级MONMSG由不是其它命令或程序级监控的逃逸信息激活。在CPF9999送往过程前,原逃逸信息过滤给同一CL程序中的活动过程。如原逃逸信息没被活动的过程处理,则发送CPF9999

4.如果状态信息送往*EXT,就不能监控它。

 

命令级:在CL过程或程序中的命令后立即用MONMSG命令来监控逃逸、通知或状

态信息,这叫命令级的MONMSG命令,可对一个命令使用多至100个命令

MONMSG,这让你可用不同的方法处理不同的逃逸信息。

       要监控这些信息,要在MONMSG命令中用如下格式之一规定信息的一般标识:

       pppmmnn:监控某个信息,例如MCH1211是零做除数的逃逸信息。

pppmm00:监控用某个特许程序码(ppp)开头的由mm规定的数字信息标识。

例如,CPF5100指出所有以CPF51开头的通知、状态和逃逸信息。

              ppp0000:监控信息标识以ppp开头的信息。例如CPF0000指出要监控以CPF

头的所有通知、状态和逃逸信息。

       注:在做系统功能时不要用MONMSG CPF0000,安装、备份、恢复系统时也不

要用它,因为可能会去掉一些重要信息。

CPF9999:监控所有信息标识的功能检测信息,如果对一个错误信息没有监控,

则它成为CPF9999(功能检测)。

       注:一般来说,在送出通知和诊断信息时,控制也转给监控程序。

       除了用信息标识监控逃逸信息外,也能用MONMSG中规定的字符串与信息中的数据进行比较。下面的命令监控MYFILE的逃逸信息CPF5101,文件名做为信息数据发送。

 

     MONMSG MSGID(CPF5101) CMPDTA(MYFILE) EXEC(GOTO EOJ)

 

比较数据可以是28个字符长,比较从信息数据的第一个字段的第一个字符开始,如果它们匹配,则执行EXEC参数中规定的动作。

EXEC参数中规定如何处理逃逸信息,除PGMENDPGMIFELSEDCLDCLFENDDOMONMSG外,其余命令都能在EXEC中规定。在EXEC中可以规定DO命令,此时运行在DO组内的命令。在运行时,控制返回给发送逃逸之后的命令,但如果规定GOTORETURN命令,则控制不返回,如果没规定EXEC,则忽略逃逸,过程继续执行。下面是CHGVAR命令的例子,它监控要做除数的逃逸信息,信息标识为MCH1211

 

     CHGVAR VAR(&A) VALUE(&A / &B)

 

     MONMSG MSGID(MCH1211) EXEC(CHGVAR VAR(&A) VALUE(1))

 

变量&A的值修改为&A除以&B的值。如果&B=0,不能做除法,且送给过程一个逃逸信息,这时,&A的值变为1,(在EXEC参数中规定)。你也可以测试&B的值,仅在它不是零时才做除法。在下例中,程序监控逃逸信息CPF9801(目标没找到),它由CHKOBJ命令产生:

 

               PGM

               CHKOBJ LIB1/PGMA *PGM

               MONMSG MSGID(CPF9801) EXEC(GOTO NOTFOUND)

               CALL LIB1/PGMA

               RETURN

     NOTFOUND: CALL FIX001 /* PGMA Not Found Routine */

               ENDPGM

 

下列CL过程包括二个CALL命令和一个过程级的对CPF0001的监控命令。(如果不能成功地完成CALL命令,则产生逃逸信息)。如果有一个CALL失败,过程送出完成信息且结束。

 

             PGM

             MONMSG MSGID(CPF0001) EXEC(GOTO ERROR)

             CALL PROGA

             CALL PROGB

             RETURN

     ERROR:  SNDPGMMSG MSG('A CALL command failed') MSGTYPE(*COMP)

             ENDPGM

 

如果在MONMSG命令中没有规定EXEC,则忽略任何逃逸信息,如果在除IF以外的命令上发生逃逸信息,过程或程序继续处理下一个不产生逃逸信息的命令,如果在IF命令中发生逃逸信息,过程或程序继续处理IF命令中为假的条件。下例解释不同类型发生逃逸信息时所做的处理:

 

     PGM

     DCL &A TYPE(*DEC) LEN(5 0)

     DCL &B TYPE(*DEC) LEN(5 0)

     MONMSG MSGID(CPF0001 MCH1211)

     CALL PGMA PARM(&A &B)

     IF (&A/&B *EQ 5) THEN(CALL PGMB)

     ELSE CALL PGMC

     CALL PGMD

     ENDPGM

 

根据发生逃逸信息的地方不同,能发生下列情况:

如果在调用PGMA时产生CPF0001,过程重新处理IF命令

如果在IF命令中发生MCH1211IF条件失败,过程处理调用PGMC

如果在调用PGMBPGMC时发生CPF0001,过程调用PGMD

如果在调用PGMD时,发生CPF0001,过程执行ENDPGM,它返回到调用过程

也可由过程或程序中的命令或另外的命令来监控发送的相同逃逸信息,这就需要三个MONMSG命令,一个命令写在需要处理逃逸信息的命令下面,它用在发生逃逸信息的时候,另一个MONMSG跟在最后一个DCL命令后,它能够监控所有其它的命令。

仅在过程或程序需要监控信息时才用MONMSG命令,一个过程中的MONMSG不能被同一程序中的另外过程使用。程序设计参考一书列出CL命令发出的逃逸、通知、状态信息,你也可以列出自己定义的所有信息的表。

 

8.3.1  缺省处理

       多数逃逸信息会送往调用命令、程序或过程的过程中,你可能不想监控所有的信息,只想监控和处理对过程功能有影响的那些信息,系统对你没有监控的任何信息提供了缺省监控及处理。

       缺省处理假定在过程中检测到了错误。如果用调试过程,会有信息送到工作站,然后可以改它,如果没有用调试,系统会做一个信息过滤功能,此功能分为两步:

              移动调用堆栈中逃逸信息开始的一步

              检查看有没有MONMSG监控逃逸

       如果有MONMSG,则停止信息过滤,采取命令中规定的动作,继续进行信息过滤直到遇到另一个MONMSG或遇到一个嵌套组的边界,即逃逸信息不能跨越活动组边界进行过滤。

       如果在有MONMSG命令且有信息提供的过程前遇到活动级边界,则开始功能检测处理,原逃逸例外的动作被认为是完成了,然后发出CPF9999送给原逃逸的目的过程。如果过程有MONMSG做功能检测,则采取命令规定的动作,如果没有MONMSG,则把查询信息送往交互作业的工作站操作员,操作员能用下列之一回答:

              R            重试失败的命令

I            忽略信息,继续处理下一条命令

C           取消过程,对堆栈中下一个过程做过滤功能检测

D                  对失败过程转储者调用堆栈入口,取消过程,对堆栈的下一个过程过滤功能检测。如果给出回答或作业是批作业,这是缺省的动作。

       功能检测不能跨越活动组边界。如果所做回答引起功能检测跨越一个活动组边界,那么会停止做进一步的功能检测,所有到达活动组边界的过程都被取消,逃逸信息CEE9901送往前一个堆栈入口。

       你能监控功能检测的逃逸信息,因此可以做:

              清理及结束过程

              继续处理过程的其它问题

       注:如果没监控的逃逸的信息描述规定了一个缺省动作,在发送功能检测信息之前调用缺省处理程序,当缺省处理程序返回时,开始功能检测处理。

阅读(2180) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~