例 - RDML ファンクションとして BIF を定義

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 コマンドおわり **********

以下に注意してください。

  • 戻り値リストは、いずれのエントリーが追加される前に明示的にクリアされます。
  • 任意の引数と戻り値は、USE ステートメント内にコーディングされていなかったとしても、参照することが可能です。*BIF_ARGCOUNT や *BIF_RETCOUNT の値をそれぞれ確認することで、任意の引数や戻り値への参照に条件をつけるのがより一般的です。任意の戻り値を取り出すための別処理はありません。定義された別の作業フィールドに保存されます。
  • このファンクションは *HEAVYUSAGE のため、この評価ロジックでは、シャットダウンの呼び出しではないことを確認することが条件となっています。また、累積フィールドは毎回 0 にリセットされます。この RDML BIF には、特別なシャットダウン・ロジックは存在しません。
  • No labels