Oracle Apex为每位员工实现交互式网格列自动递增
Oracle Apex交互式网格实现按员工单独递增EMP_SEQ的方案
第一步:将EMP_SEQ设置为只读
- 进入交互式网格的列配置界面,选中
EMP_SEQ列 - 在「安全性」选项区域,将「可编辑」设置为「否」,禁止用户手动修改该列值
第二步:实现选择员工后自动生成序列值
提供两种实用实现方式,可根据需求选择:
方式一:前端JavaScript实时计算(选完员工即刻生成值)
- 打开交互式网格的「高级」设置,找到「JavaScript初始化代码」
- 粘贴以下代码,逻辑为监听新增行及员工姓名选择事件,调用后台Ajax获取当前员工的最大序列值,加1后自动填充到
EMP_SEQ:
function(config) { var $ = apex.jQuery; var grid = config.grid; // 监听新增行动作 grid.on("rowadd", function(event, data) { var model = grid.model; var newRow = data.record; // 监听员工姓名选择变化 model.on("change:EMP_NAME", function(model, empName, options) { if (empName && options.record === newRow) { // 调用后台Ajax进程获取最大序列值 apex.server.process("GET_MAX_EMP_SEQ", { x01: empName }, { success: function(maxSeq) { var nextSeq = parseInt(maxSeq) + 1; // 给当前行的EMP_SEQ赋值 model.set(newRow, "EMP_SEQ", nextSeq); } }); } }); }); return config; }
- 创建对应Ajax进程:
- 进入「共享组件」→「Ajax进程」→「创建」,命名为
GET_MAX_EMP_SEQ - 在「PL/SQL代码」中写入(替换
你的表名为实际表名称):
- 进入「共享组件」→「Ajax进程」→「创建」,命名为
DECLARE l_max_seq NUMBER; BEGIN SELECT NVL(MAX(EMP_SEQ), 0) INTO l_max_seq FROM 你的表名 WHERE EMP_NAME = apex_application.g_x01; HTP.P(l_max_seq); END;
- 将进程「授权方案」设置为「无限制」,确保正常调用权限
方式二:数据库触发器(更安全,防止前端数据篡改)
若担心前端逻辑被绕过,推荐在数据库层实现自动生成:
- 确保
EMP_SEQ列允许空值(新增行时无需手动填充,由触发器自动补全) - 创建BEFORE INSERT触发器(替换
你的表名为实际表名称):
CREATE OR REPLACE TRIGGER TRG_EMP_SEQ_AUTO_INCREMENT BEFORE INSERT ON 你的表名 FOR EACH ROW DECLARE l_next_seq NUMBER; BEGIN SELECT NVL(MAX(EMP_SEQ), 0) + 1 INTO l_next_seq FROM 你的表名 WHERE EMP_NAME = :NEW.EMP_NAME; :NEW.EMP_SEQ := l_next_seq; END; /
该方式下,前端只需正确选择员工姓名,保存数据时触发器会自动计算并填充EMP_SEQ值,无需额外前端逻辑。
第三步:测试验证
- 打开交互式网格页面,点击新增行
- 从
EMP_NAME下拉列表选择员工(如John),检查EMP_SEQ是否自动填充为3;选择Mary则填充为4 - 保存新增行后,再次新增同一员工的行,确认序列值持续递增即可
内容的提问来源于stack exchange,提问作者Velocity
相关产品推荐
相关产品推荐

