TRIG_OPERおよびTRIG_RETC変数とTRIG_LIST作業リスト
トリガー・ファンクションは、呼び出されるときに、呼び出し元から以下の2つのデータを受け取ります。
TRIG_OPER
TRIG_OPER:A(6)フィールドです。このフィールドは、データ・ディクショナリで定義されていなければなりません。このフィールドの内容によって、どのようなデータベース操作が実行されたか、または実行されるかが定義されます。詳細については、「トリガーに渡されるTRIG_OPERのコード」を参照してください。
TRIG_LIST
TRIG_LIST:0、1、または2個の項目が含まれる2項目の作業リストです。渡される項目数は、実行されるデータベース操作によって異なります。詳細については、「トリガーに渡されるTRIG_LISTの項目数」を参照してください。
TRIG_LISTは、2項目の作業リストとして定義する必要がありますが、リスト内にはフィールドを定義しないでください。必要なフィールドは、RDMLコンパイラによって自動的に定義されます。
トリガーがフィールド#CUSTNOに関するものである場合、1つのフィールド#CUSTNOが、以下のように入力したかのようにリスト内に自動的に定義されます。
DEF_LIST NAMED(#TRIG_LIST) FIELDS(#CUSTNO)
トリガーが、実フィールドX、A、およびTと、仮想フィールドQおよびBを含むファイルZに関するものである場合、リストは、以下のように入力したかのように自動的に定義されます。
DEF_LIST NAMED(#TRIG_LIST) FIELDS(#X #A #T #Q #B)
この自動定義により、確実に正しい名前が使用されます。また、正しい名前を正しい順序で認識したり入力したりする必要がありません。
自動定義は、ファイルZの「アクティブな」定義を基に実行されます。そのため、ファイルZのフィールドをX、A、V、T、Q、およびBに変更した後、変更後のファイルZを「操作可能」にする前にトリガーを再コンパイルすると、変更前の「アクティブ」なバージョンのファイルZ (X、A、T、Q、B)を基に定義が行われます。
その後、ファイルZを「操作可能」にした場合、リスト・レイアウトとしてX、A、V、T、Q、Bを使用してトリガーの呼び出しが設定されます。これは明らかに一致しておらず、予期しない結果になります。
この間違いは、10進数データ・エラーまたはリスト・フィールド内でのデータの「オフセット」として現れます。トリガーの呼び出し時にこのような問題が発生した場合は、トリガーを再コンパイルしてください。
したがって、ファイル定義を変更するときは、必ず、ファイルを「操作可能」にしてから、関連付けられたトリガー・ファンクションを再コンパイルしてください。
リストから値を「取得」するには、GET_ENTRYコマンドを使用します。
すなわち、フィールド#CUSTNOに関するトリガーを使用する場合は、GET_ENTRY NUMBER(?) FROM_LIST(#TRIG_LIST)を使用して、リストから#CUSTNOの正しい値を「取得」する必要があります。
同様に、ファイルZの例で#X〜#Bの値を取得する場合も、GET_ENTRY NUMBER(?) FROM_LIST(#TRIG_LIST)を使用して値を「取得」する必要があります。
リスト操作SELECTLIST、GET_ENTRY、およびUPD_ENTRYは、リストTRIG_LISTに対してのみ使用してください。また、UPD_ENTRY操作は、項目番号1に対してのみ実行してください。トリガー・ファンクションは、終了時に以下の2つのデータを呼び出し元に返します。
TRIG_RETC:A(2)フィールドです。このフィールドは、データ・ディクショナリで定義されていなければなりません。戻り時には、"OK"、"ER"、また状況によっては"VE"に設定されていなければなりません。これらの戻りコードの意味と使用方法の詳細については、以降のセクションを参照してください。
TRIG_LIST:前に説明したとおり、0、1、または2個の項目が含まれる2項目の作業リストです。渡された最初の項目のデータは、UPD_ENTRYコマンドで変更することができます。これを「前」の操作で実行すると、実際には、挿入または更新されたファイル・データが変更されます。
同様に、これを「READ後」の操作で実行すると、読み取り要求を発行したファンクションに渡されたデータが変更されます。
順次呼び出されるトリガー・ファンクション間での「コミュニケーション」のためにこの機能を使用しないことを強くお勧めします。
リスト操作SELECTLIST、GET_ENTRY、およびUPD_ENTRYは、リストTRIG_LISTに対してのみ使用してください。UPD_ENTRY操作は、項目番号1に対してのみ実行してください。