我有一个在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,但这没有效果。除了再次通过数据库表以取出值之外,还有其他选择吗?
答案 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)
我的一位同事发现了这个问题的解决方案如下:
在参数列表中定义全局参数(我将其命名为TEMP_LOCATION
)
在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;
我感谢所有试图提供帮助的人。如果有人提出了比我自己更好的答案,那么我很乐意接受它。