UPSERT - 插入或更新
UPSERT()函数用于插入或更新数据到目标表单中。在插入数据时,如果目标表单中已存在该条数据,那么将执行更新数据,如果目标表单中不存在该条数据,那么将执行插入数据。
格式
UPSERT()
函数的格式为:
UPSERT (目标表, 主条件, 子条件, 目标列1, 目标值1, 目标列2, 目标值2......)
- 目标表:要插入/更新数据的目标表单。
- 主条件:主条件用于定位更新哪条数据。主条件是由逻辑函数构成:
- 比如 EQ( 存货表.商品名, "铅笔"), 则表示目标表是「存货表」, 要更新的数据是:商品名为「铅笔」的这批数据,如果有多个条件,可以用AND函数组合。
- 比如 AND(EQ(存货表.商品名, "铅笔"), GT (存货表.存货量 , 10)) 表示要更新的数据是:商品名为「铅笔」,并且「存货量」大于 10 的那批数据。
- 子条件:
- 要更新的表单数据已经确定,但要更新的是这条数据下某个子表单的明细数据用子条件定位子表单哪些数据要更新。
- 子条件是由逻辑函数构造,如果不需要更新子表单下的值,则填"",不能不填。
- 目标列:
- 如果子条件为
""
,表示不更新子表单下的值,那么目标列必须为目标表下的普通组件。 - 如果子条件不为
""
,表示更新的是子表单下的值。那么目标列必须为要更新的目标表要更新的明细下的组件。。
- 目标值:指目标列要更新成的值,目标值可以由当前录入表的某个组件值,要更新目标表某个组件值,固定值通过其他函数组合而成。
使用案例
案例一:普通组件数据插入时,更新目标表的普通组件数据
- 使用的表单
- 进货表:商品名、进货量
- 存货表:商品名、存货量
- 需求
进货表中录入一个商品,如果存货表中存在相同商品名的数据,则在该商品的存货量的基础上加上进货量。如果存货表中查找不到该商品名,则往存货表中插入该商品名,存货量为进货量。
- 公式配置详情&公式解析
- 需求描述:进货表中录入一个商品,如果存货表中存在相同商品名的数据,则在该商品的存货量的基础上加上进货量。如果存货表中查找不到该商品名,则往存货表中插入该商品名,存货量为进货量。
- 公式配置:UPSERT (存货表,EQ(存货表.商品名,商品名),"",存货表.商品名,商品名,存货表.存货量,存货表.存货量+进货量)
公式解析:
- 目标表:存货表。
- 主条件:EQ(存货表.商品名, 商品名)。更新的数据是存货表中商品名为录入表录入数据的商品名。
- 子条件:由于更新的是「存货表」中的普通组件:商品名和存货量,不涉及明细,因此子条件填写为""
- 目标列:存货表.商品名。
- 目标值:商品名。 如果查找不到数据,在插入数据时,存货表的商品名值为进货表的商品名值。
- 目标列:存货表.存货量
- 目标值:存货表.存货量 + 进货量。 根据条件匹配到存货商品后,在原来存货量的基础上加上这次的进货量。
案例二:子表单组件数据插入时,更新目标表的普通组件数据
- 使用的表单
- 进货表:商品类别(下拉单选)、进货明细(子表单组件)。进货明细下有:商品名(单行输入框)、进货量(数字输入框)。
- 存货表:商品类别(下拉单选)、商品名(单行输入框)、存货量(数字输入框)
- 需求
进货表下有进货明细,一次可以录入多个商品。对于录入的多个商品,在存货表中假如查找不到对应商品(商品名和商品类别都相同时,表示商品相同),则插入数据。如果能找到对应商品,则更新对应商品的存货量(存货量=原来的存货量+进货量)。
- 公式配置详情&公式解析
- 需求描述:进货表下有进货明细,一次可以录入多个商品。对于录入的多个商品,在存货表中假如查找不到对应商品(商品名和商品类别都相同时,表示商品相同),则插入数据。如果能找到对应商品,则更新对应商品的存货量(存货量=原来的存货量+进货量)。
- 公式配置:在进货表的业务关联规则中,配置公式如下图:
- 公式解析:
- 目标表:存货表。
- 主条件:AND(EQ(存货表.商品名,进货明细.商品名),EQ(存货表.商品类别,商品类别)).定位数据用到两个条件,即商品名相等(EQ(存货表.商品名,进货明细.商品名))和商品类别相等(EQ(存货表.商品类别,商品类别))。两个条件要同时成立,则用AND将两个条件放一起。
- 子条件:由于更新的是「存货表」中的普通组件:商品名、商品类别和存货量,没有更新子表单,因此子条件填写为""。
- 目标列:存货表.商品名。
- 目标值:商品名。 如果查找不到数据,在插入数据时,存货表的商品名值为进货表的商品名值。
- 目标列:存货表.存货量
- 目标值:存货表.存货量 + 进货量。 根据条件匹配到存货商品后,在原来存货量的基础上加上这次的进货量。
- 目标列:存货表.商品类别。
- 目标值:商品类别。 如果查找不到数据,在插入数据时,存货表的商品类别值为进货表的商品类别。
案例三:普通组件数据插入时,更新到目标表的子表单组件数据
- 使用的表单
- 风险类型: 类型(单行输入框)、事件明细(子表单组件),事件明细下有事件名称(单行输入框)。
- 风险事件: 风险类型(下拉单选,数据来源于风险类型表中的类型数据)、事件名称(单行输入框)
- 需求
「风险类型」表单,维护着风险类型和该类型下有哪些风险事件的数据。「风险事件」表单记录的是每个风险事件的详情。
- 需求一:当我们在「风险类型」表单中的事件明细下新增一个风险事件时,「风险事件」表单中也会相应增加一条数据。
- 需求二:当我们在「风险事件」表单中新增一个风险事件时,相应的风险类型的事件明细下就要新增一条事件记录。即实现单表数据聚合到一个子表单下,和子表单数据拆分到单表里的双向过程。
- 公式配置详情&公式解析
- 需求一
- 需求描述:当我们在「风险类型」表单中的事件明细下新增一个风险事件时,「风险事件」表单中也会相应增加一条数据。
- 公式配置:针对「需求一」,相当于子表单数据插入到普通数据的配置逻辑,公式为:
公式配置解析:
- 目标表:风险事件
- 主条件:AND(EQ(风险事件.风险类型,风险类型),EQ(风险事件.事件名称,事件明细.事件名称))。匹配风险事件表数据需要两个条件:风险类型相同(EQ(风险事件.风险类型,风险类型))和事件名称相同(EQ(风险事件.事件名称,事件明细.事件名称)).两个条件需要同时成立,用AND连接。
- 子条件:更新的是风险事件下的两个普通组件,不涉及子表单,不需要子条件,为"".
- 目标列:风险类型
- 目标值:风险类型
- 目标列:风险事件.事件名称
- 目标值:事件明细.事件名称。 子表单下有多个事件名称数据,则往「风险事件」表中插入多条数据
- 需求二
- 需求描述:当我们在「风险事件」表单中新增一个风险事件时,相应的风险类型的事件明细下就要新增一条事件记录。即实现单表数据聚合到一个子表单下,和子表单数据拆分到单表里的双向过程。
- 公式配置:针对「需求二」,相当于普通数据插入到子表单数据的配置逻辑,公式为:
公式配置解析
- 目标表:风险类型
- 主条件:EQ (风险类型.风险类型,风险类型)。用「风险类型」输入框的值就能唯一定位「风险类型」表的某条数据。主条件用于定位哪条数据需要更新,因此不能使用目标表中的子表单组件。
- 子条件:EQ (风险类型.事件明细.事件名称,事件名称)。 这次是要往「风险类型」表中的「事件明细」组件中插入数据。因此需要子条件。是否需要插入子表单数据的条件是子表单下是否已经有相同的风险事件存在。因此用EQ(风险类型.事件明细.事件名称,事件名称)来匹配明细下的风险事件。子条件定位子表单下哪条数据需要更新,因此必须使用到要更新的明细下的组件。
- 目标列:风险类型.事件明细.事件名称。 由于要操作的是子表单数据,因此目标列也只能是明细下的某个组件。这次选的是明细下的「事件」组件
- 目标值:事件名称。
注意事项
- 不能既更新普通组件,又要更新明细下的值。如果有这种场景,请分成两个 UPSERT 函数,一个用来更新普通组件,一个用来更新明细下的数据。
- 在上面讲解的商品进货存货的场景中,其实当表单数据删除时,是需要把存货量扣除的,此时可以在「表单删除」上,配置 UPDATE 函数,用于扣除数据,从而保证数据是一致的。
- UPSERT 函数一次最多只能更新 100 条主表单数据,超出会报错导致提交失败。免费版一次最多只能插入某条表单数据下 50 个明细数据,轻享版、专业版一次可更新插入500条明细数据(默认是50条,需要在表单编辑页面设置最大条数为500条),超出也会报错提示「提交失败」。
- UPSERT 函数一次只能操作表单下一个明细组件的数据。如果有操作多个明细组件数据的需求,请配置多个UPSERT 函数。
- 主条件和子条件是由逻辑函数构造的。除了 AND 和 OR 之外,其他逻辑函数第一个参数必须是目标表中的组件,两个参数的位置不能调换。
- 配置 UPSERT 函数将明细数据插入(更新)到另一张表,当明细下有两条数据都命中相同的条件时,会是另一张表插入两条数据,而不会是第一条明细数据插入,第二条明细数据更新。
- 高级公式组件支持范围如下
- 能作为判断条件的组件: 「单行文本」、「多行文本」、「单选」、「下拉单选」、「日期」、「成员」
- 能进行赋值的组件: 「单行文本」、「多行文本」、「数值」、「单选」、「下拉单选」、「复选」、「下拉复选」、「级联选择」、「日期」、「日期区间」、「图片上传」、「附件」、「成员」、「地址」、「关联表单」
本文档对您是否有帮助?