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:创建页面级动态动作
- 新建动态动作,触发条件选择交互式网格 - 数据已刷新(Interactive Grid - Data Refreshed),目标选择你的交互式网格。
- 添加"执行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
相关产品推荐
相关产品推荐

