请教大家,如用UPSERT函数更新子表单中关联表单的内容到目标普通表单,但显示目标列和目标值组件不一致,因为一个是数组,一个是文本,该怎么解决
楼主你好,可以使用转换函数将数组转换为文本,然后再更新到目标普通表单中。
例如,如果目标列是以数组形式存储的,可以使用CONCAT_WS
函数将数组的值转换为文本:
SELECT CONCAT_WS(',', array_col) AS text_col FROM table
这会将array_col
数组中的值以逗号分隔的形式转换为文本,并存储到text_col
列中。然后可以使用UPSERT函数将text_col
列中的值更新到目标普通表单中。
如果您在使用UPSERT函数时遇到目标列和目标值组件不一致的问题,可能是因为目标表单中的列和子表单中关联表单的内容之间存在数据类型不匹配。
UPSERT 格式 : UPSERT (目标表, 主条件, 子条件, 目标列1, 目标值1, 目标列2, 目标值2......)
UPSERT 格式 : UPSERT (目标表, 主条件, 子条件, 目标列1, 目标值1, 目标列2, 目标值2......)
UPSERT 格式
UPSERT (目标表, 主条件, 子条件, 目标列1, 目标值1, 目标列2, 目标值2......)
目标表:要插入/更新数据的目标表单。
主条件:定位目标表下需要更新的表单数据。主条件是由逻辑函数构成:
比如 EQ( 存货表.商品名, "铅笔"), 则表示目标表是「存货表」, 要更新的数据是:商品名为「铅笔」的这批数据,如果有多个条件,可以用AND函数组合。
比如 AND(EQ(存货表.商品名, "铅笔"), GT (存货表.存货量 , 10)) 表示要更新的数据是:商品名为「铅笔」,并且「存货量」大于 10 的那批数据。
子条件:
要更新的表单数据已经确定,但要更新的是这条数据下某个子表单的明细数据用子条件定位子表单哪些数据要更新。
子条件是由逻辑函数构造,如果不需要更新子表单下的值,则填"",不能不填。
目标列:
如果子条件为"",表示不更新子表单下的值,那么目标列必须为目标表下的普通组件
如果子条件不为"",表示更新的是子表单下的值。那么目标列必须为要更新的目标表要更新的明细下的组件。
目标值:指目标列要更新成的值,目标值可以由当前录入表的某个组件值,要更新目标表某个组件值,固定值通过其他函数组合而成。
如果您在使用UPSERT函数时遇到目标列和目标值组件不一致的问题,可能是因为目标表单中的列和子表单中关联表单的内容之间存在数据类型不匹配。
要解决这个问题,可以考虑以下几种方法:
数据类型转换:尝试将目标列的数据类型与关联表单的内容的数据类型进行转换,以使它们匹配。例如,如果目标列是文本类型,而关联表单的内容是数组类型,可以选择将数组转换为逗号分隔的字符串,或者将字符串转换为数组,具体取决于您的业务需求和数据处理方式。
数据格式调整:如果目标列和关联表单的内容表示的是相同的信息,但格式不同,可以通过对数据进行格式调整来使它们保持一致。例如,如果目标列是日期类型,而关联表单的内容是以不同格式表示的日期字符串,可以使用日期格式化函数将它们统一为相同的日期格式。
考虑数据结构变更:如果目标列和关联表单的内容在数据结构上存在较大差异,无法直接进行转换或调整,那么可能需要重新设计目标表单的结构,以适应关联表单的内容。这可能涉及对数据库模式或表结构进行修改。
UPSERT 公式用于往目标表单中插入或者更新数据
比如入进货时,将进货量存入库存表,单据提交时,设置当商品不存在时,填入商品和数量。如果商品已经存在,那么在原来存货量的基础上加上此次的进货量,就可以用该公式。
UPSERT 更新目标有两种 表单中的普通组件值(比如单行多行等数据)
表单下子表单的值,子表单下有多条数据,可以根据设置的条件,只更新符合条件的子表单数据。
UPSERT 格式 UPSERT (目标表, 主条件, 子条件, 目标列1, 目标值1, 目标列2, 目标值2......)
目标表:要插入/更新数据的目标表单。
主条件:定位目标表下需要更新的表单数据。主条件是由逻辑函数构成。
子条件: 要更新的表单数据已经确定,但要更新的是这条数据下某个子表单的明细数据用子条件定位子表单哪些数据要更新。 子条件是由逻辑函数构造,如果不需要更新子表单下的值,则填"",不能不填。
目标列:
如果子条件为"",表示不更新子表单下的值,那么目标列必须为目标表下的普通组件 如果子条件不为"",表示更新的是子表单下的值。那么目标列必须为要更新的目标表要更新的明细下的组件。
目标值:指目标列要更新成的值,目标值可以由当前录入表的某个组件值,要更新目标表某个组件值,固定值通过其他函数组合而成。
UPSERT使用 场景: 录入表的普通组件数据插入/更新目标表的普通组件数据
录入表的子表单组件数据插入/更新目标表的普通组件数据
录入表的普通组件数据插入/更新到目标表的子表单组件数据
举例:普通组件数据插入/更新目标表的子表单组件数据:
公式配置解析:
目标表:风险事件 主条件:AND(EQ(风险事件.风险类型,风险类型),EQ(风险事件.事件名称,事件明细.事件名称))。匹配风险事件表数据需要两个条件:风险类型相同(EQ(风险事件.风险类型,风险类型))和事件名称相同(EQ(风险事件.事件名称,事件明细.事件名称)).两个条件需要同时成立,用AND连接。
子条件:更新的是风险事件下的两个普通组件,不涉及子表单,不需要子条件,为"".
目标列:风险类型
目标值:风险类型
目标列:风险事件.事件名称
目标值:事件明细.事件名称。 子表单下有多个事件名称数据,则往「风险事件」表中插入多条数据。
需求描述:当我们在「风险事件」表单中新增一个风险事件时,相应的风险类型的事件明细下就要新增一条事件记录。即实现单表数据聚合到一个子表单下,和子表单数据拆分到单表里的双向过程。
公式配置:针对「需求二」,相当于普通数据插入到子表单数据的配置逻辑,公式为:
公式配置解析
目标表:风险类型 主条件:EQ (风险类型.风险类型,风险类型)。用「风险类型」输入框的值就能唯一定位「风险类型」表的某条数据。主条件用于定位哪条数据需要更新,因此不能使用目标表中的子表单组件。
子条件:EQ (风险类型.事件明细.事件名称,事件名称)。 这次是要往「风险类型」表中的「事件明细」组件中插入数据。因此需要子条件。是否需要插入子表单数据的条件是子表单下是否已经有相同的风险事件存在。因此用EQ(风险类型.事件明细.事件名称,事件名称)来匹配明细下的风险事件。子条件定位子表单下哪条数据需要更新,因此必须使用到要更新的明细下的组件。
目标列:风险类型.事件明细.事件名称。 由于要操作的是子表单数据,因此目标列也只能是明细下的某个组件。这次选的是明细下的「事件」组件。
目标值:事件名称。
注意事项 不能既更新普通组件,又要更新明细下的值。如果有这种场景,请分成两个 UPSERT 函数,一个用来更新普通组件,一个用来更新明细下的数据。 在上面讲解的商品进货存货的场景中,其实当表单数据删除时,是需要把存货量扣除的,此时可以在「表单删除」上,
配置 UPDATE 函数,用于扣除数据,从而保证数据是一致的。
UPSERT 函数一次最多只能更新 100 条主表单数据,超出会报错导致提交失败。免费版一次最多只能插入某条表单数据下 50 个明细数据,轻享版、专业版一次可更新插入500条明细数据(默认是50条,需要在表单编辑页面设置最大条数为500条),超出也会报错提示「提交失败」。
UPSERT 函数一次只能操作表单下一个明细组件的数据。如果有操作多个明细组件数据的需求,请配置多个UPSERT 函数。
主条件和子条件是由逻辑函数构造的。除了 AND 和 OR 之外,其他逻辑函数第一个参数必须是目标表中的组件,两个参数的位置不能调换。
配置 UPSERT 函数将明细数据插入(更新)到另一张表,当明细下有两条数据都命中相同的条件时,会是另一张表插入两条数据,而不会是第一条明细数据插入,第二条明细数据更新。
高级公式组件支持范围如下:
能作为判断条件的组件: 「单行文本」、「多行文本」、「单选」、「下拉单选」、「日期」、「成员」
能进行赋值的组件: 「单行文本」、「多行文本」、「数值」、「单选」、「下拉单选」、「复选」、「下拉复选」、「级联选择」、「日期」、「日期区间」、「图片上传」、「附件」、「成员」、「地址」、「关联表单」
你好,我之前有类似的业务场景跟你的比较相似,可以参考下实现过程:
场景:添加一条数据的同时,要在另一个表单中的子表单也添加同样的数据。
目标表单
提交数据的表单(主动添加数据的,主要是确定要往上图那条数据里的子表单添加数据))
编辑UPSERT
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。