2012-07-16 95 views
2

我有一個表格在Oracle Forms 6i中運行,它具有從數據庫中的某個表填充的表格格式行。一列具有[List_Of_Values]屬性,允許用戶在可能的值中進行選擇。如何恢復對Oracle Forms 6i中記錄的更改?

只有當用戶有權這樣做時,才能選擇列表中的某些值,並且創建了[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,但那沒有效果。除了再次通過數據庫表來提取值之外,還有其他選擇嗎?

+0

我在IF THEN條件中犯了一個錯誤,我糾正了它。仍在等待答案。 – Ahmad 2012-07-17 04:41:52

+0

只需檢查是否可以使用全局變量來保存值 – psaraj12 2012-07-17 05:05:37

+0

@ psaraj12我確實檢查過,這就是我能夠解決這個問題的方法。檢查我的答案 – Ahmad 2012-07-17 05:06:52

回答

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 2012-07-17 07:02:40

+0

我應該添加RAISE FORM_TRIGGER_FAILURE; – jva 2012-07-17 07:03:55

+0

+1使用DATABASE_VALUE項屬性是我解決這類問題的第一選擇。 – 2012-07-17 07:06:23

1

我的一個同事找到了解決這個問題如下:

  1. 在參數列表中定義一個全局參數(我把它命名爲TEMP_LOCATION

  2. PRE-TEXT-ITEM觸發(這是在導航到該項目之前執行)我寫了

    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; 

我感謝所有那些誰試圖幫助填補了國內項目。如果有人提出比我自己更好的答案,那麼我會高興地接受它。