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

Oracle APEX交互式网格列空值验证:无需点击字段即可校验

Oracle APEX 交互式网格(IG)跳转前非空校验方案

方法一:配置IG内置必填校验并调整触发时机

  1. 编辑目标交互式网格,进入列属性,找到需要校验的列,将必填属性设为是。
  2. 调整校验触发时机:
    • 进入IG的属性面板,在高级选项下修改校验类型为提交时。
    • 将跳转按钮的动作设为提交页面,并指定目标页面。提交时APEX会自动校验所有必填列,包括未手动点击过的行,若存在未填项会阻止跳转并弹出错误提示。

方法二:动态动作+JavaScript自定义校验

如果需要自定义错误提示或逻辑,可通过动态动作实现:

  1. 创建动态动作,触发事件选择按钮点击,绑定到目标跳转按钮。
  2. 添加执行JavaScript代码动作,代码示例:
    // 替换为你的IG静态ID
    var igStaticId = "YOUR_IG_STATIC_ID";
    // 替换为需要校验的列名
    var requiredCols = ["COLUMN_NAME_1", "COLUMN_NAME_2"];
    
    var ig$ = apex.region(igStaticId).widget();
    var gridView = ig$.interactiveGrid("getViews", "grid");
    var model = gridView.model;
    var isValid = true;
    
    // 遍历所有非删除状态的行
    model.forEach(function(row) {
        var rowId = row[model.idAttribute];
        if (model.getRecordStatus(rowId) !== "D") {
            requiredCols.forEach(function(col) {
                var cellValue = model.getValue(rowId, col);
                if (cellValue === null || cellValue.trim() === "") {
                    isValid = false;
                    apex.message.showErrors([{
                        type: "error",
                        location: "page",
                        message: `行 ${rowId} 的 ${col} 不能为空`,
                        unsafe: false
                    }]);
                }
            });
        }
    });
    
    // 校验不通过则阻止后续跳转
    if (!isValid) {
        apex.event.preventDefault();
    }
    
  3. 将按钮的动作设为定义动态动作,在校验通过的动态动作分支中添加页面跳转动作,指定目标页面。

方法三:后端PL/SQL校验

若需要更严格的后端数据校验,可在按钮的PL/SQL处理中实现:

  1. 将按钮的动作设为执行PL/SQL。
  2. 编写PL/SQL代码块检查IG数据:
    DECLARE
        v_missing_count NUMBER;
        -- 替换为你的IG区域ID和目标页面编号
        v_ig_region_id NUMBER := 123;
        v_target_page NUMBER := 45;
    BEGIN
        -- 查询存在未填项的行数
        SELECT COUNT(*)
        INTO v_missing_count
        FROM APEX_APPLICATION_PAGE_IG_ROWS
        WHERE application_id = :APP_ID
          AND page_id = :APP_PAGE_ID
          AND region_id = v_ig_region_id
          AND (COLUMN_NAME_1 IS NULL OR COLUMN_NAME_1 = '' 
               OR COLUMN_NAME_2 IS NULL OR COLUMN_NAME_2 = '');
    
        IF v_missing_count > 0 THEN
            apex_error.add_error(
                p_message => '存在未填写的必填列,请检查后重试',
                p_display_location => apex_error.c_inline_in_notification
            );
            raise_application_error(-20001, '校验未通过');
        ELSE
            -- 校验通过后跳转页面
            apex_util.redirect_url('f?p=' || :APP_ID || ':' || v_target_page || ':' || :APP_SESSION);
        END IF;
    END;
    
  3. 替换代码中的区域ID、目标页面编号和列名,匹配你的实际应用配置。

内容的提问来源于stack exchange,提问作者user31903851

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 15:32:39