Oracle Forms:预删除触发器中的警报不起作用
Posted
技术标签:
【中文标题】Oracle Forms:预删除触发器中的警报不起作用【英文标题】:Oracle Forms: alert in pre-delete trigger not working 【发布时间】:2016-12-21 11:04:30 【问题描述】:我有一个包含 4 列的表 OBJECTS:id、type_id、type_desc 和 state_id。
如果 state_id 是“DELETE”,我想中止删除行并显示一条警告消息,提示“您无法删除此行”。 这是 PRE_DELETE 触发器:
begin
if :OBJECTS.state_id = 'DELETE' then
set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');
if show_alert('ALERT_DEL') = alert_button1 then
null;
end if;
raise FORM_TRIGGER_FAILURE;
end if;
end;
很遗憾,警报消息不会显示。
编辑: 我之前忘了提这个: Oracle Forms 返回错误 FRM-40741: Unable to locate record 0 on block OBJECTS。
编辑: 我也在尝试做一个 PRE-UPDATE 触发器:
declare
stateID varchar2(10);
pressed_button number(2,0);
info number(2,0);
begin
stateID := get_item_property(:OBJECTS.state_id, DATABASE_VALUE);
set_alert_property('ALERT_INFO',alert_message_text,'STATE_ID: ' || stateID);
info := show_alert('ALERT_INFO');
if stateID = 'DELETE' then
set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');
pressed_button := show_alert('ALERT_EDIT');
raise FORM_TRIGGER_FAILURE;
end if;
end;
我收到错误 FRM-40105:无法解析对项目 DELETE 的引用。 所以我创建了 ALERT_INFO 警报来显示存储在数据库中的 state_id 的值。我什么也没显示。我做错了什么?
【问题讨论】:
【参考方案1】:没有要测试的表单,但在 IF 语句中使用 SHOW_ALERT() 看起来,嗯,不确定。试试这个:
declare
pressed_button number(2,0);
begin
if :OBJECTS.state_id = 'DELETE' then
set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');
pressed_button := show_alert('ALERT_DEL');
raise FORM_TRIGGER_FAILURE;
end if;
end;
您可以在pressed_button
上添加一个测试以查看实际按下了哪个按钮,但这似乎对您发布的代码没有任何影响。
【讨论】:
【参考方案2】:您的代码似乎没问题。如果我在 PRE-DELETE 触发器中尝试简化代码
begin
if show_alert('ALERT_DEL') = alert_button1 then
raise form_trigger_failure;
end if;
end;
它像预期的那样工作(Oracle Forms 6i)。
我猜你的 :OBJECTS.state_id 不是 'DELETE'。
编辑:FRM-40741 - 就是这样!问题在线
set_item_instance_property('OBJECTS.state_id', CURRENT_RECORD, VISUAL_ATTRIBUTE, 'ERROR');
您尝试设置已删除记录的可视属性,在您的情况下,CURRENT_RECORD 变量设置为 0。
不要为您的任务使用 PRE-DELETE 触发器。在 OBJECTS 块的 WHEN-NEW-RECORD-INSTANCE 触发器中禁用记录删除:
if :OBJECTS.state_id = 'DELETE' then
set_block_property('OBJECTS', DELETE_ALLOWED, PROPERTY_FALSE);
else
set_block_property('OBJECTS', DELETE_ALLOWED, PROPERTY_TRUE);
end if;
【讨论】:
以上是关于Oracle Forms:预删除触发器中的警报不起作用的主要内容,如果未能解决你的问题,请参考以下文章