---
url: /dev/guide/subtable-required-validation/index.md
---
# 根据主表字段值校验子表必填

## 原理说明

在 YonBIP 低代码开发中，根据主表字段值动态验证子表字段非空，其核心原理是通过**前端交互规则**或**自定义脚本**，监听主表字段值的变化，并基于此值对子表字段的"必填"属性进行动态控制。这属于**条件性校验**逻辑，通常在单据保存或提交时触发，以确保业务数据的完整性。

系统提供的"交互规则"功能允许配置基于条件的字段属性（如必填）动态变化，是实现此需求的标准方案。

## 方案一：配置交互规则（推荐）

### 步骤一：进入交互规则配置页面

1. 在应用构建中，打开目标单据的**页面建模**
2. 进入该单据的**详情页设计器**
3. 在右侧面板中，找到并点击 **【交互规则】** 按钮，进入规则配置界面

### 步骤二：创建新的交互规则

1. 点击 **【新建规则】**
2. 在弹窗中设置规则名称（如"主表字段 A 为 X 时，子表字段 B 必填"），并选择\*\*【规则范围】\*\*

:::tip 关键选择
由于要控制子表字段的必填性，规则范围应选择 **【表单】**。"表单"范围的条件区可以选择主表和子表字段，且动作区支持子表字段的必填规则。
:::

### 步骤三：配置条件区（触发条件）

1. 在条件区，点击 **【添加条件】**
2. **【字段】**：选择主表中用于判断的字段（例如"业务类型"）
3. **【操作符】**：根据字段类型选择，例如"等于"、"包含"等
4. **【值】**：设置触发条件的具体值（例如常量"采购"）

> 操作符右侧支持常量和字段，后续支持公式。

### 步骤四：配置动作区（执行操作）

1. 在动作区，点击 **【添加动作】**，选择 **【必填规则】**
2. **【组件】**：选择需要被控制为必填的**子表字段**（例如"供应商"）
3. **【属性值】**：设置为 `true`，表示当条件满足时，该子表字段变为必填

### 步骤五：保存并发布

1. 完成规则配置后，点击保存
2. 返回页面建模，**保存并发布**整个页面模板，使交互规则生效

## 方案二：使用前端脚本

如果交互规则的逻辑无法满足复杂条件（例如需要遍历子表所有行进行校验），可以通过编写**前端脚本**，在 `viewModel` 的 `beforeSave` 或 `beforeSubmit` 事件中实现自定义校验逻辑。

```javascript
viewModel.on('beforeSave', function (args) {
  const mainFieldValue = viewModel.get('主表字段编码').getValue() // 获取主表字段值
  const gridModel = viewModel.getGridModel() // 获取子表模型
  const rows = gridModel.getRows()
  let isValid = true

  if (mainFieldValue === '特定值') { // 你的判断条件
    for (let i = 0; i < rows.length; i++) {
      if (!rows[i]['子表字段编码']) { // 检查子表字段是否为空
        isValid = false
        gridModel.setCellState(i, '子表字段编码', 'error', '该字段不能为空！')
        break
      }
    }
  }

  if (!isValid) {
    return false // 阻止保存
  }
})
```

## 注意事项

1. **规则冲突**：同一个字段的同一个属性（如必填）不能出现在多个交互规则中，否则系统会提示不允许添加。
2. **生效范围**：确保交互规则的"规则范围"选择正确。控制子表字段必填，应使用\*\*【表单】\*\*范围，而不是子表范围。
3. **发布生效**：配置或修改交互规则后，必须**保存并发布页面模板**，否则规则在前端不会生效。
4. **条件字段类型**：配置条件时，注意不同字段类型（文本、选项、数值、日期）支持的操作符不同，需正确选择。
5. **子表字段操作符**：当条件区选择子表字段时，操作符会变为"全部等于"、"全部大于"等前缀，表示需要子表所有行都满足该条件，规则才会触发。请根据业务逻辑谨慎选择。

## 参考来源

* [交互规则](https://c2.yonyoucloud.com/iuap-hc-client/ucf-wh/client/index.html#/detail/BDSXJHGZ1?nodeId=fe4cf99d-5d33-4728-8160-c0aa18ee2ddb\&productline=CommunityDoc)
* [根据子表字段 A 判断最大行后，取当前行的 B 值赋给主表字段](https://community.yonyou.com/article/detail/10183)
* [\[低代码开发\]\[业务流\] 转换规则配置不生效问题解决方案](https://community.yonyou.com/article/detail/11965)
* [\[低代码开发\]\[业务流\] 业务流分单规则使用介绍](https://community.yonyou.com/article/detail/12498)
* [【页面建模】应用构建中如何控制某个字段是否可以复制](https://community.yonyou.com/article/detail/12328)

***

## 修改记录

| 版本 | 日期 | 修改人 | 修改内容 |
| --- | --- | --- | --- |
| 1.0 | 2026/08/18 | — | 初始版本：整理自官方知识库文档 |
