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

Oracle APEX 21.2 IG最后一行自定义聚合实现求助

在Oracle APEX 21.2交互式网格实现动态自定义聚合行

针对你的需求,推荐使用JavaScript API动态计算聚合行,能完美响应交互式网格的过滤、排序操作,以下是具体实现步骤:

步骤1:准备交互式网格的SQL查询

在IG的基础查询中添加一个隐藏的标识列,用于区分普通数据行和聚合行:

SELECT 
    col1,
    col2,
    'DATA' AS row_type  -- 新增标识列,标记普通数据行
FROM your_table

将row_type列设置为隐藏(在IG列属性中找到该列,将"类型"改为"隐藏")。

步骤2:给IG设置静态ID

编辑交互式网格的属性,在"高级"选项卡中设置静态ID为ig_custom_agg(后续JS会用到这个ID定位IG)。

步骤3:创建页面级动态动作

  1. 新建动态动作,触发条件选择交互式网格 - 数据已刷新(Interactive Grid - Data Refreshed),目标选择你的交互式网格。
  2. 添加"执行JavaScript代码"操作,粘贴以下代码:
// 获取IG实例和数据模型
const ig = apex.region("ig_custom_agg").widget().interactiveGrid("getViews", "grid");
const model = ig.model;
const col1Key = model.getFieldKey("COL1");
const col2Key = model.getFieldKey("COL2");
const rowTypeKey = model.getFieldKey("ROW_TYPE");

// 初始化求和变量,处理空值/非数字
let sumCol1 = 0;
let sumCol2 = 0;
model.forEach(row => {
    const c1 = row[col1Key];
    const c2 = row[col2Key];
    if (c1 != null && !isNaN(c1)) sumCol1 += parseFloat(c1);
    if (c2 != null && !isNaN(c2) && c2 !== 0) sumCol2 += parseFloat(c2);
});

// 计算自定义聚合值,避免除以0
const aggValue = sumCol2 !== 0 ? Number(Math.round((sumCol1 / sumCol2)*100 + 'e2') + 'e-2') : 0;

// 移除旧的聚合行,避免重复
const oldAggRows = model.filter(row => row[rowTypeKey] === "AGG");
oldAggRows.forEach(row => model.deleteRow(row));

// 创建新聚合行
const newAggRow = model.createNewRow();
newAggRow[col1Key] = aggValue;
newAggRow[col2Key] = "占比合计";  // 可自定义显示文本
newAggRow[rowTypeKey] = "AGG";

// 添加到数据模型末尾并刷新视图
model.addRow(newAggRow, {at: model.getRecordCount()});
ig.viewGrid("refresh");

关键说明

  • 该方案基于当前IG加载的过滤后数据计算聚合值,完全响应用户的过滤、排序操作。
  • 代码中处理了空值和除以0的边界情况,避免报错。
  • 聚合行通过row_type标识,不会被用户的过滤条件影响。

内容的提问来源于stack exchange,提问作者womack2000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:34:52