Oracle APEX交互式报表_save事件前执行校验 限制用户私有报告保存数量
Oracle APEX 交互式报告(IR)保存/删除事件拦截及私有报告数量限制方案
你当前使用jQuery组件工厂重写apex.interactiveReport原生方法的逻辑是正确的,仅需要在拦截方法中补充校验逻辑即可实现限制单用户最多保存1份私有报告的需求,完整实现如下:
前置准备(服务端校验接口)
先在APEX应用中创建一个按需执行的应用进程,命名为GET_USER_PRIVATE_IR_COUNT,进程代码示例(可根据实际表结构调整):
DECLARE l_count NUMBER; BEGIN SELECT COUNT(*) INTO l_count FROM apex_application_page_ir_rpt WHERE application_id = :APP_ID AND page_id = :APP_PAGE_ID AND region_id = :PXX_IR_REGION_ID -- 替换为你的IR区域ID绑定变量 AND report_type = 'PRIVATE' AND created_by = :APP_USER; apex_json.open_object; apex_json.write('count', l_count); apex_json.close_object; EXCEPTION WHEN OTHERS THEN apex_json.open_object; apex_json.write('count', 999); apex_json.close_object; END;
前端拦截逻辑完善
修改你现有的JS代码,补充校验逻辑:
$(document).ready(function() { $.widget("apex.interactiveReport", $.apex.interactiveReport, { // 保存默认报告 _saveDefault: function () { // 可根据需求补充默认报告保存的校验逻辑 console.log("拦截默认报告保存操作"); // 校验通过则执行原生逻辑:return this._super(); }, // 保存公共/私有报告 _save: function () { const self = this; // 获取本次保存的报告类型 const reportType = $(this.element).find('select[name="report_type"]').val(); // 仅校验私有报告 if(reportType === 'PRIVATE') { // 调用服务端接口查询当前用户已有私有报告数量 apex.server.process( 'GET_USER_PRIVATE_IR_COUNT', {x01: this.regionId}, // 可传递IR区域ID参数 { success: function(res) { if(res.count >= 1) { apex.message.showError('您最多只能保存1份私有报告,请先删除已有私有报告后再尝试保存。'); } else { // 校验通过,执行原生保存逻辑 self._super(); } }, error: function() { apex.message.showError('校验报告数量失败,请稍后重试。'); } } ); } else { // 公共报告不需要限制,直接执行原生逻辑 this._super(); } }, // 删除报告 _remove: function () { // 可根据需求补充删除操作的校验逻辑 console.log("拦截报告删除操作"); // 校验通过则执行原生逻辑:return this._super(); } }); });
注意事项
- 该JS代码需要放在IR组件初始化之前加载,推荐放在页面「页脚文本」区域,或者全局JavaScript文件中
- 服务端查询私有报告数量的逻辑可根据你的实际权限、业务规则调整,避免前端校验被绕过
- 若需要适配多个IR区域,可将区域ID作为参数传递给应用进程,无需为每个IR单独写校验逻辑
内容的提问来源于stack exchange,提问作者Leonardo Velasquez
相关产品推荐
相关产品推荐

