2

我有一个在 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,但没有效果。除了再次通过数据库表提取值之外,还有其他选择吗?

4

2 回答 2

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;
于 2012-07-17T06:37:29.970 回答
1

我的一位同事找到了解决此问题的方法如下:

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

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

    开始 :GLOBAL.TEMP_LOCATION := :BLK_MAT_STG_PLACES_PILE.STG_LOC_ID; 结尾;

3 然后在WHEN-VALIDATE-ITEM我在这个问题中写的触发代码中,我取消了 raiseFORM_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;

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

于 2012-07-17T05:02:13.263 回答