1. 概述
1.1 问题描述
在实际填报表设计中,主从表是常见的一种填报场景,主表中的一条记录对应从表中的多条记录,例如「订单表」和「订单明细表」,「订单表」的一个订单可能对应「订单明细表」中的多条产品数据,通过「订单 ID」字段进行关联。
像这样数据来自于多个数据源,填报时数据回填到多个表中的报表,也可以称之为多源填报表。
1.2 实现思路
首先通过设置过滤条件,将表与表关联起来,然后通过定义多个内置 SQL 提交将数据回填到不同的数据表中。
2. 示例
2.1 数据准备
新建普通报表,新建两个数据库查询,SQL 查询语句分别为:
ds1:SELECT * FROM 订单
ds2:SELECT * FROM 订单明细
2.2 报表设计
2.2.1 表格样式设计
按照下图所示设置表样,并将对应的数据列拖入到对应的单元格中:
将 B4、B6、B8 单元格的「左父格」均设置为 A3 单元格,其余单元格为默认,即数据均是根据「订单 ID」扩展得来。
2.2.2 单元格设置
1)各单元格添加控件类型如下表所示:
单元格 | 控件类型 |
---|---|
B4、D4、F4、B8、A12 | 下拉框控件 |
B6、D8、B12~E12 | 数字控件 |
D6、F6 | 文本控件 |
F8 | 复选按钮控件 |
F12、G12 | 按钮控件 |
2)设置 B4、D4、F4、B8、A12 单元格「下拉框控件」的「数据字典」,并且设置 B4、D4、F4、A12 单元格的「单元格属性>形态」也为「数据字典」,具体设置均如下表所示:
单元格 | 数据库表 | 实际值 | 显示值 |
---|---|---|---|
B4 | 客户 | 客户ID | 公司名称 |
D4 | 雇员 | 雇员ID | 姓名 |
F4 | 运货商 | 运货商ID | 公司名称 |
B8 | 订单 | 货主城市 | 货主城市 |
A12 | 产品 | 产品ID | 产品名称 |
控件「数据字典」设置如下图:
单元格形态「数据字典」设置如下图:
3)设置 F12 和 G12 的「按钮控件」分别为「插入行」和「删除行」按钮,其指定单元格都为 A12 单元格。如下图所示:
2.2.3 插入公式
在 H12 单元格中插入公式:C12 * D12 * (1 - E12),即:数量*进价*(1-折扣)。
在 D8 单元格中插入公式:round(sum(H12) + B6,2)。表示「应付金额」为数量*进价*(1-折扣)+运货费。
注:round() 表示应付金额保留两位小数,函数详细解释可参考Round函数。
2.2.4 插入行策略
选中 H12 单元格,点击右侧面板「单元格属性>其他」,将插入行策略设置为「原值」,确保单元格公式在插入行时被保留。
2.3 参数设置
1)点击菜单栏「模板>模板参数」,添加一个参数名为 ID 的模板参数,默认值为 10001。如下图所示:
下拉框控件的数据字典:数据库表为「订单」,实际值和显示值均为第 1 列:订单 ID。如下图所示:
2.4 过滤条件设置
双击 A3 单元格,设置过滤条件,条件为普通条件:「订单 ID 」列等于参数 $ID。如下图所示:
2.5 隐藏行列设置
1)A3 单元格只是作为过滤数据使用,不需要展示在页面上,所以需要隐藏。可以直接选中第 3 行的行序号,单击鼠标右键选择隐藏,如下图所示:
也可以通过给 A3 单元格添加一个行高为 0 的条件属性,如下图所示:
2)同样点击 H 列,单击鼠标右键选择隐藏,将 H12 单元格隐藏。
2.6 报表填报属性设置
点击菜单栏「模板>报表填报属性」,按照下图所示给报表增加两个内置 SQL 提交。
内置 SQL1:
内置 SQL2:
2.7 效果预览
2.7.1 PC 端
保存报表,点击「填报预览」,查询订单号为 10001 的数据,效果如下图所示:
修改子表,修改数量与进价,点击提交,提示成功。刷新浏览器,再选择10001,可以看到数据已经改变,如下图:
2.7.2 移动端
App 端和 HTML5 端均支持,效果如下图所示:
3. 模板下载
已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Form\MultiFormReport\主从表填报.cpt
点击下载模板:主从表填报.cpt
4. 注意事项
4.1 多个内置 SQL 的执行顺序
多个内置SQL的执行顺序为从上到下,串行执行。多个内置SQL属于同一个事务,如果其中一个 SQL 语句执行失败,整个事务都会回滚,即撤销事务中所有已经执行的 SQL 语句,确保数据库状态回到事务开始之前的状态。