5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ILERPGAdvent Calendar 2024

Day 1

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

Last updated at Posted at 2024-11-30

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

仮想既存資産の RPG プログラム

①消費税計算サブルーチン(10%)

■ 引数

  • IN :金額(税抜き)
  • OUT:金額(税込み)
    ■返り値
  • なし

②消費税計算サブルーチン(8%)

■ 引数

  • IN :金額(税抜き)
    ■返り値
  • 金額(税込み)

①と②のRPGサンプル

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

サンプルプログラムは以下のとおりです。

①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)
  2. CRTSRVPGM SRVPGM(USHIDA@Q24/Q240101R) MODULE(*SRVPGM) EXPORT(*ALL) TEXT(*MODULE)

次に幾つかのオプションが続きますが、詳細は公式サイトのV7R5 制御仕様キーワード を見て下さい。

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


②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 返り値の形になります。

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

5
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?