# 通过动作流实现明细表字段的校验

来源快照：`result_data_new_260518.json`

- 来源 ID：`1256710862587125778`
- 模块：低代码平台e-builder
- 目录：专题学习 - 场景专题 - 动作流专题
- space ID：`1157961794811633670`
- 原文链接：未提供
- 产品基线：未提供

## 正文

1.

# 编写目的

在日常业务中，为确保数据录入的准确性与一致性，通常会使用标准的字段查重校验功能，但是字段查重校验，不仅会对当前表单内的值进行校验，还会将当前表单填写的值和已填写的数据进行校验。但是在某些场景中，用户如果只想校验当前明细表下的数据是否具有准确性或唯一性，此时，利用字段查重校验就很难实现。而面对这种场景，我们便可以通过动作流去实现。

场景一：利用动作流校验每行数据中的某个字段是否重复，若重复，则作出提示：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710991410839589&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

 

场景二：当某个明细表字段是多选字段时，判断整个明细表有无重复选择项，若有，则做出提示：

![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710991410839583&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)

 

场景三：与场景一相反，需要明细表内所有行中的某个字段必须一致，若不一致，则做出提示：  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710987149426715&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D) 

 

2.

# 核心思路

以上场景均可通过动作流来实现。首先通过数据源查询组件获取需要校验的原始数据，再通过分组汇总组件对数据进行去重或统计预处理，然后通过分支组件根据处理结果进行条件判断，最后通过终止组件输出校验结论：若满足条件则动作正常执行，若不满足条件则阻止当前动作并向用户反馈相应提示。  
 

3.

# 操作步骤

3.1

## 利用动作流校验每行数据中的某个字段是否重复，并作出提示

明细表字段唯一性，具体是指在提交明细表时，明细表内的某个字段不能重复，有时人工填写时可能会有疏漏，此时便可以通过该方法来进行校验，确保唯一性。先来介绍下第一种类型，单行文本字段若不能重复，需要做如何配置。  
触发组件按需选择，在触发组件后选择数据汇总组件，数据集处选择数据源中的明细表字段，分组字段则要选择需要去校验是否重复的字段。而下一个汇总内容处，这里的配置主要是为了在后面的信息提示处进行提示使用，选用明细行号做自然链接的话，提示的信息可以拼接为“1，2行”这样的形式，更便于用户进行修改。  
  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710987090239500&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
  
分支组件这里的条件判断，选用两个LEN_ARRAY函数来进行比较，左侧的函数是计算原本的明细行数，而右侧则是计算汇总后的值。如果被汇总的字段中有重复值，那么汇总后的值的数量肯定是比原本的明细行数少的，所以在此处进行比较，如果左侧计算的值大于右侧，那么就说明当前明细表中有重复的值。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710982786883586&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
 

当前的场景是明细表中字段要保证唯一性，但是却发现当前的明细表有重复值，此时要做的便是阻止流程/表单数据的创建，并告知当前用户具体是哪里有重复的内容。那么就可以使用数据筛选组件来定位到有重复内容的数据处，数据集选择合并后的数据，此处的筛选条件设置为之前在数据汇总组件中设置的汇总内容，如果包含“，”就说明当前数据是被自然链接过的，即该条数据为有重复内容的数据。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710982775652362&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
 

取到有重复内容的数据时，通过该数据进行循环，循环中可以使用变量赋值组件，为变量进行赋值，之后会将拼接的内容作为提示信息，来对用户进行提示，便于用户寻找有问题的明细行。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710991575302148&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
  
实际使用时的效果：  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710991410839589&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
 

3.2

## 当某个明细表字段是多选字段时，判断整个明细表有无重复选择项

多选的浏览框字段，如何保证唯一性？  
其实思路是一样的，还是通过数据汇总组件来实现数量的比较，不过和一般的字段不同的是，该字段是多选字段。要实现的是每个多选浏览框中的内容都不同，所有人名均唯一，这时就要用到生成JSON组件，来将多选浏览框中的值输出为JSON数组的形式再来进行汇总。在此处开启明细数据后，依据值同样选择为明细表，在下方的参数中设置两个参数，一个用来存人员，一个用来存明细行号（非必要）。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710978702098455&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D) 

 

在下面，还是放置数据汇总组件，不过不是选择原本的明细表，而是选择生成JSON组件的执行结果，分组字段选择之前设定好的人员参数，汇总内容同理，选择之前设定好的行号参数。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710982904791061&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D) 

 

而在分支组件的条件设置处，左侧则不是计算明细表行数，而是直接计算多选浏览框；右侧同理，计算数据汇总后的人员参数。比较的思路和上一个场景相同，如果汇总后的人数少于触发时的人数，那么就说明有重复值。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710987149426699&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
其余配置和第一种类型相同。实际使用时的效果：  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710991410839583&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
 

3.3

**需要明细表内所有行中的某个字段必须一致，若不一致，则做出提示：**

明细表字段一致性是指，明细表的字段必须完全一致，才可以通过校验。类似场景可以理解为，在物品采购时，同一张采购单的所有明细行，采购的物品重量必须一致（都是"电子产品"或都是"生鲜"）。  
同样的，在选好触发事件后，通过数据汇总组件来进行汇总，数据集处选择数据源的明细表，通过需要保持一致的字段来分组，之后下方的汇总内容和前文提到的功能相同，为了更明确的提示用户具体哪条数据有问题才设置的。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710982775652368&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D) 

 

在分支组件这里，我们要先进行比较，这里的比较则是去和1比较，因为在数据汇总后，如果当前的值都相同的话，那么通过LEN_ARRAY计算出的值就是1，如果大于1，则说明有多个值，需要阻止后续操作的进行。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710978541723649&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D) 

 

后续的配置便和3.1所提到的配置类似，此处不再赘述。  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710987232321544&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710991410839563&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)  
  
实际使用后的效果如下：  
![](https://weapp.eteams.cn/papi/file/preview?fileId=1256710982870245401&type=redirect&customParam=%7B%22isExtDist%22%3Atrue%2C%22distributeId%22%3A%22%22%2C%22externalId%22%3A%22%22%2C%22appId%22%3A%22%22%7D)
