FineReport使用简介
1.数据源配置
FineReport通过SQL语句从数据库中获取感兴趣的数据,以特定方式关联在表格当中,保存为“工作表”。用户通过浏览器浏览对应工作表时,服务器通过解析工作表,讲所需数据以指定的方式显示到web页面,也就是报表。
因此,在制作报表前,需要连接到数据库,过程如下: 1)从菜单栏中选中服务器->定义数据库连接
2)点击左上角的加号标志,配置书库连接:
其中,数据库选项指定要连接数据库的类型,可以为DB2、Oracle、SQL Server等常用数据库;驱动器为JDBC驱动程序,根据所选数据库类型对应选择即可;URL需要根据数据库服务器IP、端口、数据库名称等对应填写,例如jdbc:db2://146.0.250.67:50000/warehous; 用户名和密码为数据库用户名和密码,应该确保该用户有足够的权限查询相关数据表。
2.报表制作
报表设计的流程大致可分为如下几个步骤(摘自FineReport帮助文档): a配置数据源
在报表设计之前,首先要添加报表所展示的数据的来源,当然这些来源并不一定是数据库,也可以是程序数据源,文本数据源等。
b新建报表
新建空白的自由报表,报表主设计界面是一个类似Excel的表格。
c添加数据源
数据源的添加可以在新建报表之前,也可以在新建报表之后。数据源列表会显示在左侧的数据源面板当中,用户可以直接选中并拖拽数据列到单元格中。
如下图,点击加号标志,添加报表数据集:
根据需要,选择合适的数据集类型,由于当前数据均从数据库获取,因此数据集类型选择为数据库查询:
在弹出的数据集设置对话框中,先选中对应的数据库连接,如软件自带的FRDemo数据库,在空白处填入SQL语句。
注:FineReport比较强大的一个功能是允许SQL语句中包含参数,这些参数可以让用户通过web页面输入,从而实现动态查询生成报表功能。
d设置数据记录摆放的方向
通常一个数据列会返回多条记录,也就是一个单元格绑定了一个数据列,但这个数据列中有多行数据。所以我们就要定义这些数据是从上到下进行列表,还是从左到右进行列表。另外,一般来说,需要汇总的数据,我们可以对其进行不扩展的设置。这是因为汇总的单元格,一般来说是作为其它单元格的附属格子来放置的。
生成上图数据集的SQL 语句为 SELECT * FROM EMPLOYEE;通过鼠标,可以将某一属性(如EMPID)拖放到报表中的某个单元格(如A2)。由于SQL查询结果的记录通常不唯一,因此需要设置它的显示方式及扩展填充方式。
e设置数据的类型
当单元格扩展的时候,无论数据是纵向放置还是横向放置,从数据显示的角度,可以进行分组,即将数据列中所有相同内容的记录进行合并;也可以数据列表,即将数据列中的所有数据记录扩展出来,无论数据记录是否重复。
f设置单元格之间的关系
除了可以绑定数据列,还有一点与Excel不同的是,FineReport的单元格在绑定了数据之后,并非平行的关系,而是格子之间存在附属关系,这种附属关系可以是默认的,也可以人为进行指定。
当一个格子默认不附属于任何格子,或者我们指定它不属于任何格子的时候,这个格子就是顶级的格子,或者可以叫做首格。首格的扩展与其他的格子没有关系,而且这个首格后面的格子将默认作为这个首格的附属格。这时候就是将Excel的所有格子分成几块相互没有关系的格子组,达到报表分片的效果。
以上实例在设计器预览效果如下:
3.SQL查询参数及公式使用 3.1参数使用
延续前文的实例,我们想系统给出会说指定语言的员工的列表。为此,在建立数据集时,将SQL查询改为:SELECT * FROM EMPLOYEE WHERE \"LANGUAGE\"='${lan}' 其中,'${lan}' 是参数的固定表示方式,单引号表示参数lan为字符型。
输入完毕,点击确定保存时,系统会提示是否刷新SQL中的参数,点击是。保存,系统提示输入参数,可暂时跳过。
回到设计界面,点击参数设计
根据提示,使用默认的参数布局,点击控件标志,进行相关参数设置
控件类型有很多种,可以根据需要选择。在此为了方便,我们采用下拉框控件。
数据项域选择自定义,然后通过“插入”添加要显示到下拉框的数据。
保存之后,点击分页预览查看web浏览效果。注:如果当前工作表未保存,系统会提示先保存后才能进行预览,此时只需保存工作表即可。
如下图,选择English,然后点击查询
查询结果如下图:
参数查询给提供动态显示报表的功能,使得报表输出更加灵活。但是不排除用户输入不合法参数的情况,因此有必要在用户提交查询请求时进行参数合法性验证。
在参数设计界面,双击查询按钮控件
在控件设置面板中,点击事件编辑器。
进入编辑界面,点击加号标志,添加点击验证
在function fun()中填入如下验证代码,当用户点击时,会被调用。验证代码验证lan是否为空,若为空则给出提示,且不执行该次查询。
如下图,如果查询时忘记通过下拉框选择查询语言,点击查询时,则会给出如下提示框:
可以通过设置单元格的属性,使输出的报表更加美观、清晰。
通过自定义,还可以找到EXCEL提供的所有属性设置
条件属性可以根据一些判定条件还改变单元格样式,比如可以根据行号的奇偶性来隔行着色,可以通过以下设置完成。期中row()是FineReport内置函数,可获取当前行号。
3.2函数、公式使用
FineReport提供了许多强大的内置函数,可以组合使用。还可以将函数嵌入到数据集的SQL语句中,实现“参数增强”。参数的使用说明可以查阅帮助文档中的专题知识->公式。
通过使用函数,可以实现数据的重新显示,比如数据库员工信息表中对性别的描述可能
为“Male”和“Female”,为了让其显示为“男”和“女”,可以双击数据单元格,进行数据列设置
选中自定义显示,将“$$$”修改为“if($$$==\"Male\男\女\")”。其中$$$表示当前单元格的原始数据值,“if($$$==\"Male\男\女\")”为函数组合而成的公式,与excel十分相似。
下面以实现模拟CPU每日使用率折线统计图为例来说明公式、参数、统计图的使用。 由于agent每5分钟采集一次数据,如果将一天内的数据全采集出来绘制到折线图上,会由于样本过多导致不清晰,因此有必要进行聚类,即将某一时段内的数据点通过平均组合成一个新的数据点。新建数据集SQL语句如下:
SELECT
\"System_Name\ \"STIME\
AVG(\"CPU_Busy\") as \"CPU_Busy\ AVG(\"User_CPU\") as \"User_CPU\ AVG(\"System_CPU\") as \"System_CPU\ AVG(\"Wait_I/O\") as \"Wait_I/O\ AVG(\"Idle_CPU\") as \"Idle_CPU\" from (select \"System_Name\
(case when (SUBSTR(\"Timestamp\>= '00' and SUBSTR(\"Timestamp\< '15') then SUBSTR(\"Timestamp\
when (SUBSTR(\"Timestamp\>= '15' and SUBSTR(\"Timestamp\< '30') then SUBSTR(\"Timestamp\
when (SUBSTR(\"Timestamp\>= '30' and SUBSTR(\"Timestamp\< '45') then SUBSTR(\"Timestamp\
when (SUBSTR(\"Timestamp\>= '45' and SUBSTR(\"Timestamp\<= '59') then SUBSTR(\"Timestamp\
end) as \"STIME\ \"CPU_Busy\\"User_CPU\\"System_CPU\\"Wait_I/O\\"Idle_CPU\"
from itmuser.\"SMP_CPU\"
where \"CPU_ID\" = -1 and \"System_Name\"='${SystemName}' and \"Timestamp\">='${format(date,\"1yyMMdd000000000\")}' and \"Timestamp\"<='${format(date,\"1yyMMdd235959000\")}' ) T group by \"System_Name\
SQL语句中,“SystemName”及“date”为查询参数,方便用户在查询时指定查询系统及日期。format为FineReport内置函数,用于格式化字符串。format(date,\"1yyMMdd000000000\")效果为将日期型数据date(2010-09-16)格式化为DB2数据表中的Timestamp格式(1100916000000000)。
注意,此处的Timestamp与DB2内置数据类型timestamp不是同一个数据类型。DB2内置数据类型Timestamp为当前时间距1970年1月1号零点的微秒数。而此处的Timestamp仅仅为某一时间各字段(世纪,1表示21世纪、年、月、日、时、分、秒、毫秒)的字符串顺序组合。
到参数设计页面,将SystemName设置为下拉框数据类型,并填入对应数据,如下:
将date设置为日期类型,
进入报表设计页面,选中某一单元格,插入图表。
在弹出对话框中选择“折线图”,下一步,然后类似于excel中的图表,进行绘图数据源设置。与excel中不同的是,除开从表格获取绘图数据外,FineReport还支持从SQL语句生成的查询数据集获取数据源。本例使用后者。
绑定数据表示从SQL查询数据集中获取绘图数据;
数据集选dailyCPU(建立数据集时使用的名字,若未自定义可能为ds1);
分类轴即为横坐标,在此要模拟CPU使用率在一天之中随时间变化的走势,因此分类轴应该选时间变量,即STIME;
系列名称表示需要绘制的变量。取自多个字段表示每个系列的值在数据库中不是同一个属性的值,即可以同时绘制系统CPU使用率和用户CPU使用率。在此,只选择CPU_Busy,即CPU总体使用率。
点击下一步,可以设置图表的标题、坐标轴数据显示等相关外观属性。完成,结束绘图数据源配置。
调整单元格到合适大小,并添加标题,最终设计界面如下:
保存,分页预览,结果如下:
3.3制作报表时可能会用到的函数
format(date,\"1yyMMdd000000000\"):将日期转换为数据库表中的Timestamp,用于限定查询时间 CONCATENATE(MID($$$,8,2),\":\:将某一Timestamp字符串拼接为某天24小时制时间表示。如$$$=1100916110825000处理后显示为11:08:25
4.CPU使用率日报实例制作
以CPU日报为例,说明报表制作的一般过程。日报的主要功能为:用户选择欲查询的服务器并选择查询日期,报表给出CPU使用率走势图(24个样本点),及CPU使用率表格统计(24个时段),报表完成后效果图如下。
首先建立数据库连接,如下图所示。Warehous是服务器数据连接名,可以自定义。另外需要注意的是数据库服务器的IP地址及服务端口及数据用户名和密码,应保证该用户有足够的权限查询数据。
创建新的工作簿,保存命名为CPU_daily_detail。
为工作簿简历数据集。首先编写SQL查询语句,建立数据集hourly_detail。
由于日报首先给出每天24个时段的CPU使用情况,用户点击某一个时段后再显示该时段内CPU使用的详细情况。因此需要读取小时表“SMP_CPU_H”和样本表“SMP_CPU”。先使用一下SQL语句建立数据集,该数据集给出了CPU一天内24个聚合值。
select * from itmuser.\"SMP_CPU_H\" where \"CPU_ID\" = -1 and \"System_Name\"='${SystemName}' and \"Timestamp\">='${format(date,\"1yyMMdd000000000\")}' and \"Timestamp\"<='${format(date,\"1yyMMdd235959000\")}' order by \"Timestamp\" 其中“SystemName”和“date”为查询参数,由用户在使用时给出。
另外,由于绘制CPU使用率走势图也需要数据,为了方便,使用以下SQL语句建立graph数据集,主要提供绘制CPU使用率走势图所需要的数据。其中SUBSTR函数主要用于将类似于“1101030123030000”的Timestamp转换为12:30,便于图表横坐标显示。
注:绘图数据也可以使用表格数据而不用单独编写SQL查询,但不容易控制数据格式,因此还是建议另外编写查询。
select \"AVG_CPU_Busy\VG_User_CPU\SUBSTR(\"Timestamp\from itmuser.\"SMP_CPU_H\" where \"CPU_ID\" = -1 and \"System_Name\"='${SystemName}' \"Timestamp\">='${format(date,\"1yyMMdd000000000\")}' \"Timestamp\"<='${format(date,\"1yyMMdd235959000\")}' order by \"Timestamp\" 按照下图格式设置好页面布局。其中,图表可以通过 “插入”->“悬浮元素”->“图表”,然后选择“折线图”下的“数据点折线图”。然后按照下图格式设置数据源。通过修改“系列名称”,可以定义数据在折线图上的显示值,如设置AVG_User_CPU为用户CPU使用率。
and and
然后制作表头,并将hourly_detail数据集的数据项拖入对应的单元格。初步布局如下图。注:G6一列seq()为函数,作用给出当前行的编号,从1开始。时段一列的数据通过公式完成,完整公式为:
if(G6 < 11, CONCATENATE(\"0\G6 - 1, \":00-\if(G6 < 10, CONCATENATE(\"0\G6, \":00\"), CONCATENATE(G6, \":00\"))), CONCATENATE(G6 - 1, \":00-\
主要作用是将编号转换为对应的时段,如编号1转为时段00:00~01:00,然后提供用户点击的超链接。超链接设置稍后介绍。
由于在实际报表中不需要看到编号,因此需要通过拖动相关列来隐藏G列。调整完成后,报表初步布局如下图:
设置超链接。由于超链接点击后,实际是弹出另外一个详细报表,并根据传入参数给出查询结果。因此还需要建立另外一个详细报表,命名为CPU_hour_detail。其布局如下图。其中samples数据集的SQL语句为:
SELECT * FROM ITMUSER.\"SMP_CPU\" where \"CPU_ID\" = -1 and \"System_Name\" = '${SystemName}' and \"Timestamp\">='${replace(format(date,\"1yyMMdd000000000\"),8,2,MID(hour,1,2))}' \"Timestamp\"<='${replace(format(date,\"1yyMMdd230000000\"),8,2,MID(hour,7,2))}' order by \"Timestamp\" 其中“SystemName”“date”“hour”为参数,从上一级报表传入。Replace函数主要用来通过传入的日期和时段来构造查询时间范围。
and
主报表超级链接的添加:在I6单元格中点击右键->超级链接,弹出以下对话框。先点击左上角的加号,添加“网络报表”,并命名。然后选择二级报表(根据实际命名而定),然后点击报表参数,会自动列出子报表所需要的参数。然后点击对应的“值”列,选择公式,如下图。
在弹出的公式框中,选择对应的数据源参数,如下图。注:hour参数可以通过公式设置为H6,表示其参数值为H6单元格的内容。
完成参数配置后,如下图:
到此,数据表结构基本完成,需要完善的就是主报表的参数设计了,即如何提供参数录入界面。为此,需切换到主报表,点击参数设计。
然后调整单元格大小及布局,并将英文参数名改为对应的中文名,最后参数布局如下:
然后设置空间类型,点击查询服务器控件,弹出对话框设置如下:
其中,serverlist为服务器数据集,创建方法如下:点击服务器->服务器数据集
在弹出的服务器数据集对话框中,点击加号,选择内置数据集,如下图:
通过添加并命名列,分别为real,show表示显示值和实际值。录入数据后,效果如下图:
点击日期控件,设置空间类型为日期,显示格式为yyyy-MM-dd,如下图:
至此,参数设计部分工作完成,可以完成报表查询显示功能。
另外,为了便于显示,可以调整CPU走势图的坐标的显示方式。例如,可以使横坐标倾斜45度显示。为此,需要双击数据点折线图的横坐标,在弹出的对话框中作如下设置:
还可以为数据点折线图添加标题。为此,需要双击折线图中的标题区域,在弹出的对话框中作如下设置:选择标题内容为“公式”,公式为
=CONCATENATE($SystemName, \使用率走势图\")
Concatenat函数将参数SystemName,date拼接为类似“zsdb:KUX2010-10-30CPU使用率走势图”的样式。