IBM i の既存プログラムを活かしたハイブリッド開発（その１）

IBM iのシステム仕様や業務運用をそのままにUIをオープン化に踏み切る時、簡単に言えば脱エミュレータの時、
既存プログラム資産の **RPG/CL/COBOL** を活用することでシステム開発インパクトと改変リスクを低減できるケースが多分にあります。
この様なハイブリッド開発を行う際に、既存プログラムをどう連携させるか？手法は幾つかありますが、2024のAdvent Calendarでは、何回かに分けて、ある２パターン紹介しようと思います。
今回は、その2パターンを実装するための**仮想既存資産の RPG プログラム**を作成していきます。

## 仮想既存資産の RPG プログラム
### ①消費税計算サブルーチン（10％）
■ 引数
 - IN :金額（税抜き）
 - OUT：金額（税込み）
■返り値
 - なし

---

### ②消費税計算サブルーチン（8％）
■ 引数
 - IN :金額（税抜き）
■返り値
 - 金額（税込み）

## ①と②のRPGサンプル
実際運用を考えると、課税、非課税、不課税、免税、輸入税、軽減税率などの各種シチュエーションや、税率マスターを使うかと思います。それら内部ロジックは一旦おいておいて、今回のサンプル RPG サンプルプログラムでは単純に入力値に対して、①では1.1倍した金額、②では1.08倍した金額を算出し返します。

サンプルプログラムは以下のとおりです。
- [GitHub - ushiday - qiita-rpgle/QRPGSRC/Q240101R.RPGLE](https://github.com/ushiday/qiita-rpgle/blob/main/QRPGSRC/Q240101R.RPGLE)
- [GitHub - ushiday - qiita-rpgle/QRPGSRC/Q240201R.RPGLE](https://github.com/ushiday/qiita-rpgle/blob/main/QRPGSRC/Q240201R.RPGLE)

```RPGLE:①Q240101R.RPGLE
**FREE
CTL-OPT
       NOMAIN
       DATEDIT(*YMD)
       DECEDIT('0.')
       EXPROPTS(*RESDECPOS)
       CURSYM('¥')
       COPYRIGHT('...')
;
DCL-PROC MY_ZEIKOMI              EXPORT         ;
//インターフェース
  DCL-PI *N                                     ;
     IN_KING1 LIKE(W#KING2  ) CONST             ;  //金額（税抜
     OT_KING2 LIKE(W#KING2  )                   ;  //金額（税込み
  END-PI;

  DCL-S  W#KING2       ZONED(011 :00 )          ;  //金額（税込み
  DCL-C  W#ZEIRIT1     10                       ;  //税率％

  OT_KING2   = *ZERO                            ;

  //税込み計算
  W#KING2    = IN_KING1
               * (1 + (W#ZEIRIT1 / 100 ))       ;

  SND-MSG    '税込み…'
              + %CHAR(W#KING2      )
  ;

  OT_KING2   = W#KING2                          ;

  RETURN                                        ;

END-PROC;

```
上記プログラムを初学者のために少し解説します。初歩的な内容なのでわかっている人は飛ばして下さい。

### 少しだけプログラムの解説
`CTL-OPT（旧H仕様書）`制御オプションで`NOMAIN`としているのは、このプログラムはメインルーチンを持たないプログラムを意味しています。メインルーチンを持たないため、コマンドラインの`CALL`で呼び出されてることを目的としていません。プログラムtoプログラムで利用される事を意図しています。
そのためこのプログラムは`*SRVPGM（サービスプログラム）`と呼ばれるオブジェクトを作成することになります。
具体的には、`CRTRPGMOD` でモジュールを作成後、そのモジュールを利用した、`CRTSRVPGM` でプログラムを作成して下さい。例えば以下の様に
1. CRTRPGMOD MODULE(USHIDA@Q24/Q240101R) SRCFILE(USHIDA@Q24/QRPGSRC) SRCMBR(Q240101R) REPLACE(*YES)
1. CRTSRVPGM SRVPGM(USHIDA@Q24/Q240101R) MODULE(*SRVPGM) EXPORT(*ALL) TEXT(*MODULE)

次に幾つかのオプションが続きますが、詳細は公式サイトの[V7R5 制御仕様キーワード](https://www.ibm.com/docs/ja/i/7.5?topic=specifications-control-specification-keywords) を見て下さい。

`DCL-PRCO`と`DCL-PI` プロシージャと呼ばれる、外部呼び出しの入口点を定義しています。`MY_ZEIKOMI`はこのプロシージャの名前を表しています。`*N`は`MY_ZEIKOMI`と同名という意味になります。
このプロシージャは入力用（IN_KING1）、出力用引数（OT_KING2）をそれぞれ一つずつとります。何れもLIKEオプションで、ゾーン10進数の11桁で定義されております。
`CONST`はプログラム内で変数の変更が出来ないことを意味しています。
サブルーチンの内容は、10%税込み金額計算後、`SND-MSG` 命令で結果を出力し、出力用引数に値をセットして、プログラムを`RETURN`で終了しています。

---

```RPGLE:②Q240201R.RPGLE
**FREE
CTL-OPT
       NOMAIN
       DATEDIT(*YMD)
       DECEDIT('0.')
       EXPROPTS(*RESDECPOS)
       CURSYM('¥')
       COPYRIGHT('...')
;
DCL-PROC MY_ZEIKOMI              EXPORT         ;
//インターフェース
  DCL-PI *N   LIKE(W#KING2  )                   ;  //金額（税込み
     IN_KING1 LIKE(W#KING2  ) CONST             ;  //金額（税抜
  END-PI;

  DCL-S  W#KING2       ZONED(011 :00 )          ;  //金額（税込み
  DCL-C  W#ZEIRIT1     08                       ;  //税率％

  //税込み計算
  W#KING2    = IN_KING1
               * (1 + (W#ZEIRIT1 / 100 ))       ;

  SND-MSG    '税込み…'
              + %CHAR(W#KING2      )
  ;

  RETURN       W#KING2                          ;

END-PROC;

```

このプログラムと`①Q240101R.RPGLE`の違いは、`DCL-PI`で返り値がゾーン10進数11桁で定義されていること、税率が8%となっている事です。返り値が定義されているので`RETURN 返り値`の形になります。

今回は以上です。続きはまた