Oracle Apex 22.1交互式网格新增记录验证逻辑实现咨询
实现交互式网格(IG)部门名称验证逻辑的方案
下面是基于Oracle APEX的具体实现步骤,核心用动态操作(Dynamic Action)结合AJAX回调来实现需求:
1. 创建AJAX回调过程
先在应用中创建一个AJAX可调用的PL/SQL过程,用来检查数据库中是否已存在目标部门名称:
DECLARE l_count NUMBER; BEGIN -- 传入待检查的部门名称,查询存在数量 SELECT COUNT(*) INTO l_count FROM emp_organizations WHERE dept_name = apex_application.g_x01; -- 以JSON格式返回检查结果 apex_json.open_object; apex_json.write('exists', CASE WHEN l_count > 0 THEN 'Y' ELSE 'N' END); apex_json.close_object; END;
将这个过程命名为 CHECK_DEPT_EXISTS(可自定义,后续要对应上)。
2. 绑定交互式网格的动态操作
在IG所在页面创建动态操作,配置如下:
- 触发时机:选择 Before Save
- 触发条件:添加条件
Row is New(仅针对新建行触发) - 执行动作:添加 Execute JavaScript Code,代码如下:
// 获取IG实例及新建行的部门名称 var igRegion = apex.region("YOUR_IG_STATIC_ID").widget(); var igModel = igRegion.interactiveGrid("getViews", "grid").model; var newRecord = igModel.getRecord(igModel.last()); var deptName = igModel.getValue(newRecord, "DEPT_NAME"); // 跳过空值检查(可根据需求调整) if (!deptName) return; // 调用AJAX回调验证部门名称 apex.server.process("CHECK_DEPT_EXISTS", { x01: deptName }, { success: function(response) { if (response.exists === 'N') { // 部门不存在时弹出确认框 if (!confirm("Do you want to save this new value?")) { // 用户选择"否",取消当前保存操作 apex.event.cancel(true); } } // 部门存在时直接继续保存流程 } });
注意替换代码中的 YOUR_IG_STATIC_ID 为你的交互式网格实际静态ID,CHECK_DEPT_EXISTS 要和第一步创建的AJAX回调名称一致。
3. 调整动态操作执行顺序
确保这个动态操作的执行顺序早于APEX默认的保存逻辑,这样才能在保存前完成验证并拦截操作。在动态操作的属性中,将执行顺序设为一个较小的数值(比如10)。
补充说明
- 如果需要处理批量新建行的场景,需要调整JS代码遍历所有新建行,逐个检查部门名称
- 可以根据需求添加空值判断逻辑,比如不允许空的部门名称,可在JS中增加对应判断
内容的提问来源于stack exchange,提问作者Velocity
相关产品推荐
相关产品推荐

