1. 条件属性
1.1 应用场景
1.1.1 官方文档
1.2 案例1: 根据条件单元格显示不同的背景色
1.2.1 概述
1.2.1.1 问题描述
在 FineReport 中制作报表时,经常遇到在满足一定条件下「单元格/行/列」需要显示为不同的背景色,那么该如何实现呢?
1.2.1.2 解决思路
可以通过添加「条件属性>背景」来实现。
设置「当前格子/当前行/当前列」的原理一样,本文以「当前格子」和「当前行」为例进行简单讲解。
1.2.2 HOW:当前格子
1.2.2.1 准备数据
新建普通报表,新建内置数据集「电商销售占比」,记录各电商不同产品的销量占比:
drop database if exists db_1;
create database db_1;
use db_1;
-- 创建表
CREATE TABLE ecommerce_data (
type VARCHAR(255),
taobao FLOAT,
tmall FLOAT,
jd FLOAT,
yhd FLOAT,
dangdang FLOAT,
amazon FLOAT,
suning FLOAT,
jmyp FLOAT,
yixun FLOAT,
vip FLOAT,
lefengwang FLOAT,
womaiwang FLOAT
);
-- 插入数据
INSERT INTO ecommerce_data (type, taobao, tmall, jd, yhd, dangdang, amazon, suning, jmyp, yixun, vip, lefengwang, womaiwang) VALUES
('衣物、鞋子、包、首饰', 0.61, 0.335, 0.024, 0.002, 0, 0.002, 0, 0, 0, 0.026, 0, 0),
('家用杂货', 0.204, 0.131, 0.519, 0.014, 0.008, 0.005, 0.095, 0, 0.019, 0.006, 0, 0),
('家电、通信、电子产品', 0.15, 0.104, 0.548, 0.026, 0.01, 0.074, 0.041, 0, 0.046, 0.001, 0, 0),
('化妆品', 0.513, 0.234, 0.079, 0.008, 0.006, 0.003, 0.002, 0.118, 0.001, 0.016, 0.02, 0),
('个人护理', 0.291, 0.224, 0.256, 0.154, 0.005, 0.02, 0.005, 0.029, 0.01, 0.005, 0, 0.001),
('食品', 0.447, 0.331, 0.052, 0.124, 0.033, 0.003, 0.002, 0, 0.002, 0, 0, 0.006),
('酒水饮料', 0.271, 0.26, 0.253, 0.182, 0.012, 0.017, 0.002, 0, 0.002, 0, 0, 0.001),
('家用清洁', 0.24, 0.229, 0.251, 0.264, 0, 0, 0.003, 0, 0.012, 0, 0, 0),
('婴儿用品', 0.483, 0.346, 0.13, 0.02, 0.005, 0.004, 0.008, 0, 0.002, 0.001, 0, 0.001),
('书籍唱片', 0.116, 0.213, 0.142, 0, 0.352, 0.176, 0, 0, 0, 0, 0, 0);
select * from ecommerce_data;
电商销售占比 | ||||||||||||
淘宝网 | 天猫 | 京东 | 1号店 | 当当网 | 亚马逊 | 苏宁易购 | 聚美优品 | 易迅 | 唯品会 | 乐蜂网 | 我买网 | |
衣物、鞋子、包、首饰 | 0.61 | 0.335 | 0.024 | 0.002 | 0 | 0.002 | 0 | 0 | 0 | 0.026 | 0 | 0 |
家用杂货 | 0.204 | 0.131 | 0.519 | 0.014 | 0.008 | 0.005 | 0.095 | 0 | 0.019 | 0.006 | 0 | 0 |
家电、通信、电子产品 | 0.15 | 0.104 | 0.548 | 0.026 | 0.01 | 0.074 | 0.041 | 0 | 0.046 | 0.001 | 0 | 0 |
化妆品 | 0.513 | 0.234 | 0.079 | 0.008 | 0.006 | 0.003 | 0.002 | 0.118 | 0.001 | 0.016 | 0.02 | 0 |
个人护理 | 0.291 | 0.224 | 0.256 | 0.154 | 0.005 | 0.02 | 0.005 | 0.029 | 0.01 | 0.005 | 0 | 0.001 |
食品 | 0.447 | 0.331 | 0.052 | 0.124 | 0.033 | 0.003 | 0.002 | 0 | 0.002 | 0 | 0 | 0.006 |
酒水饮料 | 0.271 | 0.26 | 0.253 | 0.182 | 0.012 | 0.017 | 0.002 | 0 | 0.002 | 0 | 0 | 0.001 |
家用清洁 | 0.24 | 0.229 | 0.251 | 0.264 | 0 | 0 | 0.003 | 0 | 0.012 | 0 | 0 | 0 |
婴儿用品 | 0.483 | 0.346 | 0.13 | 0.02 | 0.005 | 0.004 | 0.008 | 0 | 0.002 | 0.001 | 0 | 0.001 |
书籍唱片 | 0.116 | 0.213 | 0.142 | 0 | 0.352 | 0.176 | 0 | 0 | 0 | 0 | 0 | 0 |
1.2.2.2 表格设计
A2 单元格单击右键选择「单元格元素>插入斜线」,输入「电商|产品」,选择「从左上到右下发散」。B2~M2 输入电商名称,将数据列拖入对应单元格 A3~M3,表格样式如下图所示:
注:上述表格宽度已超过默认纸张大小宽度,需要在 模板>页面设置 中修改纸张大小使其预览时显示在同一页面上。
1.2.2.3 添加条件属性
选中 B3~M3 单元格,新增「背景」类型的条件属性,点击「编辑」自定义一个颜色,然后设置作用于「当前格子」。
然后设置这个条件属性生效的条件:条件类型选择「普通」,值类型选择「双精度型」,用「AND」连接两个条件,如下「大于或等于 0.5 」and「小于 0.7」。
依次添加 6 个条件属性,如下表所示:
条件属性 | 条件 |
条件属性1 | 大于或等于 0.5 and 小于 0.7 |
条件属性2 | 大于或等于 0.3 and 小于 0.5 |
条件属性3 | 大于或等于 0.1 and 小于 0.3 |
条件属性4 | 大于或等于 0.05 and 小于 0.1 |
条件属性5 | 大于 0 and 小于 0.05 |
条件属性6 | 等于 0 |
注:条件属性执行顺序由上到下。
1.2.2.4 效果预览
PC 端
保存报表,点击「分页预览」,不同区域段显示不同颜色,可达到与热力图相同的效果。如下图所示:
移动端
App 端和 H5 端均支持,效果如下图所示:
1.3 案列2:隔行换色
参考模板
打开模板%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Primary\DetailReport\数据显示格式.cpt
1.3.1 目标:
1.3.2 how
1.3.2.1 准备数据
数据库查询
SELECT * FROM 订单
1.3.2.2 准备报表
订单ID | 客户名称 | 订购日期 | 到货日期 | 运货商 | 运货费 | 是否已付 |
ds1.G(订单ID) | ds1.G(客户ID) | ds1.G(订购日期) | ds1.G(到货日期) | ds1.G(运货商) | ds1.G(运货费) | ds1.G(是否已付) |
1.3.2.3 隔行设置背景色
选中 A2 单元格,点击右侧「条件属性」,添加一个条件,选择属性为「背景」,点击「编辑」选择一个颜色,设置范围为「当前行」。公式条件类型选择「公式」,点击「定义」输入公式:row()%2=0,输入完成后点击「增加」。
条件说明:row() 为获取当前行号,被 2 整除余 0 即为偶数行。即偶数行有背景,奇数行没有背景。
步骤如下图所示:
1.3.2.4 效果预览
PC 端
保存报表,点击「分页预览」,效果如下图所示:
移动端
App 端和 H5 端均支持,效果如下图所示:
1.4 案例3:条件隐藏单元格
官方文档
条件隐藏单元格帆软官方文档
1.4.1 目标
| |
1.4.2 实现思路
通过设置条件属性的行高或列宽来实现,依据条件来判断是否隐藏该区域单元格。
1.4.3 HOW
1.4.3.1 添加模版参数
图表是否显示
1.4.3.2 设置参数模版
进入参数面板编辑界面,将右上角的「图表是否显示」添加进参数面板,设置控件为「下拉框控件」,设置其「数据字典」为「自定义」,输入值如下图所示:
1.4.3.3 设置条件属性
1.4.3.4 效果预览
保存报表,点击「分页预览」
2. 参数控件查询
2.1 下拉框单选查询
模板参数帆软官方文档
2.1.1 目标
-
下拉框中选择「华东」,点击查询,只查询出报表中华东地区的销售信息。
-
下拉框中选择「华北」,点击查询,只查询出报表中华北地区的销售信息。
-
下拉框中选择「 」,点击查询,查询出报表中所有地区的销售信息。
2.1.2 方案一 模版参数
2.1 数据准备
新建数据集 ds1,数据库查询对话框中写入 SQL 查询语句:SELECT * FROM 销量,取出销量表中的所有数据。如下图所示:
2.2 表格样式设计
1)A1~C1 单元格写入表格标题信息,选中 A1~C1 单元格,右侧属性面板选择「单元格属性>样式」,样式下拉框选择「预定义样式」,给标题设置一个「Head」类型的样式。如下图所示:
2)将数据集中的字段拖入到对应单元格中,选中 A2~C2 单元格,将字体居中,选中 A1~C2 单元格,给表格整体添加预定义样式默认的天蓝色内外框。如下图所示:
3)选中 C2 单元格,右侧属性面板选择「单元格元素>基本」,数据设置下拉框选择「汇总>求和」。如下图所示:
2.3 定义模板参数
1)菜单栏选择「模板>模板参数」,弹出模板参数设置对话框。如下图所示:
2)模板参数对话框点击增加按钮,新建一个模板参数,双击该参数将它重命名为「地区」,设置默认值为字符串「华东」。点击确定完成模板参数的定义。如下图所示:
如果想要修改模板参数名称,只能通过双击原名称进入编辑状态后进行修改,修改完后点击「确定」即可,如下图所示:
2.4 参数添加控件
1)点击参数面板的「编辑」按钮,进入参数面板编辑界面。如下图所示:
2)右上角控件设置面板会显示没有添加控件的参数,点击「地区」或者点击「全部添加」,将参数的默认控件添加到参数面板。如下图所示:
注:参数与控件是通过参数名称进行绑定的,也就是说当控件名称与参数名称一致时,参数与控件就进行了绑定,即在 Web 端给控件赋值就相当于给参数赋值。
3)参数「地区」的默认控件添加到参数面板后,效果如下图所示:
注:如果不想点击「全部添加」或「参数」快捷添加默认控件,也可以直接从控件栏中将控件拖拽到参数面板中,修改控件的名称与参数名称一致,即可将控件与参数进行绑定。
4)点击自定义控件的「编辑」按钮,选择「文本控件」类型,让用户自行输入参数值。如下图所示:
5)将查询按钮往左边拖拽,形成紧凑式布局,让控件面板更加美观。再次点击参数面板的「编辑」按钮,完成参数面板的设置。如下图所示:
2.5 数据过滤
设置好控件后还不能实现根据文本框中输入的参数值查询指定地区的销售信息。因为表格的数据来源于数据集,数据集中的数据是将数据库表中的数据全部取出来的,所以需要给表格添加「数据过滤条件」,才可以查询出控件输入的参数值的信息。
双击 A2 单元格,在弹出的数据列对话框中选择「过滤」,添加一个普通条件,设置数据列为地区,操作符为等于,值类型修改为参数类型,选择 $地区,点击「增加」按钮,点击「确定」。即将地区单元格与参数绑定起来。如下图所示:
2.1.3 方案二 数据集
2.1.3.1 概述
1.1 应用场景
类似通信、监控行业,每天都有海量数据生成,数据库表中总数据量非常大,而报表中往往只要获取当天的几百条数据就可以了。
如果使用模板参数,就需要先取出所有数据,再进行过滤,取数+过滤,将消耗大量时间,极大影响报表的查询效率。而数据集参数在数据库查询时就已经完成了数据过滤,所以使用数据集参数设计的查询报表会比使用模板参数的效率高。
1.2 功能简介
定义数据集时,通过在 SQL 语句中添加 ${para}格式的内容,即可定义数据集参数,定义完成后,使用方法和模板参数一致。如下图所示,下拉框选择「华东」,点击查询,只查询出报表中华东地区的销售信息。
注:数据集参数不与数据集绑定,多个数据集中的同名参数为同一个参数,参数值以最后一次赋值为准。
2.1.3.2 使用说明
数据集 SQL 查询语句中可以使用参数宏 ${}动态地生成过滤条件,${} 执行结果与 SQL 语句拼接起来形成最终的查询语句,传递给数据库执行。SQL 语句中可以使用多个 ${},定义多个参数使用。
使用${} 定义参数时,{ }内写入的内容即为定义参数的内容,其中可以使用 FineReport 所有内置的函数,如 if 函数、len 函数等。{ }中除了 FineReport 内置的函数名、常量、字符串拼接语法外,其他变量就是数据集参数。
如:SELECT * FROM 销量 where 地区 = '${area}' 中定义的数据集参数为 area。
注:定义数据集参数时,尽量不要在${}中直接使用{ 、},可能会无法解析。若必须在${}中直接使用{ 、},需要使用函数 CONCATENATE 转义,例如:SELECT * FROM 销量${'{'}语句会出现报错,需要将语句改为 SELECT * FROM ${CONCATENATE("销量{")},即可正常查询。
带有数据集参数的 SQL 语句写好后,点击数据集定义界面「预览」按钮时,若显示出定义的数据集参数。则表明数据集参数定义成功。如下图所示:
在参数位置输入值后点击确定,参数值就会代入 SQL 语句中,查询出数据。
如下给出几种常见的应用方式,用户在使用时按实际场景调整即可。注意,因为数据集参数用在 SQL 查询语句中,所以在使用时,特别要注意语法和对应数据库类型的 SQL 语法匹配。
2.1 简单应用
如要定义一个地区参数,通过此参数过滤数据。新建数据集时,就可以在 SQL 查询语句中定义一个数据集参数 area:SELECT * FROM 销量 where 地区 = '${area}'
SQL 语句中,其他内容都是确定的,唯有 area 不确定,当 area 对应不同值时,数据集也将查询出不同地区的数据。
如果要实现多选查询,就可以结合 SQL 语句 in 的用法定义一个参数,如:SELECT * FROM 销量 where 地区 in ('${area}')
输入参数值时注意要和数据库语法一致,如查询华东华北的数据 SQL 语法为 SELECT * FROM 销量 where 地区 in ('华东','华北'),输入的参数值形式应该为 华东','华北,这样加上定义时的 ('${area}') 就会拼接成正确的语法。
2.2 带公式的应用
定义数据集参数时,可以使用 FineReport 所有内置函数。如需要定义一个地区参数,当地区为空时,查询所有地区的数据;当地区值不为空时,查询对应地区的数据:
SELECT * FROM 订单 where 1=1 ${if(len(area) == 0,"","and 货主地区 = '" + area + "'")}
定义时,先使用函数 len 获取参数的长度,然后使用 if 函数进行判断
-
如果 area 参数的长度为 0,则内容为空,SQL 拼接后为 SELECT * FROM 订单 where 1=1;
-
如果 area 参数的长度不为 0,则将字符串 and 货主地区 = '、参数area、'拼接成一句 SQL ,如area的值为华东,那么参数定义部分的执行结果为and 货主地区='华东',完整的 SQL 语句就变成:SELECT * FROM 订单 where 1=1 and 货主地区='华东'
2.3 定义多个参数
如果在数据过滤中,需要多个过滤条件,则可以定义多个数据集参数,如:
SELECT * FROM 订单 where 1=1 ${if(len(area) == 0,"","and 货主地区 = '" + area + "'")} ${if(len(province) == 0,"","and 货主省份 = '" + province + "'")}
其中使用了两次 ${},定义了两个数据集参数 area 和 province,定义过程解释可参考 2.2 节。
2.4 嵌套应用
定义数据集参数时,也可以通过一些逻辑判断嵌套定义多个数据集参数。如:
SELECT * FROM 销量 where 1=1 ${if(len(area)!=0," and 地区='"+area+"'",if(len(product)== 0,""," and 产品='"+product+"'"))}
if 函数是 FineReport 内置的公式,变量 area 和 product 是数据集参数,如果len(area)!=0,即 area 参数不为空,即以
SELECT * FROM 销量 where 1=1 and 地区='area' 查询,如地区为空,则要判断 len(product) ,若product参数为空,则不拼接任何查询条件,即查出所有,否则以 SELECT * FROM 订单 where 1=1 and 产品='product' 查询。
2.1.3.3 示例
3.1 定义数据集参数
新建数据集 ds1,数据库查询对话框中写入 SQL 查询语句 SELECT * FROM 销量 WHERE 地区='${area}',相当于在数据库查询语句中定义一个数据集参数area。点击右下角「刷新」按钮,下方数据集参数管理面板会显示已经新建好的数据集参数 area,设置它的默认值为 华东。点击「确定」,即同时完成了数据准备和定义数据集参数的工作。如下图所示:
3.2 表格样式设计
1)如下图所示设置表格样式,其中给表格选择预定义样式 Head类型的样式,标题字体自动居中。如下图所示:
2)将数据集中的字段拖入到对应单元格中,字体居中,给表格整体添加预定义样式默认的天蓝色内外框。如下图所示:
3)选中 C2 单元格,右边属性面板选择「单元格元素>基本」。数据设置下拉框选择汇总>求和。如下图所示:
3.3 参数添加控件
1)点击参数面板的「编辑」按钮,进入参数面板设置界面。如下图所示:
2)右上角控件设置面板会显示没有添加控件的参数,点击 「area 」或者点击「全部添加」,将参数的默认控件添加到参数面板。如下图所示:
注:参数与控件是通过参数名称进行绑定的,也就是说当控件名称与参数名称一致时,参数与控件就进行了绑定,即在 Web 端给控件赋值就相当于给参数赋值。
3)参数area的默认控件添加到参数面板后,效果如下图所示:
注:如果不想点击「全部添加」或「参数」快捷添加默认控件,也可以直接从控件栏中将控件拖拽到参数面板中,修改控件的名称与参数名称一致,即可将控件与参数进行绑定。
4)点击自定义控件的「编辑」按钮,选择下拉框控件类型,让用户通过下拉框选择参数值。如下图所示:
5)要想报表预览时点击「下拉框」可以出现参数值的选项,则需要设置下拉框的数据字典为销量表下的地区字段。
参数面板选中「下拉框控件」,右边属性面板选择「属性>数据字典」,点击数据字典「编辑」按钮,弹出数据字典设置对话框。数据字典的类型设置为数据库表,数据库为 FRDemo ,选择数据库表为销量,列名实际值和显示值都为地区。如下图所示:
注:控件绑定数据字典时,当数据集中有和控件同名的参数时,不要使用,否则将造成循环引用,使得模板出错,如此处 ds1 。
6)点击「标签控件」,将控件值命名为地区:。如下图所示:
7)将查询按钮往左边拖拽,形成紧凑式布局,让控件面板更加美观。再次点击参数面板的「编辑」按钮,完成参数控件的设置。如下图所示:
2.2 下拉复选框查询
2.2.1 官方参考页面
下拉复选框帆软官方文档
2.2.2 目标
2.3 范围查询
2.3.1 官方参考
范围查询帆软官方文档
2.3.2 目标
2.3.2.1 预期效果
通过 控件筛选查询 ,可以实现单个参数、单个控件过滤数据,如果想要实现多个控件过滤数据,该怎么做呢?
如下图所示,想要查询一定时间范围内的数据:
2.3.2.2 实现思路
多个控件查询和单个控件查询思路基本一致,唯一的不同点为多个控件查询对应多个参数,所以多控件查询只需要在 控件筛选查询 的基础上稍作修改即可,也是通过数据集参数和模板参数两种方法实现。
-
数据集参数:在数据查询中定义数据集参数时,定义多个参数。
-
模板参数:定义多个模板参数,报表中添加多个过滤条件。
2.4 日期控件查询
日期控件帆软官方文档
2.5 参数为空查询全部
2.5.1 下拉框参数为空选择全部
2.5.1.1 官方参考
参数为空帆软官方文档
2.5.1.2 预期效果
使用参数进行报表数据查询时,希望当参数值为空时,点击查询后,显示报表中的全部数据。即在没有筛选条件的时候,显示报表所有内容,相当于不选值就不过滤。
如下图所示:
2.5.1.3 解决思路
参数过滤查询,一般都是通过模板参数或者数据集参数实现,所以要想实现此场景,就需要修改过滤条件和数据集定义方式。修改的原则:
-
数据集参数:当参数值为空时,查询报表所有内容
-
模板参数:当参数值为空时,不进行过滤
2.5.2 下拉复选框参数为空选择全部
2.5.2.1 官方参考
2.5.2.2 问题描述
在使用参数进行过滤时,选择某个参数值后就会根据选择的值进行过滤,但是如何实现如下图效果即货主地区下拉复选框中不选择参数值时能够查询出数据表中的全部值呢?效果如下图所示:
2.5.2.3 解决思路
下拉复选框可以通过报表参数或数据参数来实现复选,若需要实现参数为空选择全部,可取消勾选「点击查询前不显示报表内容」即可。
2.6 SQL语句实现下拉框参数联动
2.6.1 官方参考
SQL语句实现下拉框参数联动帆软官方文档
2.6.2 预期效果
当模板中有多个参数下拉框时,后面参数下拉框的选项需根据前面参数的值而改变。上一个下拉框选择了值后,下一个下拉框根据上个下拉框的值显示选项。下拉框选项之间有层级关系,可以实现多级联动。
如下图中,省份选项需跟随地区所选值而相应变动,城市选项需跟随地区、省份所选值相应变动。
2.6.3 实现思路
可以通过 SQL() 函数实现数据之间的联动,新增数据集作为各个参数框的数据字典,在后面参数框数据集中引用前面的参数作过滤。
2.7 多组件查询
2.7.1 官方参考
SQL语句实现下拉复选框参数联动帆软官方文档
2.7.2 预期效果
前面章节介绍了 SQL 语句实现下拉框参数联动,当参数控件为下拉复选框时,如何实现同样的联动效果呢?如下图所示,省份选项会跟随地区所选值而相应变动,城市选项会跟随地区、省份所选值相应变动。
2.7.3 实现思路
可以通过 SQL() 函数实现数据之间的联动,新增数据集作为各个参数框的数据字典,在后面参数框数据集中引用前面的参数作过滤。
2.7.4 bug:
https://help.fanruan.com/finereport/doc-view-4181.html
三级联动 显示 出现问题:
2.8 动态列: 数据集参数实现动态列
2.8.1 目标效果
当报表的数据列比较多,但数据量不是很大时,可如下图所示实现动态列数据展示:
注:此方案不支持报表开启行式引擎时使用。
2.8.2 方案一 使用函数实现动态列
https://help.fanruan.com/finereport/doc-view-1288.html
2.8.3 方案二 条件属性实现动态列
https://help.fanruan.com/finereport/doc-view-3499.html
3. 超链接
3.1 JavaScript超链传参
3.1.1 效果预览
保存报表,分页预览后,点击两个超链的效果如下图所示:
https://help.fanruan.com/finereport/doc-view-911.html
3.2 超级链接到有参数的模板
3.2.1 预期效果
在设置超级链接时,会遇到链接到的模板是有参数。希望点击超级链接时,当前单元格的内容作为参数值传递给下一个报表的参数。如下图所示:
3.2.2 实现方法
通过网络报表或 JavaScript 脚本,实现超级链接到有参数的模板。
https://help.fanruan.com/finereport/doc-view-947.html
3.3 钻取的数据显示在当前页面
3.3.1 效果预览
点击超级链接钻取数据时,希望数据可以直接显示在当前页面,不用跳转到另一个模板。效果如下图所示:
3.2.2 实现思路
借助「动态参数」类型的超级链接和「数据过滤」功能实现。
https://help.fanruan.com/finereport/doc-view-943.html