报表应用学习路径
使用 FineReport 设计器设计模板,首先需要了解 FineReport 模板制作的思路,沿着其思路来了解 FineReport 报表中的所有功能。
FineReport 报表制作流程如下图所示:
1)新建数据连接:在制作模板之前首先要确保设计者知道存储数据的数据库类型、数据库地址、访问数据库的用户名密码,然后在 FineReport 设计器中新建一个数据连接,建立数据库与设计器的交互桥梁。
2)新建模板与数据集:数据连接创建好之后,就需要进行模板的添加了,数据连接是用于整个工程的,并没有实质的将数据从数据库中取出来,故还需要在特定模板中新建数据集,通过数据连接从数据库中取数。
3)模板设计:数据准备完成之后,就是进行模板的设计了,模板设计是 FineReport 学习过程中的重中之重,我们将模板设计分为报表设计、参数设计、图表设计和填报设计四个部分,这四个部分是 FineReport 模板的几大使用方式,报表设计是纯粹的数据展示,参数设计是动态查询数据,图表设计是使用图表来展示数据,填报设计是录入数据,将数据写入数据库中,根据实际情况确定使用哪一种使用方式,或者联合使用哪几种使用方式。
4)模板预览:模板设计完成之后,保存模板至工程目录下面,即可预览,在 Web 端查看模板效果
常用时间函数
常用时间函数
当年第一天:DATEINYEAR(TODAY(), 1)
当年最后一天:DATEINYEAR(TODAY(), -1)
当月第一天:DATEINMONTH(TODAY(),1)
当月最后一天:DATEINMONTH(TODAY(),-1)
上月最后一天:DATEINMONTH(TODAY(),1)-1
下月第一天:DATEINMONTH(TODAY(),-1)+1
当前日期的年份:year(today())
当前日期的月份:month(today())
当前日期的日:day(today())
当前日期前一天:datedelta(today(),-1)
当前日期的上一月:monthdelta(today(),-1)
当前日期的上一年:yeardelta(today(),-1)
格式化日期
#获得上个月年月日期:
FORMAT(DATEINMONTH(TODAY(),1)-1,'yyyy-MM')
#计算年龄公式
cast(strftime('%Y','now') as int)-cast(strftime('%Y',出生日期) as int)+1 AS 年龄
本月日期:
year(today()) + "-" + (month(today()))
上月日期:
year(today()) + "-" + (month(today()) - 1)
year(monthdelta(today(),-1)) + "-" + month(monthdelta(today(),-1))
同比:
TODATE(CONCATENATE('202301','01'),'yyyyMMdd')
ps :202309
to_char(concat('202309','01')::date - INTERVAL '1 month','yyyyMM')
202308
参数为空实现全部查询
预期效果
使用参数进行报表数据查询时,希望当参数值为空时,点击查询后,显示报表中的全部数据。即在没有筛选条件的时候,显示报表所有内容,相当于不选值就不过滤。
1.数据集方式
因为定义数据集参数时,支持使用 FineReport 所有内置函数,所以就可以通过 IF 函数来构造判断;参数为空如何判断呢,参数为空即参数值长度为 0,所以就可以使用 Len 函数来判断参数是否为空。
组合起来,定义数据集参数的SQL语句如下:
在定义数据集参数时给它设置条件来实现参数为空选全部的效果,新建数据集 ds1,输入数据库查询语句:SELECT * FROM 订单 WHERE 1=1 ${if(len(area) == 0,“”,“and 货主地区 = '” + area + “'”)} ,此时数据集参数为「area」,设置参数默认值为华北,如下图所示:
公式中语句的注释如下:
where 1=1 表示条件永真,防止没有参数条件时,where 后面没有有效内容导致出错。
len(area)==0 表示参数「area」为空。
“and 货主地区='”+area+“'” 中间的「area」表示取参数值,‘+’ 为字符串拼接符号。
${if(len(area) == 0,“”,“and 货主地区 = '” +area + “'”)} 表示:
当参数「area」为空时,查询语句相当于:SELECT * FROM 订单
当参数「area」不为空时,查询语句相当于:SELECT * FROM 订单 WHERE 1=1 and 货主地区=‘${area}’
2.模板参数
可以通过 IF 函数来构造判断;参数为空可以使用 Len 函数来判断,参数长度为 0 时参数即为空,FineReport 过滤条件中,nofilter 表示不过滤,如此结合则得到过滤条件:
if(len( a r e a ) = = 0 , n o f i l t e r , area)==0,nofilter, area)==0,nofilter,area)
3.参数控件实际值和显示值
数据集
实际值为
显示值为
实现方式:
实际值:
显示值公式
VALUE("账套类型",2,4,$$$,1)+" "+ VALUE("账套类型",3,4,$$$,1)
动态分行
选中 A5 单元格,添加「条件属性」,属性选择「分页」>「行后分页」。公式条件类型选择公式,点击「定义按钮」输入公式:&A5 % $pageSize = 0。
&A5为该单元格数据的序号, p a g e S i z e 为下拉框的值,此条件表示序号为 pageSize 为下拉框的值,此条件表示 序号为 pageSize为下拉框的值,此条件表示序号为pageSize 的整数倍时行后分页,即每$pageSize行分页。步骤如下图所示:
注1:条件属性必须设置在「最左父格」上。
注2:「pageSize」需要与「下拉框控件」中「控件名称」保持一致。
动态列
https://blog.csdn.net/u012190388/article/details/122049834