You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Current »

12.4.1 RDML ファンクション

次のシステム変数 *SYDN を評価するファンクションは、システム評価ファンクションの最もシンプルな例だと考えてください。

      FUNCTION  OPTIONS(*DIRECT *ALP_SYSTEM_VARIABLE *NOMESSAGES)
   CHANGE     FIELD(#SYSVAR$AV) TO('SYD0386')
  • このファンクションを以下のように簡単に拡張して、*SYDN および *MELB という 2 つのシステム変数の値を返すようにできます。これは、どちらも英数字型だからです。
      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
  • さらに、*SYDN、*MELB、*COMPANYなどのように、長さの異なるシステム変数の値を返すことも可能です。
      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 のいずれかが指定された場合、システム変数が適切に使われることを確実にするため、次のような制約を適用するようになっています。これは技術上の制約ではなく、あえて設計として盛り込まれた制約です。

  • DISPLAY、REQUEST、POP_UPの各コマンドは使えません。
  • 複雑な検証処理が必要な場合であっても、ファンクション内から他のプロセス/ファンクションを呼び出す(CALL)ことはできません。ただし、3GLプログラムを呼び出すことは可能です。
  • アクション・バー・プロセス中に、システム変数評価ファンクションを記述することはできません。ただし、これはアクション・バー・プロセスから参照することを禁じているのではなく、アクション・バー型のプロセスの一部としては定義できない、という意味です。
  • システム変数評価ファンクションにRCV_DSオプションやRCV_LISTオプションを指定することはできません。
  • 連携するプロセスにパラメータを渡すことはできません。
  • 交換リストは使えません。これにより、評価ファンクションの独立性を高め、モジュール性を保証しています。システム変数はLANSAのあらゆる箇所から参照されうるので、参照の際、交換リストに格納された情報が必要であるとすれば、実装が非常に困難になってしまいます。
  • 再帰的なファンクション呼び出しを記述することは可能ですが、実行の段階で失敗します。例えばシステム変数*TESTとその評価ファンクションFUNC01を定義したとします。FUNC01が*TESTを直接に参照する、または妥当性規則や省略値の形で間接的に参照する場合、自分自身を再帰的に呼び出す形になって、実行は失敗します。 特に省略値にからんで、思いがけない形で再帰が現れる場合があります。例えばデータ・ディクショナリに#TESTというフィールドが定義されており、その省略値が*TESTであるとしましょう。FUNC01が#TESTフィールドを参照しようとすると、#TESTの省略値を設定する初期化処理が必要となり、その中で再びFUNC01を呼び出すことになります。これは再帰的であり、しかもその再帰は永久に続きます。
  • システム変数評価ファンクションには、*DBOPTIMIZEオプション、*NOMESSAGESオプションの指定を推奨します。頻繁に使うファンクションには、*HEAVYUSAGEオプションも指定するとよいでしょう。
  • この機能を、多言語アプリケーションで使う場合は、ぜひとも*MLOPTIMIZEオプションを指定することを推奨します。
  • No labels