1. 概述编辑
1.1 版本
报表服务器版本 | 功能变更 |
---|---|
11.0 | -- |
1.2 预期效果
利用 数据集 或 函数 方式制作出来的动态列默认是只能显示固定的列字段的,没有动态分组统计的功能,如果报表需要使用动态列,同时某个字段又需要汇总,那么原来的方法就不太适用了,必须进行改进。最终效果如下图:
1.3 实现思路
由于 FineReport 为普通列提供的汇总不再适用于动态列,要想实现「销量」按前面的列自动汇总的话,必须通过 SQL 进行处理,首先判断动态列是否选择了「销量」,然后把销量字段处理成汇总。
2. 示例编辑
2.1 准备模板
打开模板%FR_HOME%\webroot\WEB-INF\reportlets\doc\Parameterr\DynamicCol\数据集参数实现动态列.cpt。详情可参见:数据集参数实现动态列 。
1)将 A2-F2 单元格的数据设置改由「列表」改成「分组」,如图:
2)修改数据集 ds1 的 SQL 语句为:SELECT ${if(len(col)=0,'*',replace(col,'销量','sum(销量)'))} FROM 销量 ${if(len(col)<1,"","group by "+replace(col,',销量',''))},可实现:
参数为空时,查询全部,按左父格分组显示
勾选参数但未包含「销量」列时,仅按左父格分组显示
勾选了参数且包含「销量」列时,「销量」列可按左父格分组汇总
语句说明如下表:
公式 | 公式说明 |
---|---|
${} | 括号内可支持 FineReport 的内置公式 |
if(len(col)=0,'*',replace(col,'销量','sum(销量)')) | 表示参数col为空时,查询全部;不为空时,可使用 replace 函数将查询结果中「销量」列的值用sum(销量)替换 |
if(len(col)<1,"","group by "+replace(col,',销量','')) | 表示参数col为空时,执行空,相当于SELECT ${if(len(col)=0,'*',replace(col,'销量','sum(销量)'))} FROM 销量 不为空时,执行 "group by "+replace(col,',销量',''),根据一个或多个列对查询结果进行分组 |
"group by "+replace(col,',销量','') | group by中不能出现销量列,所以如果勾选了「销量」列,则「销量」列用空替换 注:',销量' 中的逗号不能省略,因为用空值替换时,会出现 SQL 语句报错。 |
3)删掉参数 col 的变量默认值,如下图所示:
2.2 效果预览
1) PC 端
保存模板,点击「分页预览」,效果如下图所示:
2) 移动端
App 端及 H5 端均支持,效果如下图所示:
3. 模板下载编辑
已完成模板,可参见:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Parameter\DynamicCol\动态列的分组统计.cpt
点击下载模板:动态列的分组统计.cpt