私はオラクルフォームを使用しています。特定のフィールドの値が変更されるたびに実行する必要のあるプロシージャがあります。実行する必要のあるプロシージャには、when_validate_itemトリガーでは使用できないgo_block命令が含まれています。これを回避する方法はありますか?
編集
when_validate_itemを使用する必要があります。これは、フィールドが変更されたときに実行する必要があるプロシージャを実行する必要があるためですが、検証が実行される前に実行する必要があります。
私はオラクルフォームを使用しています。特定のフィールドの値が変更されるたびに実行する必要のあるプロシージャがあります。実行する必要のあるプロシージャには、when_validate_itemトリガーでは使用できないgo_block命令が含まれています。これを回避する方法はありますか?
編集
when_validate_itemを使用する必要があります。これは、フィールドが変更されたときに実行する必要があるプロシージャを実行する必要があるためですが、検証が実行される前に実行する必要があります。
通常、の使用GO_BLOCKまたはGO_ITEMに制限がありWHEN-VALIDATE-ITEMます。ただし、これを克服する方法はいくつかあります。1つの方法は、WHEN-TIMER-EXPIREDトリガーを使用することです。方法は次のとおりです-
WHEN-TIMER-EXPIRED
Begin
if GET_APPLICATION_PROPERTY(TIMER_NAME) = 'NEW_TIMER' then
CALL_PROG_UNIT(); --This is your Procedure that calls the GO_BLOCK
/*Do rest of validation here*/
end if;
END;
WHEN-VALIDATE-ITEM
DECLARE
timer_id TIMER;
Begin
timer_id := CREATE_TIMER('NEW_TIMER',1,NO_REPEAT); --set a short timer so that the WHEN-TIMER-EXPIRED trigger is fired immediately
End;
何が起こるか-これは、CREATE_TIMER関数が呼び出されるとすぐにタイマーを作成して期限切れにし、フォームレベルのトリガーWHEN-TIMER-EXPIREDが期限切れのタイマー名をチェックして、を持っているプログラムユニットを呼び出しますGO_BLOCK。お役に立てれば。
アップデート
Jeffery Kemp氏は、このソリューションが機能するという証拠を見たかったのです。だからここにあります-
BLOCK12つのブロックとそのBLOCK2上にテキストアイテムがあるOracleフォーム

WVIトリガー

WTEフォームトリガー。これは、最初に関数呼び出しを使用してPROGRAM UNITP_CALL_PROCをGO_BLOCK呼び出し、次にフィールドでいくつかの検証を行いますNumber 2。

ここはP_CALL_PROC

そしてここに結果があります-

と

フォームの動作を確認するためのYoutubeリンクは次のとおりです。
この種の問題に遭遇したとき、私は通常、フォーム自体の書き直しや再設計の問題を修正することができました。つまり、検証の前にフォーカスを別のアイテムに移動する手順を使用する必要があるのはなぜですか?
この種の問題を回避できるようにするには、フォームのヘルプを読んで、制限付きビルトインで問題が発生しているトリガーを確認することをお勧めします。フォームがどのように機能するかについて十分な知識があれば、これらの種類の問題のほとんどを解決できるはずです。問題を回避できないまれなケースでは、タイマーの回避策を使用しました。
POST-CHANGEトリガーを使用してみることができます。