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:预删除触发器中的警报不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Oracle Forms 中的触发器修改按钮的状态

oracle 10g - 监控大行删除

插入或删除后的 Oracle 触发器

在 Oracle Forms 中按升序查看记录

如果触发器中的语句不起作用 SQL(Oracle)

Oracle Forms - 如何加快 POST_QUERY 触发器?