RDML 組み込み関数をファンクションとして作成する際の手順は以下の通りです。以下に示す例は非常に簡素なものですが、RDML 組み込み関数がどのように LANSA システムに組み込まれるのかの概要が理解できると思います。
シナリオ:対象となるのはユーザー定義の RDML 組み込み関数です。この組み込み関数に引き渡されるのは 2 つの引数です。数値 (packed 11,2) の作業リストと、任意で数値の平均値より上の数値を返すのか下の数値を返すのかを示します。デフォルトは「平均値より上」に設定されています。この組み込み関数から返されるのは、条件に合った数値 (packed 11,2) の作業リストと任意で平均の値 (packed 30,9) です。この RDML BIF は新規アプリケーション内で広く使用することができますので、USE 間では終了しないようにコーディングされます。
この BIF の名前はUD_GET_HI_LO_AVGE です。
BIF の記述は「Return numbers over or under the average (平均値より上または下の数値を返す)」です。
この RDML 組み込み関数は、テンプレート BBRDMLBIF から生成されます。
引数と戻り値の作業リストは、テンプレートにより生成されたプロトタイプからカスタマイズしていきます。
その後、実際の評価ロジックを追加します。
********** RDML コマンド開始 **********
********** =======================================================
********** Copyright .......: (C) The LANSA Group , 19
98
********** プロセス.........: CR4587SMPL
********** ファンクション ..: CR4587S
********** タイプ ..........: 組み込み関数
********** 作成者 ..........: KEVIN
********** 作成日 ..........: 02/09/98 at 19:46:50
********** 説明 ............: サンプル RDML BIF ファンクション
********** =======================================================
FUNCTION OPTIONS(*DIRECT *NOMESSAGES *HEAVYUSAGE *MLOPTIMISE *BU
ILTIN)
********** =======================================================
********** 組み込み関数名用の特別フィールド
********** =======================================================
DEFINE FIELD(#BIF_NAME) TYPE(*CHAR) LENGTH(20) DESC('Return nu
mbers over or under the average') DEFAULT('UD_GET_HI_LO
_AVG')
********** =======================================================
********** 組み込み関数の引数
********** =======================================================
********** 引数 01 提供される数値のリスト
DEFINE FIELD(#BIF_ALC01) TYPE(*DEC) LENGTH(7) DECIMALS(0) DESC
('Supplied numbers list')
DEFINE FIELD(#NUMBER) TYPE(*DEC) LENGTH(11) DECIMALS(2) DESC('
Number')
DEF_LIST NAME(#BIF_ARG01) FIELDS((#NUMBER)) COUNTER(#BIF_ALC01)
TYPE(*WORKING) ENTRYS(9999)
********** 引数 02 必須の数値の上 (O) または下 (U)
DEFINE FIELD(#BIF_ARG02) TYPE(*CHAR) LENGTH(1) DESC('Over or u
nder numbers required (O or U)') DEFAULT('O')
********** =======================================================
********** 作業フィールド、リスト、グループ
********** =======================================================
DEFINE FIELD(#TOTAL) TYPE(*DEC) LENGTH(30) DECIMALS(2) DESC('T
otal')
********** =======================================================
********** 組み込み関数の戻り値
********** =======================================================
********** 戻り値 01 平均値より上または下の数値のリスト
DEFINE FIELD(#BIF_RLC01) TYPE(*DEC) LENGTH(7) DECIMALS(0) DESC
('Over or under average numbers list')
DEF_LIST NAME(#BIF_RET01) FIELDS((#NUMBER)) COUNTER(#BIF_RLC01)
TYPE(*WORKING) ENTRYS(9998)
********** 戻り値 02 提供された数値の平均値
DEFINE FIELD(#BIF_RET02) TYPE(*DEC) LENGTH(30) DECIMALS(9) DES
C('Average of supplied numbers') DEFAULT(*ZERO)
********** =======================================================
********** ファンクション メイン行 : CR4587S
********** =======================================================
********** 評価用呼び出し
**********
**********
IF COND('*BIF_SHUTDOWN *NE Y')
********** 平均値の計算
CHANGE FIELD(#TOTAL) TO(0)
SELECTLIST NAMED(#BIF_ARG01)
CHANGE FIELD(#TOTAL) TO('#TOTAL + #NUMBER')
ENDSELECT
CHANGE FIELD(#BIF_RET02) TO('#TOTAL / #BIF_ALC01') ROUND_UP(*Y
ES)
********** 再度リストを確認し、平均値より上または下の数値を
********** 戻り値のリストに追加
CLR_LIST NAMED(#BIF_RET01)
SELECTLIST NAMED(#BIF_ARG01) WHERE('((#BIF_ARG02 *EQ O) *AND (#NUM
BER *GT #BIF_RET02)) *OR ((#BIF_ARG02 *EQ U) *AND
(#NUMBER *LT #BIF_RET02))')
ADD_ENTRY TO_LIST(#BIF_RET01)
ENDSELECT
********** シャットダウン用呼び出し
**********
ELSE
********** シャットダウン・ロジックなし
ENDIF
********** 呼び出し元に制御を戻す
RETURN
********** RDML コマンドおわり **********