---
order: 7
navTitle: 数据校验
---
# 数据校验

**数据校验**是报表填报过程中管控数据质量的重要功能，通过使用批量校验它也能快速的检验一批历史数据的数据质量。数据校验支持取第三方数据、前期数据、跨表数据等做各种灵活的校验设置。本文主要介绍如何添加**数据校验**规则，填报时的校验错误处理请参考[填报数据](../filling.md)文档。

![数据校验](./images/2024-05-29-16-00-00.png)

示例地址：[医院人事](https://demo.succbi.com/v5/ci/%E5%8C%BB%E9%99%A2%E4%BA%BA%E4%BA%8B)

## 添加校验规则{#add-rules}

校验规则有多种设置入口，如下图所示：

![校验设置入口](./images/2024-06-05-10-00-00.png)

- **单元格属性设置**：设置[单元格类型](./design-form/cell-types.md)后，在**单元格**>**校验**设置中可设置单元格必填或添加校验公式。
- **工具栏校验按钮**：通过工具栏**校验按钮**，可添加[逻辑校验规则](#logic-rules)或[批量设置必填](#nonempty)。
- **校验面板工具栏**：在[校验列表](#validate-panel)中可统一管理所有校验公式，点击工具栏添加按钮可添加校验规则。

## 校验规则列表{#validate-panel}

**校验规则列表**是报表填报应用统一管理校验公式的地方，在工具栏>校验菜单中点击**显示所有校验公式**可在报表填报应用设计器底部弹出**校验列表**，也可在[视图](./designer.md#view)中勾选**校验公式**来显示。

![校验列表](./images/pptx-image-ci-validate.png)

- 除了在单元格中设置校验规则外，还可在表单全局设置中直接添加校验规则，所有的校验规则都会统一收集到**校验列表**中展示。
- 校验规则按照所属的工作表进行划分，默认情况下会在**校验列表**中展示所有工作表中的校验规则，也可切换只展示当前工作表中设置的校验规则或是选中某个单元格来展示跟该单元格相关的校验规则。
- 双击**校验列表**中的那些在全局添加的校验规则可进行修改，如果是单元格上添加的规则则是定位到对应单元格的属性设置中。

### 校验规则的筛选和搜索{#filter-search}

在**校验列表**中支持对校验规则进行筛选和搜索，如下操作所示：

![筛选搜索](./images/2024-05-30-10-30-00.gif)

- 点击工具栏中的筛选按钮会弹出筛选菜单，支持根据多种维度来筛选面板中展示的规则。
  - 展示：选择展示的范围，包括当前表单上的校验公式，选中单元格上的校验公式以及全部校验公式。
  - 级别：校验公式的**错误级别**，可多选，只展示勾选级别的校验公式。
  - 分类：校验公式分为[逻辑校验](#logic-rules)和[必填](#nonempty)两类，可多选，只展示勾选分类的校验公式。
- 点击工具栏搜索按钮，弹出搜索框，输入关键字会实时过滤所有包含该关键字的校验公式，能够搜索的范围是当前校验面板中筛选后的结果。

### 更多操作{#more-opertions}

- 校验面板中的规则支持导入导出，点击校验面板工具栏更多按钮可将设置好的校验公式批量导出，也可将Excel中准备好的符合规范的校验公式批量导入到报表填报应用中。
- 在校验面板中支持框选多行校验规则，右键批量设置这些规则的属性，比如批量设置禁用，禁用后的规则会被置灰，或者批量的将错误级别的规则修改为警告级别。

## 逻辑校验规则{#logic-rules}

点击**工具栏**>**校验**按钮可新增**逻辑校验**公式，设置对话框如下：

![逻辑校验](./images/2024-05-30-10-40-00.png)

- **编号**：校验公式的编号，报表填报应用默认会以`CHK`开头往后排序，用户也能根据一些业务含义来自定义，比如某些校验规则是国家标准，可以设置编号与标准一致方便后期维护和比对。
- **错误级别**：分为**错误**和**警告**两种级别，**错误**级别的规则必须全部通过才能提交数据，**警告**级别的规则即便不通过也不影响数据的提交，此处设置会受到应用设置中[校验分级](./settings/datafill.md#validate-grade)设置的影响。
- **校验公式**：校验规则的主体，决定了内容要满足什么样的要求，比如`A1>100`，当单元格A1的值大于100时则通过校验。编辑校验公式时支持拾取单元格。
- **错误提示**：当未通过校验规则时展示给用户的提示信息，通常是为了告诉用户怎么样输入正确的值。
- **生效条件**：生效条件为空或者返回`TRUE`时才作用这条校验规则。

::: tip

校验公式启用时，如果校验相关的元素都不可见，则校验公式默认失效，例如校验`A1>B1`，假设Excel表单第一行是隐藏的，此时界面上无法看到A1和B1单元格，则这条校验公式默认不生效，因为即便生效，用户也没有办法修改。

:::

### 高级设置{#advanced-settings}

逻辑校验对话框中，可展开**高级设置**，高级设置中包含以下设置：

- **启用**：控制校验公式是否启用，禁用后校验时会忽略这条公式。
- **允许特例**：允许对这条校验公式进行特例说明，勾选后，即便未通过校验也可以在填写过特例说明后正常提交数据，需要搭配**应用设置**>**数据填写**>[特例校验](./settings/datafill.md#special-validate)相关设置使用。
- **备注**：针对校验公式的一段描述信息，方便后续维护修改。

### 通过生效条件简化校验{#condition}

在实际场景中经常会遇到一些比较复杂的校验规则，以下面这条校验规则为例，其中包含多种情况，不同情况需要校验不同的规则：

`CASE WHEN A1='1' THEN B1>C1 WHEN A1='2' THEN B1+C1=D1 WHEN A1='3' THEN B1*C1=D1 WHEN A1='4' THEN B1=C1 END`

类似上述这类比较复杂的校验公式，都可以通过拆分后分别设置生效条件来简化设置，使多个公式整体修改的更为易读且方便后期维护，以下是拆分后的设置：

| 校验公式 | 生效条件 |
| :---------| :-------- |
| B1>C1 | A1='1' |
| B1+C1=D1 | A1='2' |
| B1\*C1=D1 | A1='3' |
| B1=C1 | A1='4' |

::: tip

当出现校验错误时，校验公式中所有涉及的单元格都会被标红提示，例如`IF(A1=1,B1>C1)`，出错时A1，B1，C1单元格都会被标红处理。这条校验规则也可以修改为`B1>C1`，然后在生效条件中设置`A1=1`，这样设置后只会将A1单元格中的内容作为依据来判断校验规则是否生效，实际校验的内容还是B1和C1，所以此时即便校验错误也只会在B1和C1单元格处提示。

:::

## 批量添加必填{#nonempty}

除**逻辑校验**外，报表填报应用还支持批量设置**必填**，点击**工具栏**>**校验菜单**选择**必填**设置：

![必填](./images/2024-05-30-15-00-00.png)

必填设置是将报表填报应用中所有与单元格有绑定关系的模型列到对话框中，用户可切换模型后批量选择某些字段需要**必填**，确定后，报表填报应用会根据选择的字段找到对应绑定的单元格来批量设置**必填**。

::: tip

此处的设置只是一种快捷方式，效果等价于直接在单元格上设置**必填**。

:::

## 启用批量校验{#batch-valid}

给[周期填报应用](./create-formapp.md#choose-types)设置好校验公式后，在**报表填报应用设置**>[数据填写](./settings/datafill.md)>**数据校验**中可开启**启用批量校验**。**批量校验**可以帮助管理员对一批单位数据快速校验，执行批量校验时，会针对每条数据使用报表填报应用中配置好的校验公式进行校验，全部校验完成后会返回结果，具体使用过程可参考[填报数据](../filling.md)文档。

## 应用场景{#scenarios}

### 警告校验和特例校验{#worning-rules}

某些校验公式比较特殊，即便在不满足校验规则的情况下也可以允许用户提交数据。当设置校验公式为警告级别时，默认只会在提交数据时对用户给出警告信息，但用户仍可正常上报数据；允许校验公式添加特例时，即便校验错误用户也可在校验时添加特例说明让这条校验公式无条件通过，相关具体的校验体验可参考[填报数据](../filling.md)文档。

![警告和特例](./images/2024-06-04-10-10-00.png)

示例地址：[警告和特例](https://demo.succbi.com/v5/ci/%E5%8C%BB%E9%99%A2%E4%BA%BA%E4%BA%8B)

### 可选项范围校验{#dim-rules}

报表填报应用支持从Excel中导入数据，有时会出现导入的数据中存在垃圾数据的情况，比如单元格下拉框中可选的范围是A、B、C，但导入的内容却是一串文字，默认情况下在提交数据时会针对这种错误进行自动判断，不在单元格可选项范围内时不允许提交。如果需要禁用这种判断可参考[数据填写](./settings/datafill.md#else)文档。

### 跨表校验{#cross-rules}

报表填报应用支持跨表校验，当多个标签页下的表单数据存在校验关系时，可使用[逻辑校验](#logic-rules)设置来定义规则：

![跨表校验](./images/2024-06-03-10-30-00.gif)

示例地址：[跨表校验](https://demo.succbi.com/v5/DEMO/app/ci.app?:id=%E5%8D%AB%E7%BB%9F1-1%28%E5%8C%BB%E9%99%A2%E7%B1%BB%29&:dataPeriod=2024)

1. 添加[逻辑校验](#logic-rules)规则，可直接通过**单元格拾取**来获取多张表下单元格的数据，比如此处当前表的`招生人数`要小于另外一张表的`编制人数`。
2. 校验公式添加完成后，可在**校验列表**中点击数据列下内容分别定位到校验公式中涉及到的不同元素。

::: tip

1. 校验面板中有一列`工作表`数据，代表对应的校验公式是属于哪个工作表的。
2. 当所有校验相关的单元格都属于同一个工作表时，则校验公式中只需要定义类似`A1>B1`的公式即可。
3. 当涉及到跨表校验时，会将写入的第一个单元格对应的工作表作为这条校验公式的所属工作表，继续添加其他工作表中的单元格时，需要添加表名前缀，如`工作表1.A1`。

:::

### 取浮动行数据校验{#float-rules}

当表单中包含固定表以及浮动表时，有时需要获取浮动表中的数据和固定表中的内容进行对比校验，例如所有报销明细的金额相加要小于本次报销额度，报销明细中属于聚餐费用的部分应当每条都不超过500等。此时需要使用[浮动](../../exp/func/float/README.md)函数来设置校验公式。

![浮动校验](./images/2024-06-04-10-00-00.png)

示例地址：[浮动校验](https://demo.succbi.com/v5/DEMO/app/ci.app?:id=%E7%BD%91%E7%82%B9%E7%BB%B4%E6%8A%A4&:orgId=110000&:sheet=%E7%BD%91%E7%82%B9)

### 取模型数据校验{#query-rules}

在表单中，有时不会列出所有校验所需的元素，例如填写人员的统计数据时，某些校验规则需要另外的人员明细表数据做汇总求和后的结果来和表单中填写的数据进行比对，如果数据量不大且需要计算的内容不多时，可以在校验规则中使用[QUERY](../../exp/func/others/QUERY.md)函数来获取需要的数据。此处是在校验公式中结合使用了[取数](./fetch-and-calc.md)能力，具体可参考**SuperPage**的[取数和计算](https://docs.succapp.com/v5/guide/superpage/fetch-and-calc)文档。

### 行列间批量校验{#batch-settings}

当某些连续的行列中有着类似的校验公式时，比如C列每行的值都得分别大于D列每行的值，此时可在校验规则中设置类似`[C1:C10]>[D1:D10]`的行列间批量校验的规则，避免反复的在校验规则中添加类似`C1>D1`、`C2>D2`的设置。

![成批校验](./images/2024-05-30-16-00-00.png)

示例地址：[行列间批量校验](https://demo.succbi.com/v5/DEMO/app/case/market-suprvision-system.app?:id=%E8%A7%92%E8%89%B2%E5%88%87%E6%8D%A2)
