例 - 組み込み関数を 3GL プログラムとして定義
このセクションでは、組み込み関数を 1 つのプログラムとして作成する際の手順を説明します。以下に示す例は非常に簡素なものですが、組み込み関数が LANSA システムに組み込まれる様子が理解できると思います。
シナリオ:これはユーザー定義の組み込み関数です。この組み込み関数を使って、システム値を取得します。
簡素な CL プログラムです。このプログラムは、システム値の名前を渡し、システム値が返されます。
名前は UD_GET_SYSTEM_VALUE です。
このサイトで次に利用可能な識別子は 411 です。
(DC@F47 による) BIF 定義
BIF名: | UD_GET_SYSTEM_VALUE |
|---|---|
一意の識別子: | 411 |
説明: | システム値の取得 |
呼び出しまたは実行: | C (C<呼び出し> または E<実行>) |
プログラム名: | UD@P411 |
呼び出し間での終了: | N (Y <はい> または N <いいえ>) |
引数の数: | 1 |
戻り値の数: | 1 |
(DC@F48 による) BIFの引数
BIF名: | UD_GET_SYSTEM_VALUE |
|---|---|
パラメータ・タイプ | ARG |
パラメータシーケンス: | 1 |
パラメータ番号: | 1 |
パラメータ識別子: | A |
説明: | システム変数の名前 |
必須/任意: | R (R <必須> または O <任意>) |
パラメータタイプ: | A (A、N、または L) |
最小長: | 1 |
最大長: | 10 |
小数点以下最小桁数: | |
小数点以下最大桁数: | |
引き渡し長: | 10 |
引き渡す小数点以下桁数: | |
デフォルト: |
(DC@F48 による) BIF の戻り値
BIF名: | UD_GET_SYSTEM_VALUE |
|---|---|
パラメータ・タイプ | RET |
パラメータシーケンス: | 1 |
パラメータ番号: | 2 |
パラメータ識別子: | B |
説明: | システム変数の値 |
必須/任意: | R (R <必須> または O <任意>) |
パラメータタイプ: | A (A、N、または L) |
最小長: | 1 |
最大長: | 256 |
小数点以下最小桁数: | |
小数点以下最大桁数: | |
引き渡し長: | 256 |
引き渡す小数点以下桁数: |
以下のようにデータを組み込み関数定義ファイルに入力します:
/* プログラム : UD@P411 */
/* ------- */
/* 組み込み関数名 : システム値の取得 */
/* ------------ */
/* 作成日 : 03/10/91 */
/* ------------ */
/* 作成者 : Johnny Programmer */
/* ------ */
/* 記述 : システム値を返すプログラム */
/* ----------- */
/* */
/*=================================================================*/
/* パラメータ リスト仕様 */
/*=================================================================*/
/* */
/* 入力パラメータ リスト */
/* -------------------- */
/* */
/* 固定パラメータ (すべての組み込み関数) */
/* ----------------------------------------- */
/* */
/* DC@IDS : 標準の情報データ構造 */
/* DC@EDS : 標準の交換データ構造 */
/* PR@IDS : 標準のプロセス情報データ構造 */
/* */
/* 変数の引数と戻り値 (DC@F48 定義より) */
/* ------------------------------------------------------------- */
/* */
/* B$411A : 組み込み関数の引数記述子 数値 A */
/* B@411A : 取得するシステム値 */
/* B$411B : 組み込み関数の戻り値記述子番号 */
/* B@411B : システム値の値 */
/*=================================================================*/
UD@P411: PGM PARM(&DC@IDS &DC@EDS &PR@IDS &B$411A &B@411A &B$411B +
&B@411B)
/*=================================================================*/
/* 変数の宣言 */
/*=================================================================*/
DCL &DC@IDS *CHAR 1024
DCL &DC@EDS *CHAR 1024
DCL &PR@IDS *CHAR 1024
DCL &B$411A *CHAR 4
DCL &B@411A *CHAR 10
DCL &B$411B *CHAR 4
DCL &B@411B *CHAR 256
DCL &$PGMNM *CHAR 10
DCL &PR@PGM *CHAR 10
DCL &PR@B@N *CHAR 3
DCL &PR@B@A *CHAR 1
DCL &DC@RET *CHAR 1
DCL &DC@MID *CHAR 7
DCL &DC@MVR *CHAR 132
/*=================================================================*/
/* グローバル エラー ハンドラー */
/*=================================================================*/
MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO ARGERR)
/*=================================================================*/
/* プログラム メイン行 */
/*=================================================================*/
/* フィールドの設定とデータ構造から一部をマッピング .... */
CHGVAR &$PGMNM 'UD@P411'
CHGVAR &PR@PGM %SST(&PR@IDS 424 10)
CHGVAR &PR@B@N %SST(&PR@IDS 157 3)
CHGVAR &PR@B@A %SST(&PR@IDS 160 1)
/* 当初の結果は "正常に" 戻されることが前提 .... */
CHGVAR &DC@RET 'Y'
/* 必須の評価/アクションの実行....... */
/* システム値の取得 */
RTVSYSVAL SYSVAL(&B@411A) RTNVAR(&B@411B)
MONMSG (CPF0000 MCH0000)
/* プログラム処理ロジックの終わり */
ENDPGM: CHGVAR %SST(&DC@EDS 38 1) &DC@RET
CHGVAR %SST(&DC@EDS 39 7) &DC@MID
CHGVAR %SST(&DC@EDS 46 132) &DC@MVR
RETURN
/*==================================================================*/
/* ARGERR :プログラムに引き渡された引数のエラー処理。 */
/* 呼び出し元は、このロジックの実行前にエラーの原因を反映 */
/* させるため DC@MID と DC@MVR を設定します。 */
/* このロジックが起動されると、プログラム全体が終了されます。*/
/* これで、RDML プログラムの呼び出しはエラーとなり、 */
/* DC@MID/DC@MVR 内のエラー詳細を示すメッセージが表示されます。*/
/*==================================================================*/
ARGERR:
/* 呼び出し元に返す追加メッセージをすべて転送 */
CALL PGM(DC@P9007) PARM(&$PGMNM &PR@PGM)
MONMSG (CPF0000 MCH0000)
/* "不正な" 戻りコードを設定 .... */
CHGVAR &DC@RET 'N'
MONMSG (CPF0000 MCH0000)
/* 呼び出し元のプログラムに制御を戻す .... */
GOTO ENDPGM
/*==================================================================*/
ENDPGM
/*==================================================================*/