2

データベース内の特定のテーブルから移入されている表形式の行を含むフォームを Oracle Forms 6i で実行しています。1 つの列には [List_Of_Values] プロパティが有効になっており、ユーザーが可能な値の中から選択できるようになっています。

リスト内の一部の値は、ユーザーがそれを行う権限を持っている場合にのみ選択できます。値が変更された後に権限を確認する [ WHEN-VALIDATE-ITEM ] トリガーを作成しました。トリガーは form_trigger_failure を発生させて、ユーザーが行った変更を保存できないようにします。

問題は、ユーザーが値を選択する権限がないことを通知された場合、フォームがキャンセルされて他の (有効) の変更も失われます。

ここに私がトリガーに書いたコードがあります

DECLARE
NEW_LOCATION  VARCHAR2(100);
BEGIN
NEW_LOCATION := :BLK_MAT_STG_PLACES_PILE.STG_LOC_ID;

    IF NEW_LOCATION LIKE 'OH01%' THEN
        IF NOT :GLOBAL.USER_ID LIKE 'Admin%' THEN
            MESSAGEBOX('You are not authorized to select this value');

            /* What can I write to load the old value to this item? */ 
            RAISE FORM_TRIGGER_FAILURE;
        END IF;
    END IF;
END;

ROLLBACK を試しましたが、古い値がフォームに戻りませんでした。SYNCHRONIZE も試しましたが、効果はありませんでした。データベーステーブルを再度調べて値を引き出す以外にオプションはありますか?

4

2 に答える 2

5
BEGIN    
    IF NEW_LOCATION LIKE 'OH01%' THEN
        IF NOT :GLOBAL.USER_ID LIKE 'Admin%' THEN
            MESSAGEBOX('You are not authorized to select this value');

            /* Return it to the original value that was fetched from database */ 
            :BLK_MAT_STG_PLACES_PILE.STG_LOC_ID :=
              get_item_property('BLK_MAT_STG_PLACES_PILE.STG_LOC_ID'
                               ,DATABASE_VALUE);

            RAISE FORM_TRIGGER_FAILURE;
        END IF;
    END IF;
END;
于 2012-07-17T06:37:29.970 に答える
1

私の同僚の 1 人が、この問題の解決策を次のように見つけました。

  1. パラメーター リストでグローバル パラメーターを定義します (私は名前を付けましたTEMP_LOCATION) 。

  2. トリガー(アイテムに移動する前にPRE-TEXT-ITEM実行される)に私が書いた

    開始:GLOBAL.TEMP_LOCATION:=:BLK_MAT_STG_PLACES_PILE.STG_LOC_ID; 終わり;

3 次に、WHEN-VALIDATE-ITEMこの質問に書いたトリガー コードで、レイズをキャンセルFORM_TRIGGER_FAILUREし、単純に項目にTEMP_LOCATION

DECLARE
    NEW_LOC  VARCHAR2(100);
BEGIN
        NEW_LOC := :BLK_MAT_STG_PLACES_PILE.STG_LOC_ID;

        IF   NEW_LOC LIKE 'OH01%' THEN

            IF NOT :GLOBAL.USER_ID LIKE 'Admin_%' THEN

                MESSAGE('YOU ARE NOT AUTHORIZED TO SELECT THIS VALUE');

                :BLK_MAT_STG_PLACES_PILE.STG_LOC_ID := :GLOBAL.TEMP_LOCATION;  
                  /* this solved my problem */

            END IF;

        END IF;
END;

助けようとしてくれたすべての人に感謝します。誰かが私よりも優れた答えを思いついた場合、私は喜んでそれを受け入れます。

于 2012-07-17T05:02:13.263 に答える