2012-07-16 3 views
2

데이타베이스의 특정 테이블에서 채워지는 테이블 형식의 행을 가진 Oracle Forms 6i에서 실행되는 양식이 있습니다. 한 열에는 사용자가 가능한 값 중에서 선택할 수 있도록 [List_Of_Values] 속성이 활성화되어 있습니다.Oracle Forms 6i에서 레코드의 변경 사항을 되돌릴 수 있습니까?

목록의 일부 값은 사용자가이를 수행 할 권한이있는 경우에만 선택할 수 있으며 값을 변경 한 후에는 권한을 확인하기 위해 [WHEN-VALIDATE-ITEM] 트리거를 만들었습니다. 트리거는 form_trigger_failure를 발생시켜 사용자가 변경 사항을 저장하지 못하게합니다.

문제는 사용자가 값을 선택할 수있는 권한이 없다는 알림을 받으면 양식을 취소하지 않는 한 이전 값 (이전 값)을 다시 알기위한 방법이 없다는 것입니다. 그의 다른 (유효한) 변경 사항도 잃게됩니다. 여기

내가 ROLLBACK을 시도했지만 그 형태에 이전 값을 되 돌리지 않았다

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; 

트리거에서 작성한 코드입니다. SYNCHRONIZE도 시도했지만 효과가 없습니다. 값을 꺼내기 위해 데이터베이스 테이블을 다시 거치는 것 외에 다른 옵션이 있습니까? 다음과 같이 내 동료의

+0

IF THEN 조건에서 실수를했습니다. 수정했습니다. 대답을 기다리는 중. – Ahmad

+0

값을 보존하기 위해 전역 변수를 사용할 수 있는지 확인하십시오. – psaraj12

+0

@ psaraj12 확인해 보니이 문제를 해결할 수있었습니다. 아래 내 대답을 확인 – Ahmad

답변

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; 
+0

노력 주셔서 감사하지만 그 작동하지 않았다. 그것은 심지어 오류를 유발하지 않았습니다. Forms 6i는 메시지를 무시한 것 같습니다. – Ahmad

+0

RAISE FORM_TRIGGER_FAILURE를 추가해야합니다. – jva

+0

+1 DATABASE_VALUE 항목 속성을 사용하면 이러한 문제를 해결하기위한 첫 번째 환경 설정이됩니다. –

1

하나는이 문제에 대한 해결책을 발견 :

  1. 매개 변수 목록에서 글로벌 매개 변수를 정의되는합니다 (PRE-TEXT-ITEM 트리거에서

  2. (나는 그것을 TEMP_LOCATION 이름) 항목을 탐색하기 전에 실행) 내가 작성한

    BEGIN : GLOBAL.TEMP_LOCATION : = : BLK_MAT_STG_PLACES_PILE.STG_LOC_ID; END;

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; 

으로 항목을 채웠다. 누군가 내 자신보다 더 나은 대답을 내놓으면 행복하게 받아 들일 것입니다.

관련 문제