トリガー・ファンクションの作成
ファンクションをトリガー・ファンクションとして定義するには、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にデータを挿入しようとすると、それ自体が再帰的に呼び出される状況に陥り、失敗する可能性があります。