如何在Oracle APEX中通过JavaScript动态操作调用交互式网格/报表的groupBy动作?
在Oracle APEX 23.1.0中通过按钮触发JS实现交互式网格/报表的分组统计
完全可行,针对交互式报表(IR)和交互式网格(IG)的实现方式略有不同,具体步骤如下:
一、针对交互式报表(IR)的实现
- 创建触发按钮:在页面合适位置(如报表工具栏、页面区域)添加按钮,可设置静态ID方便识别。
- 添加动态操作:
- 触发事件选择「按钮点击」,绑定到刚创建的按钮。
- 动作选择「执行JavaScript代码」,输入以下代码(替换
YOUR_IR_STATIC_ID为你的交互式报表静态ID):
// 获取当前交互式报表实例 var irInstance = apex.region("YOUR_IR_STATIC_ID").widget().interactiveReport("getCurrentView"); // 清除现有分组规则 irInstance.model.clearGroupBy(); // 设置COL1、COL2为分组列 irInstance.model.addGroupBy("COL1"); irInstance.model.addGroupBy("COL2"); // 启用汇总行,统计每组行数 irInstance.model.setAggregation("ROW_COUNT", { type: "COUNT", label: "行数", columnAlias: "ROW_COUNT" }); // 刷新报表应用更改 irInstance.refresh();
二、针对交互式网格(IG)的实现
- 创建触发按钮:步骤同IR,添加按钮并绑定动态操作。
- 编写JavaScript代码:
交互式网格的API与IR不同,需使用以下代码(替换YOUR_IG_STATIC_ID为你的网格静态ID):
// 获取交互式网格的网格视图实例 var igInstance = apex.region("YOUR_IG_STATIC_ID").widget().interactiveGrid("getViews", "grid"); // 清除现有分组 igInstance.model.clearGroupBy(); // 设置COL1、COL2为分组列 igInstance.model.groupBy(["COL1", "COL2"]); // 配置行数统计的聚合列 var countCol = igInstance.model.getColumn("ROW_COUNT"); if (!countCol) { // 若网格中无统计列,动态添加计算列 igInstance.model.addColumn({ type: "NUMBER", alias: "ROW_COUNT", label: "行数", isComputed: true, computeExpression: "COUNT(*)", aggregationType: "COUNT" }); } else { // 若已存在列,直接设置聚合类型 countCol.aggregationType = "COUNT"; } // 刷新网格应用更改 igInstance.view$.grid("refresh");
注意事项
- 确保
COL1、COL2是报表/网格中实际存在的列名(区分大小写,需与后端数据源列名一致)。 - 交互式网格中,若提前在网格定义里创建了隐藏的
ROW_COUNT计算列,可省略动态添加列的逻辑,直接启用聚合即可。 - 测试时需确保页面完全加载后再触发按钮,避免因DOM未初始化导致的对象获取失败。
内容的提问来源于stack exchange,提问作者The Bosco
相关产品推荐
相关产品推荐

