在Oracle Apex交互式报表的_save事件之前执行查询



我最近发现了一篇关于"[如何拦截APEX中的交互式报表保存和删除功能][1]",非常有帮助!但是我需要在这个事件之前做一些验证,我不知道怎么做,我想知道你是否可以帮助我解决这个问题。

主要目标是限制可以保存一个用户的私有报表的数量,例如每个用户只能保存1个私有报表。

这是拦截这些事件的代码:

$(document).ready(function() {
$.widget("apex.interactiveReport", $.apex.interactiveReport, {

// Saving a Default report
_saveDefault: function () {
console.log("_saveDefault");
console.log(this);
console.log(this._getId("report_name"));
console.log('stopping');
// return this._super();
},
// Saving a Public or Private reports
_save: function () {
console.log('_save');
console.log(this);
console.log(this._getId("report_name"));
console.log('stopping');
// return this._super();
},
// Deleting a report (user clicking the "X")
_remove: function () {
console.log('_remove');
console.log(this);
console.log(this._getId("report_name"));
console.log('stopping');
// return this._super();
}
});
});```

[1]: https://www.talkapex.com/2019/02/how-to-intercept-interactive-report-save-and-delete-functions-in-apex/

请注意,您引用的博客文章使用了未记录的特性。不能保证该功能在未来的版本中不会更改,也不支持它们。您可以用一种不同的(受支持的)方式做到这一点,使用数据字典视图和APEX_IRAPI。它不像javascript那样干净(顺便说一下,我不知道如何实现)。

这就是我所做的(我的应用程序是28183,页面是7)。逻辑是IR刷新后(如果您保存一个私有报告,该区域被刷新),检查pl/sql是否超过了私有报告的最大数量。如果是,则删除最后一个,并以警告通知用户。

  • 创建页面项P7_MAX_REACHED
  • 创建交互式报表区域刷新后的动态操作
  • 创建一个执行服务器端代码的真实动作,源代码:
BEGIN
select COUNT(report_id) INTO :P7_MAX_REACHED from  APEX_APPLICATION_PAGE_IR_RPT where application_id = 28183 AND page_id = 7 AND report_type ='PRIVATE';
EXCEPTION WHEN OTHERS THEN
:P7_MAX_REACHED := 0;
END;
  • 现在用客户端条件Item>创建第二个动态动作来改变p7_max_reach;Value (Item P7_MAX_REACHED, Value 1)
  • 创建一个Alert类型的真实动作,文本为"Can only save 1 Private report">
  • 创建一个真正的动作类型为执行服务器端代码与源
BEGIN
FOR r IN 
(SELECT report_id, ROW_NUMBER() OVER (ORDER BY created_on ASC) AS rn
FROM  APEX_APPLICATION_PAGE_IR_RPT where application_id = 28183 AND page_id = 7 AND report_type ='PRIVATE'
)
LOOP
IF r.rn > 1 THEN
APEX_IR.DELETE_REPORT(p_report_id => r.report_id);  
END IF;
END LOOP;
END;
  • 添加另一个类型为刷新交互式报告区域的真动作

最新更新