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

在APEX中点击按钮将勾选行移至另一表的实现方法

APEX交互式网格选中行移动到另一表并提示的实现方案

一、先修正你现有实现的问题

你当前的代码存在两个核心问题:

  1. 在APEX动态动作里重复绑定按钮click事件,容易导致逻辑多次执行;
  2. 通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:32:48