如何在Oracle Forms 6i中还原对记录的更改?

时间:2012-07-16 06:05:59

标签: oracle triggers plsql oracleforms

我有一个在Oracle Forms 6i中运行的表单,该表单具有从数据库中的某个表填充的表格格式化的行。一列启用了[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,但这没有效果。除了再次通过数据库表以取出值之外,还有其他选择吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

我的一位同事发现了这个问题的解决方案如下:

  1. 在参数列表中定义全局参数(我将其命名为TEMP_LOCATION

  2. PRE-TEXT-ITEM触发器(导航到该项目之前执行)我写了

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

  3. 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;
    

    我感谢所有试图提供帮助的人。如果有人提出了比我自己更好的答案,那么我很乐意接受它。