OPM RPG 中的示例: 检索 HOLD 参数 (异常消息)

此 OPM RPG 程序检索作业描述 (在 "创建作业描述" (CRTJOBD) 或 "更改作业描述" (CHGJOBD) 命令上指定) 的 HOLD 参数的值。 任何错误都将作为异常消息返回。

为了使 RPG 程序 JOBDAPI (此程序名也在此主题集合中的其他示例中使用) 更通用,将向其传递作业描述 (JOBD) 名称和库 (JOBDL) 名称的两个参数,如 (5)中所示。 将针对找到的值发送一条消息。 程序不处理错误。 任何错误都将作为异常消息返回。

注: 通过使用代码示例,您同意 代码许可证和免责声明信息的条款。

     I*****************************************************************
     I*****************************************************************
     I*
     I*Program Name: JOBDAPI
     I*
     I*Language:  OPM RPG
     I*
     I*Descriptive Name:  Job Description
     I*
     I*Description:  This example expects errors to be sent as escape
     I*              messages.
     I*
     I*Header Files Included: QUSEC - Error Code Parameter
     I*                       QWDRJOBD - Retrieve Job Description API
     I*
     I*****************************************************************
     I*****************************************************************
     I*
     I* Error Code Parameter Include for the APIs
     I*
     I/COPY QSYSINC/QRPGSRC,QUSEC
     I*
     I* Retrieve Job Description API Include
     I*
     I/COPY QSYSINC/QRPGSRC,QWDRJOBD          (1)
     I*
     I* Command String Data Structure
     I*
     ICMDSTR      DS
     I I            'SNDMSG MSG(''HOLD -      1  26 CMD1
     I              'value is '
     I                                       27  36 HOLD
     I I            ''') TOUSR(QPGMR)'       37  51 CMD2
     I*
     I* Miscellaneous Data Structure
     I*
     I            DS                                      
     I*                                (2)
     I I            390                   B   1   40RCVLEN 
     I I            'JOBD0100'                5  12 FORMAT 
     I*                (3)
     C*
     C* Beginning of Mainline
     C*
     C* Two parameters are being passed into this program.
     C*
     C           *ENTRY    PLIST   (5)
     C                     PARM           JOBD   10
     C                     PARM           JOBDL  10
     C*
     C* Move the two parameters passed into LFNAM.
     C*
     C           JOBD      CAT  JOBDL     LFNAM  20   (6)
     C* Error code bytes provided is set to 0
     C*
     C                     Z-ADD0         QUSBNB    (4)
     C*                                           
     C* Instead of specifying 'QWCRJOBD', I could have used the
     C* constant QWDBGB that was defined in the QWDRJOBD include.
     C*
     C                     CALL 'QWDRJOBD'
     C                     PARM           QWDBH            Receiver Var.
     C                     PARM           RCVLEN           Length RCVVAR
     C                     PARM           FORMAT           Format Name
     C                     PARM           LFNAM            Qual. Job Desc
     C                     PARM           QUSBN            Error Code
     C*
     C                     MOVELQWDBHN    HOLD
     C*
     C* Let's tell everyone what the hold value was for this jobd.
     C*
     C                     Z-ADD51        LENSTR 155
     C                     CALL 'QCMDEXC'
     C                     PARM           CMDSTR
     C                     PARM           LENSTR
     C*
     C                     SETON                     LR
     C                     RETRN
     C*
     C* End of MAINLINE
     C*

程序声明要使用的变量。 QWDBH 变量的长度为 390 ,如 (2)中所示。

在此示例中,程序将值 JOBD0100 放在格式变量中。 可以将文字用于那些在调用上支持文字的语言,如 (5)中所示。 程序通过并置简单名称和库限定符来生成作业描述 (JOBD) 的限定名,如 (6)中所示。 必须使用 20 个字符的变量,并且简单名称必须以字节 1 开头,以字节 11 中的库限定符开头。 因为使用了 CAT ,所以会出现两个 10 字节变量的简单并置,以便这些名称位于 LFNAM 参数的正确位置。

使用正确的参数列表调用 QWDRJOBD API。 API 使用参数列表并访问指定的作业描述。 API 从内部对象表单中抽取值,并将其置于与 JOBD0100 格式匹配的数据结构中。 然后,该 API 将返回置于变量 QWDBH 中的数据结构,该变量位于 QSYSINC 库中的成员 QWDRJOBD 中。

输出和以下内容相似:
                         Display Messages

                                                      System:   GENSYS90
Queue . . . . . :   QPGMR                   Program . . . . :   *DSPMSG
  Library . . . :     QUSRSYS                 Library . . . :
Severity  . . . :   00                      Delivery  . . . :   *HOLD
Type reply (if required), press Enter.
  From  . . . :   SMITH          07/23/94   10:25:14
  HOLD value is *NO

每次需要单独的字段时,都不需要调用 API ,因为返回的所有字段都符合接收方变量 (RCVLEN) 参数所指示的大小。 可以使用以下调用语句对库 QGPL 中的 QBATCH 作业描述运行程序:

CALL JOBDAPI PARM(QBATCH QGPL)

如果 QGPL 在库列表上,那么可以使用以下调用语句对 QBATCH 作业描述运行程序:

CALL JOBDAPI PARM(QBATCH *LIBL)

可以在您自己的某个作业描述上或在指定了 HOLD (*YES) 的测试作业描述上运行该程序。

OPM RPG 中的示例: 处理错误条件

对于此示例,假定 XYZ 作业描述不存在:

CALL JOBDAPI PARM(XYZ *LIBL)

您可能将接收到查询消息 CPA0701 ,该消息指出发生了未受监视的异常 (CPF9801) ,并提供了几个可能的应答。 此时,您将输入 C 以进行 "取消" 并按 Enter 键。

如果显示了低级别消息,那么您将看到以下内容: CPF9801 (找不到对象) ,后跟查询消息 (CPA0701) ,后跟您的应答。

将错误代码参数指定为零时,将指定异常作为脱离消息发送。 您可以对 RPG 程序进行编码,以便调用上的任何错误都将指示符 01 设置为开启,如 (10)中所示。 这将导致在代码中采用不同的路径。

对于 RPG , CALL 操作指定错误指示符。 根据错误指示符是开启还是关闭,可以处理一组指令。 API 必须接收由值为二进制零的二进制 4 字段组成的错误代码参数,如 (11)中所示。 可从程序状态数据结构访问消息标识。 您将按如下所示定义此属性:


     I* Program status DS ((12))
     IPGMSTS     SDS
     I                                       40  46 MSGIDD

如果要对错误条件执行一些操作,那么必须在 RPG 中测试错误条件:

  • 如果使用错误代码数据结构,请测试可用字节字段。
  • 如果允许发生异常,请测试 CALL 操作 ((10)) 上的错误指示符。

由于必须测试某些条件 (错误消息中的某个错误消息) ,因此在 RPG 中处理错误条件的方式上不存在很大差异。 错误代码数据结构更简单一些 (不使用程序状态数据结构)。 错误代码数据结构的唯一缺点是从作业记录中除去了发生的脱离消息。

以下程序显示了如何针对错误条件进行编码,测试该条件以及在发生该条件时向 QPGMR 消息队列发送消息:


     I*****************************************************************
     I*****************************************************************
     I*
     I*Program Name: JOBDAPI
     I*
     I*Language:  OPM RPG
     I*
     I*Descriptive Name:  Get Job Description
     I*
     I*Description:  This program handles any errors that are
     I*              returned
     I*
     I*Header Files Included: QUSEC - Error Code Parameter
     I*                       QWDRJOBD - Retrieve Job Description API
     I*
     I*****************************************************************
     I*****************************************************************
     I*
     I* Error Code Parameter Include for the APIs
     I*
     I/COPY QSYSINC/QRPGSRC,QUSEC
     I*
     I* Retrieve Job Description API Include
     I*
     I/COPY QSYSINC/QRPGSRC,QWDRJOBD
     I* Program status DS
     IPGMSTS     SDS   (12)
     I                                       40  46 MSGIDD
     I*
     I* Command String Data Structure
     I*
     ICMDSTR      DS
     I I            'SNDMSG MSG(''HOLD -      1  26 CMD1
     I              'value is '
     I                                       27  36 HOLD
     I I            ''') TOUSR(QPGMR)'       37  51 CMD2
     I*
     IMSG3        DS
     I I            'SNDMSG MSG(''No such-    1  35 MSG3A
     I              ' *JOBD exists'') '
     I I            'TOUSR(QPGMR)'           36  47 MSG3B
     I*
     I* Miscellaneous Data Structure
     I*
     I            DS
     I I            390                   B   1   40RCVLEN
     I I            'JOBD0100'                5  12 FORMAT
     C*
     C* Beginning of Mainline
     C*
     C* Two parameters are being passed into this program.
     C*
     C           *ENTRY    PLIST
     C                     PARM           JOBD   10
     C                     PARM           JOBDL  10
     C*
     C* Move the two parameters passed into LFNAM.
     C*
     C           JOBD      CAT  JOBDL     LFNAM  20
     C* Error code bytes provided is set to 0
     C*
     C                     Z-ADD0         QUSBNB (11)
     C*                                              
     C* Instead of specifying 'QWCRJOBD', I could have used the
     C* constant QWDBGB that was defined in the QWDRJOBD include.
     C*                          
     C                     CALL 'QWDRJOBD'             01 (10)
     C                     PARM           QWDBH            Receiver Var.
     C                     PARM           RCVLEN           Length RCVVAR
     C                     PARM           FORMAT           Format Name
     C                     PARM           LFNAM            Qual. Job Desc
     C                     PARM           QUSBN            Error Code
     C   01                EXSR ERROR                      Error Subroutine
     C*
     C  N01                MOVELQWDBHN    HOLD
     C*
     C* Let's tell everyone what the hold value was for this job.
     C*
     C  N01                Z-ADD51        LENSTR 155
     C  N01                CALL 'QCMDEXC'
     C                     PARM           CMDSTR
     C                     PARM           LENSTR
     C*
     C                     SETON                     LR
     C                     RETRN
     C*
     C* End of MAINLINE
     C*
     C* Subroutine to handle errors received on the CALL
     C*
     C           ERROR     BEGSR
     C           MSGIDD    IFEQ 'CPF9801'
     C*
     C* Process errors returned from the API.
     C*
     C                     Z-ADD47        LENSTR 155
     C                     CALL 'QCMDEXC'
     C                     PARM           MSG3
     C                     PARM           LENSTR
     C                     END
     C                     ENDSR

如果发生 CPF9801 异常,那么程序会将消息发送到 QPGMR 消息队列,如以下屏幕中所示:
                         Display Messages

                                                      System:   GENSYS90
Queue . . . . . :   QPGMR                   Program . . . . :   *DSPMSG
  Library . . . :     QUSRSYS                 Library . . . :
Severity  . . . :   00                      Delivery  . . . :   *HOLD
Library . . . :
Type reply (if required), press Enter. 
  From  . . . :   SMITH          07/25/94   11:10:12
  No such *JOBD exists

如果发生另一个异常 (例如,库名无效) ,那么您不会接收到由于错误子例程当前的编码方式而发生错误的指示。

此外,您可以使用消息处理 API 来接收发送到程序消息队列的消息。

如果指定有效的作业描述但使用诸如 *ALLUSR 之类的库限定符,那么对 API 的调用将失败。 必需参数组的描述不支持值 *ALLUSR。