IBM Operational Decision Manager メモ - (6) z/OS上でのルール呼び出し

# はじめに
先の記事でz/OS上でルール実行できる環境まで整いました。
ここでは、ルールの開発をしてzRESへのデプロイを行いそれをz/OS上のCOBOLアプリケーションから呼び出す、という一連の流れをチュートリアルをベースに見ていきます。

## 関連記事

[IBM Operational Decision Manager メモ - (1) 概要、Linuxへのインストール](https://qiita.com/tomotagwork/items/2bdcc13cc5a896b6a3a1)
[IBM Operational Decision Manager メモ - (2) ルール開発から実行までの流れ](https://qiita.com/tomotagwork/items/446975617acfdb0eda5f)
[IBM Operational Decision Manager メモ - (3) Decision Center利用の流れ](https://qiita.com/tomotagwork/items/5e8b1efbe0072cf5af6b)
[IBM Operational Decision Manager メモ - (4) Linux上での環境セットアップ](https://qiita.com/tomotagwork/items/dd9dc49ed6a67ff876bb)
[IBM Operational Decision Manager メモ - (5) z/OS上での環境セットアップ](https://qiita.com/tomotagwork/items/73ceaf84fb89b5d2af7b)
[IBM Operational Decision Manager メモ - (6) z/OS上でのルール呼び出し](https://qiita.com/tomotagwork/items/577895e05f9ec5e40c06)
[IBM Operational Decision Manager メモ - (7) zODM環境補足](https://qiita.com/tomotagwork/items/fdda485b28c55edae6e6)

# 全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/34d09a54-be50-0e1a-7baa-48bf6308636a.png)

COBOLからODM管理のルールを呼び出す場合に、1つ肝となるのは入出力データ構造をどのように作るかという点です。このデータ構造はCOBOL側はCOPYBOOK、ODM側はXOM/BOM として実装する必要があります。これらを作成するアプローチとしては主に2つのパターンがあります。

(1) XOM/BOM をベースにCOPYBOOKを作成する
(2) COPYBOOKをベースにXOM/BOMを作成する

(1)は例えば既にODM上に抽出されたルールが稼働していてJavaアプリから利用しているものがあり、それをCOBOLからも利用したいというケースが該当すると思います。
(2)は既存のCOBOLアプリからルールを抽出する場合に、その抽出したルールとの入出力データ構造をまずCOPYBOOKで定義したいというケースが該当すると思います。

ここでは(1)のアプローチで試してみます。

# チュートリアル実施
以下のチュートリアルを実施していきます。
[Tutorial: Sharing a BOM between Java and COBOL applications](https://www.ibm.com/docs/en/odm/8.11.0?topic=tutorials-tutorial-sharing-bom-between-java-cobol-applications)

## Task 1: Importing an existing rule project

しばらくはWindows上のRule Designer(eclipse)上での作業になります。
まずサンプルとして用意されているルール・プロジェクトをインポートします。
Sample Consoleを開いてRule Designer - Tutorials - Cobol - Sharing a BOM between Java and COBOL applications - start 以下のImport projectsをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f362da85-a4a4-7344-7cf0-3a8bfc83d52e.png)

SharingZMiniloanというプロジェクトがインポートされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/67b34ef6-291c-f53d-3981-72668bfec9a8.png)

※ここでは既に出来合いのルールをそのまま使うことになります。ルール開発そのものについては別の記事もご参照ください。

## Task 2: Configuring the BOM for COBOL copybook generation

既にルールが作成されていますので、そのルールで使用されるBOMも定義されています。ここではBOMをベースにしてルール呼び出しで使用するCOBOL COPYBOOKを生成していきます。

プロジェクトを右クリックしてPropertiesを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/6b191881-9cc6-44be-df14-f09cfa4418e3.png)

左側のメニューからCOBOL Management を選択し、Addをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/455ce95e-91e3-3e84-31ed-3ed076e204b1.png)

modelをクリックしてOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d087e3ec-f2fb-23bb-f4b2-2d2987357319.png)

このプロジェクトで定義されているBOMに関して、Javaの型をCOBOLにどのようにマッピングするかの候補が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/0de57407-4956-d330-8f97-c0d512300200.png)

JavaのString型はCOBOLのPIC Xにマッピングされますがデフォルトで長さが20に設定されるようです。またJavaのList型はCOBOLのOCCURSにマッピングされますがこちらはデフォルトで10回に設定されるようです。このようなデフォルトのマッピング情報で不都合がある場合は、ここで変更が可能です。
ここではmessagesのPIC Xの長さを60に変更してFinishをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d839aa83-d4e4-f1ef-0869-435a30a5f142.png)

前の画面に戻るので、Manageをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/57e230ec-e578-4f60-d53b-729811547dbd.png)

Browseをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a353311d-95e3-3100-6034-e232298a1a4a.png)

生成されるCOPYBOOKの配置先を選択します。ここではSharingZMiniloan-execution以下のcopyを選択し、ファイル名にはHBRLDAT2.cpyを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/aad14f07-fe36-8553-658b-f5878634d825.png)

前の画面に戻るのでOKをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/d0ec52a9-388d-b09c-d9d3-1e0ff6dacc9a.png)

Add Top-Level Objectをクリック (ここで、生成されるCOPYBOOKに追加する構造体を選択ます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/65641f15-d92e-4f99-879d-00843d99cdc5.png)

Borrowerを選択してOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/2b98c7c8-882b-a699-2c58-2fe73de8f386.png)

同様に、Top-Level ObjectとしてLoanも追加します。

以下のようにBorrower, LoanがTop-Level Objectに追加されたら、Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ac1a87ab-1be6-f339-6f42-1d4f421d2363.png)

生成されるCOPYBOOK のプレビュー画面が表示されるので、内容を確認してFinishをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/4d5fed38-1517-7541-48c2-d5665c8baf38.png)

前の画面に戻るので、Apply and Close をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9404d4bf-7fe7-72b1-4cac-299521c8a504.png)

COPYBOOKが生成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/7a003886-1a1c-cf84-d5f2-aed60dd271ef.png)

## Task 3: Creating a deployment configuration
zRESにデプロイするための設定を行っていきます。
Decision Service MapからCreate deployment configurationをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/17297c60-4a9e-0791-30fa-9d76aab976f6.png)

フォルダと名前を選択してFinish
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1256270b-4d3e-e9d0-4b16-e465ab333e05.png)

Deploymentのエディターが開くのでDecision Operatinos以下のInclude decision operationsのリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/b2483d1c-32e2-8709-5aab-fa22b5960803.png)

Decision OperationsタブでConfigured Decision Operations以下の「+」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/9713d2fd-e3ff-10cf-a50d-0d90d6c25775.png)

decision operationとして SharingZMiniloanOperationを選択してFinish
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a7e9ef82-6ee5-a9bf-daea-c7b4702e07f5.png)

デプロイ対象のDecision Operationが選択されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/03a738ff-9de3-7783-3ca9-48fd4d4a7520.png)

## Task 4: Deploying the decision service
zRESにルールをデプロイしていきます。

Deploymentのエディター - Decision Operaiontsタブで、Ruleset Version Policy欄でIncrement minor version numbersが選択されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1b183c88-bb0d-cf10-dc0e-16fe228f6e94.png)

OverviewタブでTarget Servers欄のDefine target serversのリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/de43105f-c95e-4cfb-0397-8e0f810ccc5b.png)

「+」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/246897c4-60cd-e530-74ac-82dda7e4a768.png)

Create Rule Execution Server connectionを選択してNext
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f3a067c9-9bf7-b931-393f-267a969fa6de.png)

zRESへのアクセス情報を設定してTest Connectionをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/57810ae1-225b-a735-54d6-e648f1bbf2c5.png)

テスト接続が成功することを確認してFinish
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/99891c78-5e34-dbc2-1bf5-1878a7cdd9df.png)

Deploy先のzRES情報が登録されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/3b8879b4-c390-ffa2-a1e2-ef9ee06ace40.png)

Overviewタブに戻って、Proceed to RuleApp deploymentのリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/a42d94fa-1c56-ef3c-711c-29728cc497f9.png)

対象のOperationとターゲットを確認してNext
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/f63186a1-e46f-7190-7ac3-6d25f1d6383b.png)

zRESの認証情報確認してNext
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1138a226-0976-417f-245b-2b29cbdff0cf.png)

内容確認してFinish
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/ba3255ff-40d5-acd2-65ea-b6e5d7f6f66c.png)

Deploy結果が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/c92fc174-ae59-f1c4-577a-b5d696166856.png)

念のためブラウザからRESコンソールに接続し、エクスプローラータブを確認してみます。
以下のように、SharingZMiniloanがリストされていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/1c7c9aae-cb9d-9b99-e2f2-5b915c332973.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/72b835a7-7db6-2731-1da9-c40a13945b86.png)

## Task 5: Building your COBOL application

ルールのデプロイと、COBOLからルール呼び出しに使用するCOPYBOOKの生成ができたので、それを元に呼び出し元COBOLソースを作って動かしていきます。
COBOLのソースはサンプルが提供されているのでそれをそのまま使います。

Windowsにサンプルインストールすると、`<Inst_Dir>\ODM8110\studio\tutorials\cobol\bomstartresz\answer\SharingZMiniloan-exucution\cobol\HBRMTUT2.COBOL`にルール呼び出しを行うCOBOLバッチのサンプルが提供されます。

<details><summary><font color="blue">参考: ルール呼び出しを行うCOBOLバッチのソース</font></summary><div>

```cobol:HBRMTUT2.COBOL
      * 
      * Licensed Materials - Property of IBM
      * 5655-Y31
      * Copyright IBM Corp. 2011, 2021. All Rights Reserved.
      *
      * U.S. Government Users Restricted Rights:
      * Use, duplication or disclosure restricted by GSA ADP Schedule
      * Contract with IBM Corp.
      * 

       IDENTIFICATION DIVISION.
       PROGRAM-ID. "HBRMTUT2".

       ENVIRONMENT DIVISION.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
           COPY HBRLDAT2.
       01 WS-REASON-CODES.
           COPY HBRC.
           COPY HBRWS.

       01 WS-MESSAGE-IDX      PIC 9(2).
       01 WS-MAX-LEN          PIC 9(18).

       PROCEDURE DIVISION.
       
       MAIN SECTION.
      * Get connection to rule execution server
           CALL 'HBRCONN' USING HBRA-CONN-AREA
           IF HBRA-CONN-COMPLETION-CODE EQUAL TO HBR-CC-OK THEN
               DISPLAY 'connect zRules successful'
           ELSE 
               IF HBRA-CONN-COMPLETION-CODE EQUAL TO HBR-CC-WARNING THEN
                   DISPLAY "Warning while setting up zRules connection"
                   DISPLAY "CC code " HBRA-CONN-COMPLETION-CODE
                   DISPLAY "RC code " HBRA-CONN-REASON-CODE
                   DISPLAY "Message " HBRA-RESPONSE-MESSAGE
               ELSE
                   DISPLAY "connect zRules failed"
                   DISPLAY "CC code " HBRA-CONN-COMPLETION-CODE
                   DISPLAY "RC code " HBRA-CONN-REASON-CODE
                   DISPLAY "Message " HBRA-RESPONSE-MESSAGE
                   PERFORM HANDLE-ERRORS
               END-IF
           END-IF
 
      * Init ruleset parameter data
           MOVE 'John'             TO name
           MOVE 300                TO creditScore
           MOVE 100000             TO yearlyIncome
           MOVE 70                 TO age

           MOVE 35000              TO amount
           MOVE 10                 TO yearlyInterestRate
           MOVE 300                TO yearlyRepayment
           MOVE '20131231'         TO effectDate
           MOVE 'T'                TO approved
           MOVE 0                  TO messages-Num

      * Move ruleset parameters to table HBRA-RA-PARMETERS

           MOVE ZERO               TO HBRA-CONN-RETURN-CODES
           MOVE LOW-VALUES         TO HBRA-RA-PARMETERS
           MOVE "/SharingZMiniloanApp/SharingZMiniloan"
                                   TO HBRA-CONN-RULEAPP-PATH
      * Parameter Borrower
           MOVE LOW-VALUES         TO HBRA-RA-PARMETERS.
           MOVE 'borrower'         TO HBRA-RA-PARAMETER-NAME(1)
           MOVE LENGTH OF Borrower TO HBRA-RA-DATA-LENGTH(1)
           SET HBRA-RA-DATA-ADDRESS(1)
                                   TO ADDRESS OF Borrower
      * Parameter Loan
           MOVE 'loan'             TO HBRA-RA-PARAMETER-NAME(2)
           MOVE LENGTH OF Loan     TO HBRA-RA-DATA-LENGTH(2)
           SET HBRA-RA-DATA-ADDRESS(2)
                                   TO ADDRESS OF Loan

      * Invoke rule execution server
           CALL 'HBRRULE' USING HBRA-CONN-AREA
      * If there has been a failiure then display this, but continue 
      * because we will need to disconnect.
           IF HBRA-CONN-COMPLETION-CODE IS GREATER THAN 
                            HBR-CC-WARNING THEN
               DISPLAY "invoke zRules failed"
               DISPLAY "CC code " HBRA-CONN-COMPLETION-CODE
               DISPLAY "RC code " HBRA-CONN-REASON-CODE
               DISPLAY "Message " HBRA-RESPONSE-MESSAGE
           ELSE
               IF HBRA-CONN-COMPLETION-CODE EQUAL TO HBR-CC-OK THEN
                   DISPLAY 'invoke zRules successful'
               ELSE
                   DISPLAY "Warning on invoking zRules"
                   DISPLAY "CC code " HBRA-CONN-COMPLETION-CODE
                   DISPLAY "RC code " HBRA-CONN-REASON-CODE
                   DISPLAY "Message " HBRA-RESPONSE-MESSAGE               
               END-IF
      * Display result
               DISPLAY "********** EXECUTION RESULT *********"
               DISPLAY "Borrower Name : " name
               DISPLAY "Loan Approved?: " approved
               IF approved = "F"
                  DISPLAY "Reject messages:"
                  PERFORM VARYING WS-MESSAGE-IDX FROM 1 BY 1
                                UNTIL WS-MESSAGE-IDX > messages-Num
                     DISPLAY messages (WS-MESSAGE-IDX)
                  END-PERFORM
               END-IF
               DISPLAY "**************************************"               
           END-IF

      * Get disconnect to rule execution server
           CALL 'HBRDISC' USING HBRA-CONN-AREA
           IF HBRA-CONN-COMPLETION-CODE EQUAL TO HBR-CC-OK THEN
               DISPLAY 'Disconnected zRules successful'
           ELSE 
               IF HBRA-CONN-COMPLETION-CODE EQUAL TO HBR-CC-WARNING THEN
                   DISPLAY "Warning while disconnecting from zRules"
                   DISPLAY "CC code " HBRA-CONN-COMPLETION-CODE
                   DISPLAY "RC code " HBRA-CONN-REASON-CODE
                   DISPLAY "Message " HBRA-RESPONSE-MESSAGE
               ELSE
                   DISPLAY "Disconnect zRules failed"
                   DISPLAY "CC code " HBRA-CONN-COMPLETION-CODE
                   DISPLAY "RC code " HBRA-CONN-REASON-CODE
                   DISPLAY "Message " HBRA-RESPONSE-MESSAGE
                   PERFORM HANDLE-ERRORS
               END-IF
           END-IF.
       MAIN-END.
           STOP RUN.
       HANDLE-ERRORS SECTION.
           DISPLAY "Errors occurred. Unable to continue."
           STOP RUN.
       HANDLE-ERRORS-END.
           EXIT.               
```

</div></details>

<details><summary><font color="blue">参考: ソース解説</font></summary><div>

簡単にソースの解説をしておきます。

呼び出したいルールのBOMから生成したCOPYBOOK(HBRLDATA2)、および、ODMが提供する各種制御用変数が定義されたCOPYBOOK(HBRC, HBRWS)を取り込みます。

```
...
       WORKING-STORAGE SECTION.
           COPY HBRLDAT2.
       01 WS-REASON-CODES.
           COPY HBRC.
           COPY HBRWS.
...
```

zRESとの接続を確立します。

```
...
      * Get connection to rule execution server
           CALL 'HBRCONN' USING HBRA-CONN-AREA
...
```

ルール呼び出しの際に受け渡したい値の設定をします。

```
...
      * Init ruleset parameter data
           MOVE 'John'             TO name
           MOVE 300                TO creditScore
           MOVE 100000             TO yearlyIncome
           MOVE 70                 TO age

           MOVE 35000              TO amount
           MOVE 10                 TO yearlyInterestRate
           MOVE 300                TO yearlyRepayment
           MOVE '20131231'         TO effectDate
           MOVE 'T'                TO approved
           MOVE 0                  TO messages-Num
...
```

呼び出すルールセットのパスなどを設定します。

```
...
      * Move ruleset parameters to table HBRA-RA-PARMETERS

           MOVE ZERO               TO HBRA-CONN-RETURN-CODES
           MOVE LOW-VALUES         TO HBRA-RA-PARMETERS
           MOVE "/SharingZMiniloanApp/SharingZMiniloan"
                                   TO HBRA-CONN-RULEAPP-PATH
...
```

先に値をセットした構造体をルールセット・パラメーターとしてセットします。


```
...
      * Parameter Borrower
           MOVE LOW-VALUES         TO HBRA-RA-PARMETERS.
           MOVE 'borrower'         TO HBRA-RA-PARAMETER-NAME(1)
           MOVE LENGTH OF Borrower TO HBRA-RA-DATA-LENGTH(1)
           SET HBRA-RA-DATA-ADDRESS(1)
                                   TO ADDRESS OF Borrower
      * Parameter Loan
           MOVE 'loan'             TO HBRA-RA-PARAMETER-NAME(2)
           MOVE LENGTH OF Loan     TO HBRA-RA-DATA-LENGTH(2)
           SET HBRA-RA-DATA-ADDRESS(2)
                                   TO ADDRESS OF Loan
...
```

実際のルール呼び出しを行います。

```
...
      * Invoke rule execution server
           CALL 'HBRRULE' USING HBRA-CONN-AREA
...
```

結果を出力します。

```
...
      * Display result
               DISPLAY "********** EXECUTION RESULT *********"
               DISPLAY "Borrower Name : " name
               DISPLAY "Loan Approved?: " approved
               IF approved = "F"
                  DISPLAY "Reject messages:"
                  PERFORM VARYING WS-MESSAGE-IDX FROM 1 BY 1
                                UNTIL WS-MESSAGE-IDX > messages-Num
                     DISPLAY messages (WS-MESSAGE-IDX)
                  END-PERFORM
               END-IF
               DISPLAY "**************************************"  
...
```

zRESから切断します。

```
...
      * Get disconnect to rule execution server
           CALL 'HBRDISC' USING HBRA-CONN-AREA
...
```

</div></details>

## Task 6: Executing the COBOL application

上のCOBOLバッチを動かしてみます。
[Task 6: Executing the COBOL application](https://www.ibm.com/docs/en/odm/8.11.0?topic=applications-task-6-executing-cobol-application)
ここの手順だと、実行モジュールとして提供されているCOBOLバッチを動かすようになっていますが、せっかくなのでソースをコンパイルするところからやりたいと思います。

コンパイル/リンク/実行をするJCLのサンプルが、Windowsのサンプルをインストールしたディレクトリ下に提供されています。
`<Inst_Dir>\ODM8110\studio\tutorials\cobol\bomstartresz\answer\SharingZMiniloan-exucution\jcl\HBRMTUT2.jcl`

<details><summary><font color="blue">参考: サンプルJCL</font></summary><div>

```
//HBRMTUT2 JOB MSGCLASS=H,MSGLEVEL=(1,1),REGION=0M
//         JCLLIB ORDER=(++LNGPRFX++.SIGYPROC)
//*********************************************************************
//* Licensed Materials - Property of IBM                              *
//* 5655-Y31                                                          *
//*  Copyright IBM Corp. 2011, 2021. All Rights Reserved.             *
//* U.S. Government Users Restricted Rights:                          *
//* Use, duplication or disclosure restricted by GSA ADP Schedule     *
//* Contract with IBM Corp.                                           *
//*********************************************************************
//* Sample JCL for execution server                                   *
//*        To Customize:                                              *
//*                     ++LNGPRFX++: HLQ of Language Compiler         *
//*                     ++LIBPRFX++: HLQ of Link Library              *
//*                     ++SRCLIB++ : HLQ of COBOL Source Program      *
//*                     ++COPYLIB++: HLQ of COBOL Copybook            *
//*                     ++LOADLIB++: HLQ of Execution Module          *
//*                     ++HBRHLQ++ : HLQ of Decision Server data set  *
//*                     ++HBRWDS++ : HLQ of DS working data set       *
//*                     ++PGM++    : Name of COBOL Calling Program    *
//*********************************************************************
//CONFIG SET HBRHLQ=++HBRHLQ++
//       SET HBRWDS=++HBRWDS++
//       SET SRCLIB=++SRCLIB++
//       SET CPYLIB=++COPYLIB++
//       SET LOADLIB=++LOADLIB++
//       SET MEM=++PGM++
//STEP1 EXEC PROC=IGYWCLG,
//           LNGPRFX=++LNGPRFX++,
//           LIBPRFX=++LIBPRFX++,
//           PARM.COBOL='LIB'
//COBOL.SYSIN DD DISP=SHR,DSN=&SRCLIB(&MEM)
//COBOL.SYSLIB DD DISP=SHR,DSN=&CPYLIB
//             DD DISP=SHR,DSN=&HBRHLQ..SHBRCOBC
//LKED.SYSLIB DD DSN=&LIBPRFX..SCEELKED,DISP=SHR
//            DD DSN=&HBRHLQ..SHBRLOAD,DISP=SHR
//LKED.SYSLMOD DD DSN=&LOADLIB(&MEM),DISP=(MOD,KEEP),SPACE=(TRK,(3,3))
//GO.STEPLIB DD DISP=SHR,DSN=&LIBPRFX..SCEERUN
//           DD DISP=SHR,DSN=&HBRHLQ..SHBRLOAD
//GO.SYSUDUMP DD SYSOUT=*
//GO.HBRPSNAP DD SYSOUT=*
//GO.HBRTMSGF DD DUMMY
//GO.HBRENVPR DD DISP=SHR,DSN=&HBRWDS..SHBRPARM(HBRBATCH)
```

</div></details>

さて、提供されるCOBOLバッチのソース、生成されたCOPYBOOKを元に、JCLのサンプルを使ってコンパイル/リンク/実行を行ってみます。

とりあえず、COBOLソース、COPYBOOK、JCL、ロードモジュールを配置するためのデータセットを以下の様に作成します。
ODM811.TEST.COBOL
ODM811.TEST.COPY
ODM811.TEST.JCLLIB
ODM811.TEST.LOADLIB

ソース、COPYBOOK、JCLを以下に配置します。
ソース: ODM811.TEST.COBOL(HBRMTUT2)
COPYBOOK: ODM811.TEST.COPY(HBRLDAT2)
JCL: ODM811.TEST.JCLLIB(HBRMTUT2)

実は提供されているCOBOLのソースはそのままだとうまく動きません。今回ルールをデプロイするときに自動でバージョン管理を行うようにしているのでバージョン情報が付いた状態でデプロイされています。その辺りの情報がソース中では反映されていないので、その部分を修正する必要があります。
まず、zRES上にデプロイされた呼び出し対象のルールセットのパスを確認します。
ブラウザからエクスプローラータブを開いて確認 ⇒ `/SharingZMiniloan/1.0/SharingZMiniloan/1.0`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132331/633d5bbd-d9ff-6915-1a83-a068b168e135.png)

COBOLのソースを修正します。具体的には以下のようにHBRA-CONN-RULEAPP-PATHに設定する値を上で確認したパスに変更します。

```
...
      * Move ruleset parameters to table HBRA-RA-PARMETERS
           MOVE ZERO               TO HBRA-CONN-RETURN-CODES
           MOVE LOW-VALUES         TO HBRA-RA-PARMETERS
           MOVE "/SharingZMiniloan/1.0/SharingZMiniloan/1.0"
                                   TO HBRA-CONN-RULEAPP-PATH
...
```

ルール呼び出しのバッチを実行する際は、zRES接続情報などはソース中に埋め込むのではなく外部からパラメーターとして渡すことになります(上のソース中には具体的な接続先の情報などは指定していません)。そのzRES情報を設定するためのPDSメンバーは雛形が以下に生成されているのでそれをそのまま使います。
`ODM811.WORK.O8B0.SHBRPARM(HBRBATCH)`

中身を確認しておきます。

```xxx:ODM811.WORK.O8B0.SHBRPARM(HBRBATCH)
* The list of zRES sub system ids to connect to
HBRSSIDLIST=O8B1,O8B2

* Specifies the target for rule execution
HBRTARGETRES=ZRES

* Specifies the number of seconds to wait for a response
* from the zRule Execution Server stand alone
* 0 = No timeout
* 1 - 60000 = Seconds to wait for rule execution to complete
* (Use property HBRLOGTIMEOUTS in the HBRMSTR parms
*  member to record client timeouts in the server's log)
HBRTIMEOUT=0

* Parameters relating to Trace
*
* ALL, FINE or FINEST: turn on client trace
* OFF:                 no trace
*
HBRTRACELEVEL=WARNING
```

コンパイル/リンク/実行用のJCLをカスタマイズします。コメントの内容に従って、環境に応じてHLQなどを設定していくイメージです。

```
//HBRMTUT2 JOB MSGCLASS=H,MSGLEVEL=(1,1),REGION=0M
//         JCLLIB ORDER=(IGY630.SIGYPROC)
//*********************************************************************
//* Licensed Materials - Property of IBM                              *
//* 5655-Y31                                                          *
//*  Copyright IBM Corp. 2011, 2021. All Rights Reserved.             *
//* U.S. Government Users Restricted Rights:                          *
//* Use, duplication or disclosure restricted by GSA ADP Schedule     *
//* Contract with IBM Corp.                                           *
//*********************************************************************
//* Sample JCL for execution server                                   *
//*        To Customize:                                              *
//*                     ++LNGPRFX++: HLQ of Language Compiler         *
//*                     ++LIBPRFX++: HLQ of Link Library              *
//*                     ++SRCLIB++ : HLQ of COBOL Source Program      *
//*                     ++COPYLIB++: HLQ of COBOL Copybook            *
//*                     ++LOADLIB++: HLQ of Execution Module          *
//*                     ++HBRHLQ++ : HLQ of Decision Server data set  *
//*                     ++HBRWDS++ : HLQ of DS working data set       *
//*                     ++PGM++    : Name of COBOL Calling Program    *
//*********************************************************************
//CONFIG SET HBRHLQ=ODM811.TLIB
//       SET HBRWDS=ODM811.WORK.O8B0
//       SET SRCLIB=ODM811.TEST.COBOL
//       SET CPYLIB=ODM811.TEST.COPY
//       SET LOADLIB=ODM811.TEST.LOADLIB
//       SET MEM=HBRMTUT2
//STEP1 EXEC PROC=IGYWCLG,
//           LNGPRFX=IGY630,
//           LIBPRFX=CEE,
//           PARM.COBOL='LIB'
//COBOL.SYSIN DD DISP=SHR,DSN=&SRCLIB(&MEM)
//COBOL.SYSLIB DD DISP=SHR,DSN=&CPYLIB
//             DD DISP=SHR,DSN=&HBRHLQ..SHBRCOBC
//LKED.SYSLIB DD DSN=&LIBPRFX..SCEELKED,DISP=SHR
//            DD DSN=&HBRHLQ..SHBRLOAD,DISP=SHR
//LKED.SYSLMOD DD DSN=&LOADLIB(&MEM),DISP=(MOD,KEEP),SPACE=(TRK,(3,3))
//GO.STEPLIB DD DISP=SHR,DSN=&LIBPRFX..SCEERUN
//           DD DISP=SHR,DSN=&HBRHLQ..SHBRLOAD
//GO.SYSUDUMP DD SYSOUT=*
//GO.HBRPSNAP DD SYSOUT=*
//GO.HBRTMSGF DD DUMMY
//GO.HBRENVPR DD DISP=SHR,DSN=&HBRWDS..SHBRPARM(HBRBATCH)
```

ちなみにこのJCLでは、コンパイル/リンク/実行を行うためのEnterprise COBOL提供プロシージャー"IGYWCLG"が使われています。
参考: [Enterprise COBOL fro z/OS V6.3 - Compile, link-edit, and run procedure (IGYWCLG)](https://www.ibm.com/docs/en/cobol-zos/6.3?topic=procedure-compile-link-edit-run-igywclg)
最終行のHBRENVPR DDで、実行時にアクセスするzRESの情報として先に確認したHBRBATCHというPDSメンバーを指定しています。

一通り準備ができたので、このJCLをサブミットします。
コンパイル/リンクが成功するとCOBOLバッチの実行が行われますので、JOBLOGのSYSOUTを見てみます。

```xxx:SYSOUT
 connect zRules successful
 invoke zRules successful
 ********** EXECUTION RESULT *********
 Borrower Name : John
 Loan Approved?: F
 Reject messages:
 The age exceeds the maximum or minimum.
 **************************************
 Disconnected zRules successful
```

ルール呼び出しが正常に行えたことが確認できました。