Oracle APEX交互式网格列空值验证:无需点击字段即可校验
Oracle APEX 交互式网格(IG)跳转前非空校验方案
方法一:配置IG内置必填校验并调整触发时机
- 编辑目标交互式网格,进入列属性,找到需要校验的列,将
必填属性设为是。 - 调整校验触发时机:
- 进入IG的属性面板,在高级选项下修改
校验类型为提交时。 - 将跳转按钮的动作设为
提交页面,并指定目标页面。提交时APEX会自动校验所有必填列,包括未手动点击过的行,若存在未填项会阻止跳转并弹出错误提示。
- 进入IG的属性面板,在高级选项下修改
方法二:动态动作+JavaScript自定义校验
如果需要自定义错误提示或逻辑,可通过动态动作实现:
- 创建动态动作,触发事件选择
按钮点击,绑定到目标跳转按钮。 - 添加执行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(); } - 将按钮的动作设为
定义动态动作,在校验通过的动态动作分支中添加页面跳转动作,指定目标页面。
方法三:后端PL/SQL校验
若需要更严格的后端数据校验,可在按钮的PL/SQL处理中实现:
- 将按钮的动作设为
执行PL/SQL。 - 编写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; - 替换代码中的区域ID、目标页面编号和列名,匹配你的实际应用配置。
内容的提问来源于stack exchange,提问作者user31903851
相关产品推荐
相关产品推荐

