次のシステム変数 *SYDN を評価するファンクションは、システム評価ファンクションの最もシンプルな例だと考えてください。
FUNCTION OPTIONS(*DIRECT *ALP_SYSTEM_VARIABLE *NOMESSAGES)
CHANGE FIELD(#SYSVAR$AV) TO('SYD0386')
FUNCTION OPTIONS(*DIRECT *ALP_SYSTEM_VARIABLE *NOMESSAGES)
IF COND(#SYSVAR$NM *EQ '''*SYDN''')
CHANGE FIELD(#SYSVAR$AV) TO('SYD0386')
ELSE
CHANGE FIELD(#SYSVAR$AV) TO('MEB2307')
ENDIF
FUNCTION OPTIONS(*DIRECT *ALP_SYSTEM_VARIABLE *NOMESSAGES)
CASE OF_FIELD(#SYSVAR$NM)
WHEN VALUE_IS('= ''*SYDN''')
CHANGE FIELD(#SYSVAR$AV) TO('SYD0386')
WHEN VALUE_IS('= ''*MELB''')
CHANGE FIELD(#SYSVAR$AV) TO('MEB2307')
WHEN VALUE_IS('= ''*COMPANY''')
CHANGE FIELD(#SYSVAR$AV) TO('C05')
ENDCASE
この例は、システム変数評価ファンクション内にじかに記述した、数字または英数字リテラルをそのまま返すようになっています。実稼動システムで、このような処理をすることは通常ありえません。所定のデータ領域、あるいはデータベース・ファイルを検索するのが普通です。しかし上記の例をもとに、データ領域やデータベース・ファイルへのアクセス処理を追加するのは容易です。
技術上の注記
システム変数評価ファンクションは、さまざまな長さや精度のシステム変数を扱えますが、タイプが異なる場合は扱えません。*ALP_SYSTEM_VARIABLEというオプションは、英数字型の値を評価するファンクションであることを表します。同様に*NUM_SYSTEM_VARIABLEというオプションは、数値型の値を評価するファンクションであることを表します。
評価ファンクション内でシステム変数名やシステム変数値にアクセスするためには、次のフィールドをデータ辞書に定義する必要があります。
SYSVAR$NM A(20) |
システム変数名 |
|
|
SYSVAR$AV A(256) |
システム変数の、英数字型の戻り値 |
|
SYSVAR$NV P(30,9) |
システム変数の、数値型の戻り値 |
さらに、有効数字が21桁を超える数値型フィールドの評価は、現在の実装では事実上不可能であることにも注意してください。
ファンクションに*ALP_SYSTEM_VARIABLEオプションが指定されていれば、SYSVAR$AVフィールドの評価値を返します。同様に、*NUM_SYSTEM_VARIABLEオプションの場合は、SYSVAR$NVフィールドの評価値になります。
ファンクションのオプションとして、*ALP_SYSTEM_VARIABLE、*NUM_SYSTEM_VARIABLE のいずれかが指定された場合、システム変数が適切に使われることを確実にするため、次のような制約を適用するようになっています。これは技術上の制約ではなく、あえて設計として盛り込まれた制約です。