2016-12-21 28 views
0

私は4つの列(id、type_id、type_desc、state_id)のテーブルOBJECTSを持っています。Oracle Forms:事前削除トリガーでアラートが機能しない

state_idが 'DELETE'の場合は、行の削除を中止し、「この行を削除できません」という警告メッセージを表示します。 はここPRE_DELETEトリガーがあります:

begin 
    if :OBJECTS.state_id = 'DELETE' then 
    set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR'); 

    if show_alert('ALERT_DEL') = alert_button1 then 
     null; 
    end if; 

    raise FORM_TRIGGER_FAILURE; 
    end if; 
end; 

残念ながら、警告メッセージが表示されません。

編集: 私は前にこれを言及するのを忘れてしまった: Oracle Formsは、エラーFRM-40741を返す:ブロックオブジェクト上で、レコード0を見つけることができません。

編集: 私もPRE-UPDATEトリガをやろうとしている:

declare 
    stateID varchar2(10); 
    pressed_button number(2,0); 
    info number(2,0); 
begin 
    stateID := get_item_property(:OBJECTS.state_id, DATABASE_VALUE); 

    set_alert_property('ALERT_INFO',alert_message_text,'STATE_ID: ' || stateID); 
    info := show_alert('ALERT_INFO'); 

    if stateID = 'DELETE' then 
    set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR'); 
    pressed_button := show_alert('ALERT_EDIT'); 
    raise FORM_TRIGGER_FAILURE; 
    end if; 

end; 

私はエラーFRM-40105を取得します:DELETEアイテムへの参照を解決できません。 したがって、ALERT_INFOアラートを作成して、データベースに格納されているstate_idの値を表示しました。私は何も示していない。私は間違って何をしていますか?

答えて

0

テストするフォームはありませんが、IF文でSHOW_ALERT()を使用するとlook、um、iffyとなります。代わりにこれを試してみてください:

declare 
    pressed_button number(2,0); 
begin 
    if :OBJECTS.state_id = 'DELETE' then 
    set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR'); 

    pressed_button := show_alert('ALERT_DEL'); 

    raise FORM_TRIGGER_FAILURE; 
    end if; 
end; 

あなたは、実際のボタンが押されたかを確認するためにpressed_buttonにテストを追加することができますが、あなたが投稿したコード内の任意の違いを確認していないようです。

0

あなたのコードはOKと思われます。 PRE-DELETEトリガーで簡略化したコードを試すと、期待通り(Oracle Forms 6i)のように機能します。

私はあなたのyout推測:OBJECTS.state_idは 'DELETE'ではありません。

編集:FRM-40741 - それはです!問題は、あなたが削除したレコードの視覚的なプロパティを設定しようとするライン上

​​

で、CURRENT_RECORD変数は、あなたの場合には0に設定されています。

タスクにPRE-DELETEトリガーを使用しないでください。 OBJECTSブロックのWHEN-NEW-RECORD-INSTANCEトリガーでレコード削除を無効にする:

if :OBJECTS.state_id = 'DELETE' then 
    set_block_property('OBJECTS', DELETE_ALLOWED, PROPERTY_FALSE); 
else 
    set_block_property('OBJECTS', DELETE_ALLOWED, PROPERTY_TRUE); 
end if; 
関連する問題