2016-12-21 3 views
0

ID, type_id, type_desc 및 state_id의 4 개 열이있는 OBJECTS 테이블이 있습니다.Oracle Forms : 사전 삭제 트리거가 작동하지 않음

state_id가 '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; 

불행하게도, 경고 메시지가 표시되지 않습니다 : 다음은 PRE_DELETE 트리거입니다.

편집 : 오류 FRM-40741을 반환 오라클 양식 : 블록 객체에 대한 기록 공을 찾을 수 없습니다 내가이 전에 언급하는 것을 잊었다.

편집 : 나는 또한 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를 얻을. 그래서 데이터베이스에 저장된 state_id의 값을 표시하기 위해 ALERT_INFO 경고를 만들었습니다. 나는 아무것도 보여주지 않는다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

테스트 할 양식이 없지만 IF 문에서 SHOW_ALERT()를 사용하면 ifum, if, if가 생깁니다.

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

코드가 정상인 것 같습니다. PRE-DELETE 트리거에서 단순화 된 코드를 시도하면

begin 
    if show_alert('ALERT_DEL') = alert_button1 then 
     raise form_trigger_failure; 
    end if; 
end; 

예상대로 작동합니다 (Oracle Forms 6i).

당신의 짐작 컨대 : OBJECTS.state_id가 'DELETE'가 아닙니다.

편집 : FRM-40741 - 그것입니다! 문제는 라인

당신은 삭제 기록의 시각적 속성을 설정하려고
set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR'); 

에, 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;