在APEX中点击按钮将勾选行移至另一表的实现方法
APEX交互式网格选中行移动到另一表并提示的实现方案
一、先修正你现有实现的问题
你当前的代码存在两个核心问题:
- 在APEX动态动作里重复绑定按钮click事件,容易导致逻辑多次执行;
- 通过DOM选择器硬找复选框和列值,APEX交互式网格(IG)的DOM结构可能随版本变化,这种写法稳定性差,应该用官方提供的IG API操作。
二、具体实现步骤
1. 调整动态动作配置
- 找到你创建的按钮对应的动态动作,把Action从「Show」改成「Execute JavaScript Code」;
- 触发事件保持「Button Click」,选择对应的目标按钮;
- 无需设置Selection Type,直接在JavaScript代码区域编写执行逻辑。
2. 替换为稳定的IG API代码
根据你的需求,分两种场景提供代码:
场景1:仅前端页面移动行(不操作数据库)
// 获取源交互式网格的实例 var sourceIg = apex.region("sourcetable").widget().interactiveGrid("getViews", "grid"); // 获取选中的行记录 var selectedRows = sourceIg.getSelectedRecords(); // 遍历选中行 selectedRows.forEach(function(record) { // 从选中记录中获取字段值(替换成你实际的列名,比如ID、NAME) var id = record.getValue("ID"); var name = record.getValue("NAME"); // 获取类型值(沿用你原代码的逻辑) var type = "Type " + $('input[name="linkType"]:checked').val(); // 检查目标表中是否已存在该行 if ($("#targettable tr:contains('" + id + "')").length === 0) { // 追加到目标表 $("#targettable").append(`<tr><td>${id}</td><td>${name}</td><td>${type}</td></tr>`); // 可选:从源IG前端移除选中行 sourceIg.removeRecords([record]); } }); // 显示成功提示 apex.message.showPageSuccess("已移动选中行");
场景2:需要同步操作数据库(持久化数据)
如果要把数据真正从源表移动到目标表,需要添加AJAX调用执行PL/SQL:
// 获取源IG选中行的ID集合 var sourceIg = apex.region("sourcetable").widget().interactiveGrid("getViews", "grid"); var selectedIds = sourceIg.getSelectedRecords().map(function(record) { return record.getValue("ID"); }); // 如果没有选中行,直接提示 if (selectedIds.length === 0) { apex.message.showPageError("请先选中要移动的行"); return; } // 获取类型值 var linkType = "Type " + $('input[name="linkType"]:checked').val(); // 调用APEX AJAX执行PL/SQL apex.server.process("MOVE_SELECTED_ROWS", { x01: selectedIds.join(","), // 把选中ID拼成字符串传递 x02: linkType }, { success: function() { // 刷新源IG和目标表区域(替换成你的区域静态ID) apex.region("sourcetable").refresh(); apex.region("targettable").refresh(); // 显示成功提示 apex.message.showPageSuccess("已移动选中行"); }, error: function() { apex.message.showPageError("移动失败,请重试"); } });
然后需要创建一个名为MOVE_SELECTED_ROWS的AJAX Process,执行PL/SQL逻辑:
DECLARE l_ids apex_t_varchar2; BEGIN -- 拆分传递的ID字符串 l_ids := apex_string.split(:x01, ','); -- 插入到目标表并删除源表行 FOR i IN 1..l_ids.count LOOP INSERT INTO target_table (id, name, type) SELECT id, name, :x02 FROM source_table WHERE id = l_ids(i); DELETE FROM source_table WHERE id = l_ids(i); END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; RAISE; END;
三、关键注意事项
- 替换代码中所有的列名(如ID、NAME)、**区域静态ID(sourcetable、targettable)**为你页面的实际值;
- 如果目标表也是交互式网格,不要用DOM追加行,同样用IG的API添加记录,或者直接刷新区域更稳妥;
apex.message.showPageSuccess是APEX内置的提示组件,风格和系统统一,比自定义提示更合适。
内容的提问来源于stack exchange,提问作者Itsme mylife
相关产品推荐
相关产品推荐

