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