1. 概念
在复杂的业务场景下,只使用"本表单"以及"本表单的明细”做为数据源,这远远是不够的,于是在业务公式中云表提供了扩展数据源-子数据源的功能,业务公式可以通过数据接口获取数据,对本表单的数据进行扩展。
在对服务器端的某个目标对象进行加工操作时,除了可用客户端提供过来的数据源(本表单)外,还可以用服务器端本身就储存着的子数据源(模板数据接口),先对本表单的数据进行扩展,然后用经过扩展的数据表来对所选的目标表的内容来进行修改。
这里的扩展,被扩展对象包括对本表单的基本信息表和明细信息表;扩展方式包括横向扩展和纵向扩展两种方式。
最终结果是将本表单的基本信息的一条记录,扩展成一个更宽,更长(多条记录的一张大表)的表,也把原来较小的明细表,扩展为更宽的一张大表。
2.作用
子数据源可以拥有多级扩展,子数据源对父数据源进行扩展,扩展也是逐行进行的,对父数据源中的每一条记录都会执行一次子数据源扩展,一个父数据源可以有多个子数据源,如果子数据源查询出了多条记录,默认情况只取第一条记录,除非子数据源的“多记录”选项被打勾,表明这个子数据源是作为父记录的明细表进行扩充,系统会遍历明细子数据源的每条记录,如果明细子数据源还有子数据源,将会以此类推,逐级扩展。一个父数据源允许有多个子数据源,但只允许有一个子数据源作为明细进行扩展。
业务公式会遍历“子数据源”,对每一条记录执行一次操作,可以把“子数据源”想像成人体的心脏,他是业务公式执行的原动力,对数据源中的每一条记录都会触发一次心跳,驱动后续操作的执行,“子数据源”的记录也像血液一样被输送到后续操作中使用。
由于子数据源扩展和对目标表的操作是可以在循环中进行操作,每次循环的操作都可能修改子数据源,因此,子数据源的扩展,也可以做出动态扩展的效果。
因此子数据源的作用有3个:
①为后续操作提供数据;
②勾选“多记录”后,子数据源中有多少条记录,将驱动操作执行多少次,例如明细中有2条记录,则先读取明细的第一条记录执行操作,再读取明细的第二条记录执行操作,一共执行2次操作;
③做出动态扩展的效果,数据源扩展和对目标表的操作是可以在循环中进行操作,每次循环的操作都可以修改子数据源。
3. 参数说明
“子数据源设置”默认折叠,可通过最右侧的 向上三角符号 打开。
①+:添加子数据源。单击【+】弹出下拉菜单,选择“数据接口”,选择同级还是子级数据接口(见 4)
②变量名:添加子数据源后,默认为该模板数据接口的名称。为了后续操作使用方便,可手动更改,比如 修改成“父资金分类”
③数据源:调用的模板数据接口,显示该数据接口所属的模板,名称及参数信息;
④数据源查询条件:若调用的数据接口有参数,在此处给参数赋值;
⑤多记录:如果数据接口查询结果有多条记录,勾选“多记录”后,系统会遍历数据接口的每条记录,否则只读取第一条记录。
勾选“多记录”,将先读取第一条记录“CK-1”,再读取第二条记录“CK-2”;
不勾选“多记录”,系统只读取第一条记录,将驱动操作执行一次,只读取第一条记录“CK-1”;
⑥当满足以下条件时:该条件在子数据源之下,可调用子数据源查询后的结果进行判断,还可避免系统抛错。
如图:参数说明,满足条件为 父信息<>常量.空 。当子数据源查询的结果 = 常量.空 时,此时获取 查询结果某个数据项的值会报错,通过满足条件拦截错误;只有子数据源查询的结果<> 空时,才对目标对象执行更新操作;
4. 分类
新建子数据源时,单击【+】显示下拉菜单,选择“数据接口”,此时显示同级数据源和子数据源。添加第一个数据接口时,这2个选项没有任何区别;
主要的区别在于:当子数据源列表中已有子数据源时,选中已有的子数据源,新建的子数据源是“已选中子数据源”的同级数据源还是子数据源。
4.1 同级数据源
同级数据源:2个子数据源在同一级
同级数据源有2个特点:
①同级数据源没有依赖关系,如上图“供应商列表”与“仓库列表”并列显示,且2个同级子数据源的查询无任何依赖关系;
②多个同级子数据源,有且只有一个能设置“多记录”,未勾选“多记录”的子数据源只读取第一条记录,针对设置“多记录”的子数据源进行横向拓展。比如下图中 供应商列表有3条记录,并设置了多记录,仓库列表有2条记录,则查询的结果有3条记录,同级数据源“仓库列表”对“供应商列表”进行横向拓展。
4.2 子级数据源
子级数据源:下面的子数据源是上面子数据源的子级
子级数据源有2个特点:
①2个子数据源存在不同的级别,是上下级有依赖关系,,如上图“仓库列表”是“供应商列表”的子级数据源;
②子级数据源中,都可设置“多记录”,下层数据源针对上层子数据源进行横向和纵向扩展。比如下图中 供应商列表有3条记录,并设置了多记录,仓库列表有2条记录,也设置多多记录,则查询的结果有2*3=6条记录,子级数据源“仓库列表”对父级子数据源“供应商列表”进行横向和纵向扩展。
5. 使用
5.1 单级子数据源
5.1.1 单级单子数据源
单级单子数据源,是指“子数据源设置”中只有1个子数据源,使用时需要注意“多记录”的使用。该情况较常见★。
参考示例
数据源-选中的记录-示例
、模拟电子签名
5.1.2 单级多子数据源
单级多子数据源,是指“子数据源设置”中有多个子数据源,都在同一个层级中,属于同级子数据源。此时只有1个子数据源能设置“多记录”,数据源1对数据源2横向拓展(如下图)。
5.1.3 单级动态子数据源
单级动态子数据源,是指“子数据源设置”中只有一级子数据源,但是数据源为“明细”,明细中有多条记录时,驱动子数据源查询多次,每次查询的结果是动态的。
如下图,数据源为“本表单.出库明细”,子数据源为“FT库存表.库存明细(仓库编号,商品编号)”,若“本表单.出库明细”有2条记录,数据源读取第一条记录,子数据源根据第一个商品执行查询,数据源读取第二条记录时,子数据源根据第二个商品执行查询,子数据源一共查询了2次,2次查询的结果不同,此时的子数据源即为动态子数据源。
5.2 多级子数据源
多级子数据源,是指“子数据源设置”中有1个以上的子数据源,要存在多级即有父级和子级子数据源,如下2个图都属于多级子数据源。
子数据源需要设置同级还是子级关系,可参考
3.分类
进行设置 5.2.1 静态多级
静态多级子数据源,是指每个子数据源查询的结果不变,如下图中有2级子数据源,由于是基础资料,只有基础资料中的数据变化时,查询的结果才会变化。
5.2.2 动态多级
动态多级子数据源,父级子数据源读取不同的记录,子级数据源查询的结果不同。
有2种不同的情况:子级数据源依赖父级数据源查询的结果和子级数据源不依赖父级数据源查询的结果。
★子级数据源依赖父级数据源查询的结果
如下图,第一层子数据源1,根据销售单号查询商品销售明细,“销售订单”可能会存在多个商品,查询的结果有多条记录,勾选了“多记录”,第二层子数据源2,根据仓库编号和商品编号查询商品的库存,子数据源1的查询结果作为子数据源2的参数。
若第一层子数据源1查询的结果有3条记录,系统读取第一条记录“SP-01”时,第二层子数据源2查询的结果为“10”,当系统读取数据源1的第二条记录“SP-02”时,数据源2查询的结果为“5”,当系统读取数据源1的第三条记录“SP-03”时,数据源2的查询结果为“20”,子数据源2调用子数据源1的查询的结果作为参数。
★子级数据源不依赖父级数据源查询的结果,父级子数据源有多条记录,驱动子级数据源查询多次,而后续操作会更改子级数据源“数据源的数据”,导致子级数据源每次查询的结果不同。
如下图,第一层子数据源1为“FT库存表.库存明细(仓库编号,商品编号)”,根据仓库编号和商品编号查询“不同批次商品的库存明细”,同一个仓库中相同的商品会存在不同的批次,查询的结果有多条记录,因此勾选了“多记录”,第二层子数据源2为“本模板.出库合计(出库单号,仓库编号,商品编号)”,根据出库单号、仓库编号和商品编号查询“出库单.记录明细 中已出库的合计数量”,子数据源2不依赖于子数据源1查询的结果,但是由于后续操作中针对“目标模板(本表单).记录明细”执行插入记录,执行插入操作后,子数据源2查询的结果发生了变化。
当子数据源1,查询的结果“不同批次商品的库存明细”,如下图有3条记录。
子数据源1读取第一条记录B1,子数据源2查询的结果“出库单.记录明细中已出库的合计数量”,此时查询的结果为C1“0”,然后执行插入操作,若往该“出库单.记录明细”中插入第一条记录,出库数量为“100”;
子数据源1读取第二条记录B2,子数据源2查询的结果“出库单.记录明细中已出库的合计数量”,此时“记录明细”中只有一条记录,子数据源2查询的结果为C2“100”,再往该“出库单.记录明细”中插入第二条记录,出库数量为“300”;
子数据源1读取第三条记录B3”,子数据源2查询的结果“出库单.记录明细中已出库的合计数量”,此时“记录明细”有2条记录,子数据源2查询的结果为100+300=C3“400”,再往该“出库单.记录明细”中插入第三条记录,出库数量为“100”;
在子数据源2查询的过程中,没有依赖子数据源1查询的结果,但是由于后续操作更改了子数据源2“数据源的数据”,导致子数据源2下一次查询时,结果不同。
而且由于数据源为“本表单.出库明细”,当数据源读取不同记录时,子数据源1查询的结果也不同,读取子数据源1不同的结果时,子数据源2查询的结果也不同,因此子数据源1和子数据源2都是动态的。
当数据源读取A1时,子数据源1查询结果B1、B2、B3,当子数据源读取B1时,子数据源2查询结果C1,当子数据源读取B2时,子数据源2查询结果C2,当子数据源2读取B3时,子数据源2查询结果C3;
当数据源读取A2时,子数据源1查询结果B4、B5,当子数据源读取B4时,子数据源2查询结果C4,当子数据源读取B5时,子数据源2查询结果C5;
参考示例
按照“先进先出”出库
、利用计划任务生成生产计划
6. 示例
这里以根据区域经理自动生成该经理所管辖的区域的月销售报表为例。《销售单》中记录不同销售员的销售记录,《区域划分表》中记录销售员所属的区域;
需要统计时,新建“统计销售情况”,选择区域经理和日期,在工具栏按钮中单击【统计】,生成该经理的“区域销售月报表”,单击【取消统计】时,删除已生成的“区域销售月报表”。
实现思路如下:在《统计销售情况》模板中,增加【统计】状态按钮,利用业务公式生成“区域销售月报表”
①在《统计销售情况》模板中,增加【统计】状态按钮。在模板设计界面,单击工具栏的【状态字段】,添加【统计】字段。
②在“统计”状态改变事件下,添加针对“区域销售月报表”的公式。
单击工具栏的【业务公式】,选中“统计”状态改变事件,单击【添加公式】,选择目标模板“区域销售月报表”。
③设置公式,“统计”时生成该经理的“区域销售月报表”,“取消统计”时,删除已生成的“区域销售月报表”,有2种不同的情况。
设置情况1“统计”,目标模板只有一个目标对象,数据源使用默认的“本表单”。执行条件设置为“本表单.统计 = 常量.是”。
设置子数据源。需要通过“区域划分表”查询到当前表单的区域经理所管辖的区域(需要事先在区域划分表中做好一个列表选择类型的数据接口),勾选多记录(适用于一个区域经理管辖多个区域的情况),然后选中子数据源“区域”添加子级数据源,该子数据源根据上级数据源的区域查询该区域内的所有销售单。
设置操作,操作类型选择“新建表单”,并给目标表单的字段赋值。
④添加情况2“取消统计”,目标模板只有一个目标对象,数据源使用默认的“本表单”,执行条件设置为“本表单.统计 = 常量.否”,对目标对象执行删除操作,匹配条件为 区域销售月报表.日期 = 本表单.日期 并且 区域销售月报表.区域经理=本表单.区域经理 ;
⑤最后保存业务公式和模板。