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

Oracle APEX 23.2:如何遍历交互式网格实现角色勾选校验?

Oracle APEX 23.2 交互式网格遍历与状态处理方案

针对你在迁移Oracle Forms到APEX时遇到的交互式网格(IG)遍历问题,以下是具体实现步骤:

1. 前置准备

  • 为交互式网格设置静态ID(如ROLE_GRID)
  • 创建两个隐藏页面项:P1_ROLE_DATA和P1_PROCESSED_DATA,类型设为Textarea,均勾选「受保护」

2. 动态操作(DA)配置

在Enabled复选框的「变更/点击」事件下,添加三个动作,按顺序执行:

动作1:执行JavaScript(收集网格数据)

// 获取IG实例与数据模型
var ig = apex.region("ROLE_GRID").widget().interactiveGrid("getViews","grid").model;
var roleList = [];

// 遍历所有行,收集角色名称与当前启用状态
ig.getRecords().forEach(row => {
    roleList.push({
        ROLE_NAME: ig.getValue(row, "ROLE_NAME"),
        ENABLED: ig.getValue(row, "ENABLED")
    });
});

// 将数据存入隐藏页面项
apex.item("P1_ROLE_DATA").setValue(JSON.stringify(roleList));

动作2:执行服务器端PL/SQL(校验并处理状态)

DECLARE
    l_role_json  clob := :P1_ROLE_DATA;
    l_json_arr   apex_json.t_values;
    l_row_count  pls_integer;
    l_role_name  varchar2(100);
    l_current_en boolean;
    l_final_en   boolean;
BEGIN
    -- 解析JSON数组
    apex_json.parse(l_json_arr, l_role_json);
    l_row_count := apex_json.get_count(l_json_arr, '/');

    -- 初始化输出JSON
    apex_json.initialize_clob_output;
    apex_json.open_array;

    -- 遍历每个角色执行校验逻辑
    FOR i IN 1..l_row_count LOOP
        l_role_name := apex_json.get_varchar2(l_json_arr, '/' || i || '/ROLE_NAME');
        l_current_en := apex_json.get_boolean(l_json_arr, '/' || i || '/ENABLED');

        -- 替换为你的原有Forms校验逻辑(示例逻辑)
        IF l_role_name = 'SUPER_ADMIN' THEN
            -- 超级管理员强制启用
            l_final_en := TRUE;
        ELSIF l_role_name = 'GUEST' AND l_current_en = TRUE THEN
            -- 禁止启用访客角色
            l_final_en := FALSE;
        ELSE
            -- 其他角色保留原状态
            l_final_en := l_current_en;
        END IF;

        -- 写入处理后的结果
        apex_json.open_object;
        apex_json.write('ROLE_NAME', l_role_name);
        apex_json.write('ENABLED', l_final_en);
        apex_json.close_object;
    END LOOP;

    apex_json.close_array;
    -- 将结果传递给前端
    :P1_PROCESSED_DATA := apex_json.get_clob_output;
    apex_json.free_output;
END;

动作3:执行JavaScript(更新网格状态)

// 解析处理后的结果
var processedData = JSON.parse(apex.item("P1_PROCESSED_DATA").getValue());
var ig = apex.region("ROLE_GRID").widget().interactiveGrid("getViews","grid").model;

// 遍历结果更新对应行的Enabled状态
processedData.forEach(item => {
    // 根据角色名称找到对应行
    var targetRow = ig.findFirst(row => ig.getValue(row, "ROLE_NAME") === item.ROLE_NAME);
    if (targetRow) {
        ig.setValue(targetRow, "ENABLED", item.ENABLED);
    }
});

// 刷新网格视图
apex.region("ROLE_GRID").widget().interactiveGrid("refresh");

关键注意事项

  • 确保IG列的静态ID与代码中使用的字段名(ROLE_NAME、ENABLED)完全一致
  • 若原有Forms的WHEN-CHECKBOX-CHANGED逻辑复杂,直接替换PL/SQL块中的校验部分即可
  • 隐藏页面项需设置为「受保护」,避免前端恶意篡改数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 08:55:11