例 - 組み込み関数を 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
/*==================================================================*/