You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:39:02