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
相关产品推荐
相关产品推荐

