Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将更改还原到Oracle Forms 6i中的记录?_Oracle_Triggers_Plsql_Oracleforms - Fatal编程技术网

如何将更改还原到Oracle Forms 6i中的记录?

如何将更改还原到Oracle Forms 6i中的记录?,oracle,triggers,plsql,oracleforms,Oracle,Triggers,Plsql,Oracleforms,我有一个在Oracle Forms 6i中运行的表单,该表单具有表格格式的行,这些行是从数据库中的某个表填充的。其中一列启用了[值列表]属性,允许用户在可能的值中进行选择 列表中的一些值只有在用户有权限的情况下才能选择,我已经创建了一个[WHEN-VALIDATE-ITEM]触发器,在值更改后检查权限。触发器引发form_trigger_失败,以阻止用户保存所做的更改 问题是,如果通知用户没有选择值的权限,则用户无法知道以前的(旧)值以再次选择它,除非取消表单,这将导致其其他(有效)更改也丢失

我有一个在Oracle Forms 6i中运行的表单,该表单具有表格格式的行,这些行是从数据库中的某个表填充的。其中一列启用了[值列表]属性,允许用户在可能的值中进行选择

列表中的一些值只有在用户有权限的情况下才能选择,我已经创建了一个[WHEN-VALIDATE-ITEM]触发器,在值更改后检查权限。触发器引发form_trigger_失败,以阻止用户保存所做的更改

问题是,如果通知用户没有选择值的权限,则用户无法知道以前的(旧)值以再次选择它,除非取消表单,这将导致其其他(有效)更改也丢失

这是我在触发器中编写的代码

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;

我尝试过回滚,但没有将旧值恢复到表单。我也尝试了同步,但没有效果。除了再次检查数据库表以提取值之外,还有其他选择吗?

我的一位同事找到了这个问题的解决方案,如下所示:

  • 在参数列表中定义一个全局参数(我将其命名为
    TEMP\u LOCATION

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

    开始 :GLOBAL.TEMP\u LOCATION:=:BLK\u MAT\u STG\u PLACES\u PILE.STG\u LOC\u ID; 结束

  • 3然后在我在这个问题中编写的
    WHEN-VALIDATE-ITEM
    trigger code中,我取消了引发
    FORM\u trigger\u FAILURE
    ,并简单地用
    TEMP\u位置填充该项

    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;
    

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

    我在IF-THEN条件中犯了一个错误,我纠正了它。仍在等待答案。只需检查是否可以使用全局变量来保留value@psaraj12我确实检查过了,这就是我解决这个问题的方法。在下面检查我的答案谢谢你的努力,但那不起作用。它甚至没有触发错误。我想表格6我只是忽略了这个信息。我应该加上提高表格触发失败+1使用DATABASE_VALUE item属性是我解决这类问题的第一选择。@JeffreyKemp如果只从[List_of_Values]中选择一个值,它将不会在表单上显示之前直接存储到数据库中。因此,检索数据库值将只检索用户选择的值,而不是运行表单之前数据库中的值。否,database_值是从数据库查询行时项目的值。它不是“由用户选择”的值。不管怎样,你告诉@jva“这确实有效”——所以如果你让它起作用,我建议你在这里提出你的解决方案。
    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;