4
1

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 24

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

Last updated at Posted at 2024-12-23

前回のIBM i の既存プログラムを活かしたハイブリッド開発(その2)に続き、ハイブリッド開発の実装パターン2を行っていきます。

以前作成した仮想既存資産のRPGは次のとおりです。

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

■ 引数

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

このRPGはSQLから呼び出せる、SQLユーザー定義関数(以下UDF)を作成する事でOpen側との連携をすることが可能になります。

それでは具体的にUDFを作成するSQLを見ていきます。

FUNC1-1
-- UDF(ユーザー定義関数)作成
CREATE OR REPLACE FUNCTION
  USHIDA@Q24.MY_ZEIKOMI2
  (
    IN_KING1 NUMERIC(011 ,00)
  )
  RETURNS NUMERIC(011 ,00)
  LANGUAGE RPGLE
  EXTERNAL NAME 'USHIDA@Q24/Q240201R(MY_ZEIKOMI)'
  PARAMETER STYLE GENERAL
;

このSQLではCREATE FUNCTIONによって ライブラリ USHIDA@Q24 内に MY_ZEIKOMI2 という名前のUDFを定義しています。
続いて、(...) 内に引数の定義をしており、RPG引数のゾーン10進数は SQL 型 NUMERIC に該当します。
ストアド・プロシージャと異なり、関数は単一の返り値を持つのでRETURNSで同様に SQL 型 NUMERIC を定義しています。
LANGUAGERPGLE となり、EXTERNAL NAME で実際に呼び出されるプログラムをライブラリ/プログラム名(プロシージャ名)の形式で指定します。
PARAMETER STYLE GENERALは、この形式で引数を定義した場合程度に思って下さい。詳細はマニュアルを見て下さい。STRSQLやACSで上記SQLを実行すると以下の様に出力されます。
20241224-01.png

これで既存RPGにSQLからの入口が出来ました。それでは実際に実行して結果を確かめてみます。
UDFを呼び出すにはSELECTステートメントなどで関数を使用します。
次のSQLで結果を確かめます。

FUNC1-2
-- 実行
SELECT
   KING1
  ,USHIDA@Q24.MY_ZEIKOMI2(KING1) AS KING2
  FROM
  ( SELECT
       1000 AS KING1
      FROM SYSIBM.SYSDUMMY1
  )
;

上記SQLでは、選択の結果として関数 MY_ZEIKOMI2(...)税抜き金額を渡す事で、税込み金額の結果を取得しています。SQL を実行すると以下の様に出力されます。

20241224-02.png

UDFに 「1,000円の税抜き金額を入力に与えると、8%税込みの金額1,100円が返却」 されました。
この様に既存資産であるRPGをSQLのユーザー定義関数(UDF)を経由する事で、Open側に既存ビジネスロジックをそのまま活用させる事が可能になりました。
これで、今回のハイブリッド開発シリーズはおしまいです。この様にIBM iでは既存資産を活かして効率的なOpen開発が行えるのです。

4
1
2

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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?