4

私はオラクルフォームを使用しています。特定のフィールドの値が変更されるたびに実行する必要のあるプロシージャがあります。実行する必要のあるプロシージャには、when_validate_itemトリガーでは使用できないgo_block命令が含まれています。これを回避する方法はありますか?

編集

when_validate_itemを使用する必要があります。これは、フィールドが変更されたときに実行する必要があるプロシージャを実行する必要があるためですが、検証が実行される前に実行する必要があります。

4

3 に答える 3

12

通常、の使用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_PROCGO_BLOCK呼び出し、次にフィールドでいくつかの検証を行いますNumber 2

ここに画像の説明を入力してください

ここはP_CALL_PROC

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

ここに画像の説明を入力してください

フォームの動作を確認するためのYoutubeリンクは次のとおりです

于 2012-09-26T19:40:09.423 に答える
0

この種の問題に遭遇したとき、私は通常、フォーム自体の書き直しや再設計の問題を修正することができました。つまり、検証の前にフォーカスを別のアイテムに移動する手順を使用する必要があるのはなぜですか?

この種の問題を回避できるようにするには、フォームのヘルプを読んで、制限付きビルトインで問題が発生しているトリガーを確認することをお勧めします。フォームがどのように機能するかについて十分な知識があれば、これらの種類の問題のほとんどを解決できるはずです。問題を回避できないまれなケースでは、タイマーの回避策を使用しました。

于 2012-09-27T12:22:23.813 に答える
0

POST-CHANGEトリガーを使用してみることができます。

于 2012-09-26T19:40:18.487 に答える