トリガー・ファンクションの作成

ファンクションをトリガー・ファンクションとして定義するには、FUNCTIONコマンドでTRIGGERパラメータを使用します。

ファンクションをデータ・ディクショナリ・レベルのトリガーとして動作させる場合は、このパラメータの最初の部分に*FIELDと入力し、2番目の部分に、関連付けるデータ・ディクショナリ・フィールド名を入力します。

ファンクションをデータベース・レベルのトリガーとして動作させる場合は、パラメータの最初の部分に*FILEと入力し、2番目の部分に、関連付けるデータベース・テーブル名を入力します。指定するテーブルは、インデックスではなく物理テーブルでなければなりません。

新しいトリガー・ファンクションを容易に定義できるよう、LANSAには、トリガー・ファンクションの土台として使用できる以下のアプリケーション・テンプレートが付属しています。

BBFLDTRIG

フィールド・レベルのトリガー・ファンクション

BBFILTRIG

テーブル・レベルのトリガー・ファンクション

 
ファンクションをトリガー・ファンクションとして定義するときは、以下のガイドラインに従う必要があります

  • パラメータRCV_LIST(#TRIG_LIST)を使用してください。
  • パラメータRCV_DSは使用しないでください。
  • オプション*DIRECTも使用してください。
  • オプションxxx_SYSTEM_VARIABLEまたはxxx_FIELD_VALIDATEは使用しないでください。
  • リスト#TRIG_LISTは、DEF_LISTコマンドでDEF_LIST NAME(#TRIG_LIST) TYPE(*WORKING) ENTRYS(2)として定義されていなければなりません。また、このリストでは、FIELDSパラメータに列を含むことができません。必要な列は自動的に追加されます。
  • DISPLAY、REQUEST、またはPOP_UPコマンドは使用できません。これは、意図的に適用されている設計/使用上の制約で、将来的なバージョンで排除される可能性があります。
  • 別のプロセス/ファンクションに対する呼び出し(CALL)が存在してはなりません。これは、意図的に適用されている設計/使用上の制約で、将来的なバージョンで排除される可能性があります。
  • アクション・バー・プロセス内でトリガー・ファンクションを定義することはできません。これは、アクション・バー内からトリガー・ファンクションを参照できないということではなく、アクション・バー・タイプのプロセスの一部としてトリガー・ファンクションを定義できないということです。
  • 関連付けられたプロセスではパラメータを使用できません。
  • 交換リストは使えません。これは、トリガー・ファンクションの設計および使用における独立性とモジュール性を確保するために意図的に適用されている設計/使用上の制約です。

ファンクションをトリガー・ファンクションとして定義する場合、多くの状況で以下のガイドラインに従う必要があります。

  • フィールドの妥当性検査/トリガー および「トリガー・ファンクション」を参照して、トリガーの定義方法および使用方法を理解してください。
  • オプション*NOMESSAGESおよび*MLOPTIMIZEを使用してください。
  • オプション*HEAVYUSAGEおよび*DBOPTIMIZEの使用を検討することもできます。
  • 直接または間接を問わず、トリガーが関連付けられているデータベース・テーブル、または今後関連付けられるデータベース・ファイルにアクセスしないでください。
  • トリガーが頻繁かつ継続的に呼び出される場合は、リソースを大量に消費する操作は避けてください。このような操作を実行すると、関連付けられたテーブルへのアクセス速度が低下します。無理のない範囲で、トリガーによって別のトランザクションを「送信」して、イベントのソースが大幅に遅れないようにしてください。
  • 再帰的なファンクション呼び出しを記述することは可能ですが、実行の段階で失敗します。例えば、テーブルAへの挿入中に呼び出されたフィールド・トリガー・ファンクションがテーブルBにデータを挿入しようとすると、それ自体が再帰的に呼び出される状況に陥り、失敗する可能性があります。
  • No labels