此番学finereport帆软可视化,一方面来源于个人理财研究之股票分析可视化看板的需求,另一方面来源于职业转型及精进的需要。前者,作为一颗小韭菜,为了尽快摆脱被割的厄运,也为了尽快有稳定的理财收益率;而后者,则希望尽快从跨行入行打杂的工作现状转型到更有含金量的工作岗位。
本篇博客,聊以记录,也为分享。共勉。—— 起于2020.11.4早晨
参考视频:B站 帆软基础入门教学视频 https://www.bilibili.com/video/BV1NJ411u7A3?from=search&seid=4624977545438302894
----------------------------------------------
目录
2.5.2 官方文档实操过程及疑难杂症(设计器简介_操作指南_单元格_超级链接)
2.5.3 官方文档实操过程及疑难杂症(报表应用_报表特性_超级链接_基础设置)
一、实操过程记录
1.1 扩展和父子格
较简单,略。或直接观看视频:https://www.bilibili.com/video/BV1NJ411u7A3?p=2
1.2 行式报表
1.3 分组报表
1.4 交叉报表
1.5 自由报表
2.1 简单多源报表
2.2 主子报表
2.2.1 决策式主子表
决策式主子表,出师不利,一给楼下新增那一波添加左父格到原来交叉报表《订单统计表》中的订单号B3或者客户编号B4,都报了个错,提示“数据量过大触发保护机制”。
双击B10订单明细,弹框里“过滤”条件增加如图,即可大幅度缩小单元格显示量,不超过“智能运维-内存管理-模板限制”中的限制量(初始默认是30万,我调到了300万),问题得以解决。
增加过滤条件,问题解决后,正常显示如下:
附个图(“智能运维-内存管理”)感受下内存的消耗:
分页显示
关键词:“行后分页”,即可分行显示。
2.2.2 嵌入式主子表
最终成效:
其中,子表1,来源于“雇员”表:
子表2,来源于“订单”表:
2.3 动态间隔运算
2.3.1 动态间隔运算1
视频里没提到数据源,然后我在帆软的官方文档里找到了数据源路径。。。其实就是<订单>表,获取数据源时把【订购日期】转换成“月份”显示,使用函数STRFTIME()。
本节B站视频链接:https://www.bilibili.com/video/BV1NJ411u7A3?p=9
本节在帆软官方文档的路径:https://help.fanruan.com/finereport/doc-view-338.html
SELECT STRFTIME('%m',订购日期) AS 月份,应付金额
FROM 订单
WHERE STRFTIME('%Y',订购日期)='2011'
成效效果如下:
“比较”、“占比”、“环比”的说明:
单元格 | 操作 |
---|---|
A1~E1 | 单元格依次写入字段标题名:月份,应付金额,比较,占比,环比。选中 A1~E1 单元格,设置标题预定义样式为Head类型 |
A2 | 数据集中的数据列「月份」拖入到单元格中 |
B2 | 数据集中的数据列「应付金额」拖入到单元格中,并在单元格元素>数据设置中对单元格数据进行汇总>求和 |
C2(比较) | 写入公式B2 - B2[A2:1],计算 B2 单元格扩展出来的数据,每一行与第一行的差值 |
D2(占比) | 写入公式B2 / SUM(B2[!0]),计算 B2 单元格扩展出来的数据,每一行在总值中的占比 |
E2(环比) | 写入公式IF(&A2 > 1, B2 / B2[A2:-1], 0),计算 B2 单元格扩展出来的数据,每一行与上一行的比率 |
2.3.2 动态间隔运算2
报表设计:(摘自 官方文档 https://help.fanruan.com/finereport/doc-view-338.html)
单元格 | 操作 |
---|---|
A1~E1 | 单元格依次写入字段标题名:年份,月份,应付金额,逐层累计,跨层累计。选中 A1~E1 单元格,设置标题预定义样式为Head类型 |
A2 | 数据集中的数据列「年份」拖入到单元格中 |
B2 | 数据集中的数据列「月份」拖入到单元格中 |
C2 | 数据集中的数据列「应付金额」拖入到单元格中,并在单元格元素>数据设置中对单元格数据进行汇总>求和 |
D2 | 写入公式C2 + D2[B2:-1],C2 单元格扩展出来的数据按年份逐行累计 |
E2 | 写入公式IF(&B2 > 1, C2 + E2[B2:-1], C2 + E2[A2:-1,B2:!-1]),C2 单元格扩展出来的数据逐行累计,跨年份时接着上一年份的累计结果继续累计,其中B2:!-1表示是找该组B2列的倒数第1行,如果是B2:!-2就是倒数第2行 |
A3~C3 | 合并 A3~C3 单元格,写入字段标题名:应付金额大于2500的月份个数。设置左父格为 A2,标题预定义样式为Head类型 |
D3~E3 | 合并 D3~E3 单元格,写入公式COUNT(C2[!0]{A2=$A2 && C2>2500}),统计应付金额大于2500的月份个数 |
最终效果如下图:(参照视频实操得出)
2.4 报表应用_条件属性
(1)主要涉及:
① 隔行显示背景色:“添加条件”-“背景”
② 预警效果:“添加条件”-“颜色”
③ 当运货商是“1”的时候,想让ta显示成“运货商一”:“添加条件”-“新值”
(2)最终效果如图:
2.5 报表应用_超级链接
2.5.1 B站视频实操过程及效果
SELECT * FROM 销量 where 地区 = '${地区}' ——单引号
or
SELECT * FROM 销量 where 地区 = "${地区}" ——双引号(待区分单引号和双引号区别)
=====链接是能链过去新报表了,只是链接前的界面跟B站视频的不太一样(自己实操的只能选“华北”,不能选“华东”,可能跟后面章节提到的“参数设置”有关)。晚点回来跟着官方文档撸一遍。
=====先看看我的实操成效:
<超级链接>官方文档参考:
设计器简介_操作指南_单元格_超级链接 https://help.fanruan.com/finereport/doc-view-223.html
报表应用_报表特性_超级链接_基础设置 https://help.fanruan.com/finereport/doc-view-907.html —— B站视频提供的官方地址。
----------------------
2.5.2 官方文档实操过程及疑难杂症(设计器简介_操作指南_单元格_超级链接)
2.5.2.1 主要内容
现在是跟住官方文档(不是B站视频)撸的过程,主要涉及:
① 日期排序
部分实操参考:打开订单信息表,修改订单信息表数据集 ds1 的 SQL 查询语句为SELECT * FROM 订单 ORDER BY ${a} ${b},给数据集参数a设置默认值「订购日期」,给数据集参数b设置默认值「ASC」(升序排序)。后面略。
② 链接报表
部分实操参考:打开订单明细表,修改订单明细表数据集 ds1 的 SQL 查询语句为SELECT * FROM 订单明细 WHERE 订单ID=${订单号},设置参数订单号的默认值为「10248」。
③报表导出Excel
部分实操参考:打开订单信息表,选中 F4 单元格,右边属性面板选择超级链接>添加链接>JavaScript脚本。新建一个 JavaScript 脚本类型的超级链接,将它重命名为「导出订单明细」,点击编辑按钮,进入JavaScript 脚本设置界面。点击,新建一个脚本参数ID,值为「A4」,在下方脚本代码编辑框中,输入JavaScript 脚本代码:
window.open(FR.cjkEncode("${servletURL}?reportlet=/订单明细表.cpt&订单号=" + ID + "&format=excel"));
注:确保「订单明细表.cpt」是保存在%FR_HOME%\webroot\WEB-INF\reportlets路径下的,如果您报表的保存路径不同,需要对JavaScript 脚本中的报表路径做修改。
2.5.2.2 问题解决
【问题一】“报表导出Excel”这里遇到个问题,就是“报表平台中报没有找到模板文件”。
原因及解决方案:由于我在官方默认路径下新建了一个文件夹“prac”并把练习文件放在了prac这个目录下,所以我的“订单明细表”实际路径应为\reportlets\prac 而不是\reportlets(另外我新建的cpt文件名是“引用_订单明细表”而不是官方文档的“订单明细表”,所以顺便一起改),把Javascript脚本改成
window.open(FR.cjkEncode("${servletURL}?reportlet=/prac/引用_订单明细表.cpt&订单号=" + ID + "&format=excel"));
就可以了。
【问题二】还是“报表导出Excel”这里,报错“错误代码:11300001 数据集配置错误”。
完整报错如下:Query:<br>错误代码:11300001 数据集配置错误<br>java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such column: A4)
报错说是没有A4这一列。而由上图【问题一】可见,A4列是订单号。那我们要回去看看这列引用为什么出错。
从某官方文档(https://help.fanruan.com/finereport/doc-view-223.html) 的评论中,我们发现一些蛛丝马迹:可能是A4参数配置时选了“公式”类型(还是不选“公式”类型?)。
那我们去看看A4的参数设置,调整测试一下。重新设置参数ID=A4:选择“公式”类型后,在弹框中输入“=A4”。保存ctp文件,刷新预览界面,重新尝试导出,成功。
附 预览页面如下:
附 点击“导出明细“列的”导出”按钮后,成功导出的报表如下:
至此,设计器简介_操作指南_单元格_超级链接 https://help.fanruan.com/finereport/doc-view-223.html,实操结束。
2.5.3 官方文档实操过程及疑难杂症(报表应用_报表特性_超级链接_基础设置)
2.5.3.1 <超级链接到报表及填报表设置>https://help.fanruan.com/finereport/index.php?doc-view-919.html
按照 <超级链接到报表及填报表设置-2. 超级链接到填报表等其他模式(如填报预览)>,
个人实操:
网络报表地址增加输入&op=write,在原来的“分页预览”基础上多了几个按钮:“添加记录”、“数据校验”、“提交”。
点“添加记录”,点一次就在产品ID为“17”的那行下面新增一行空行,点两次就新增两行空行,但是空行内无法编辑。所以,这个填报预览,不知道算不算成功,先放着吧。也许是预览模式无法填报,等到部署应用时才能填报。
当我将“&op=write”改成“$op=write”后,再预览子链接,就弹出了以下提示:“看到此页面,说明您已经成功部署了报表服务器”。不明所以。
点击进入“FS用户”后,界面是帆软的“数据决策系统”(如下图),贴出来供读者混个脸熟。(不是打广告。。。)
2.5.3.2 <超级链接打开位置>https://help.fanruan.com/finereport/doc-view-917.html
继续实操下一个:<超级链接打开位置>https://help.fanruan.com/finereport/doc-view-917.html,这次发现人家模板里的子报表“添加记录”后,双击空行是可以编辑提交的(如下图)。
3.1 参数入门
官方指引文档https://help.fanruan.com/finereport/doc-view-155.html
B站视频链接 https://www.bilibili.com/video/BV1NJ411u7A3?p=13
3.1.1 参数入门_参数入门
实操成功效果如下:
3.1.2 参数入门_数据集参数
3.1.2.1 简单应用
可以在新建数据集,定义 SQL 查询语句时,直接使用 where 条件过滤出所需数据,从而大大缩短报表取数时间,类似下面的 SQL 语句:
SELECT * FROM 销量 where 地区 = '${地区}'
3.1.2.2 带公式的应用
数据集 SQL 查询语句中可以使用参数宏${}动态地生成过滤条件,${}中的语句在 FineReport 报表中执行,将${}的执行结果与 SQL 语句拼接起来形成最终的查询语句,传递给数据库执行,可以使用多个${},如下 SQL 查询语句:
SELECT * FROM 订单 where 1=1 ${if(len(area) == 0,"","and 货主地区 = '" + area + "'")} ${if(len(province) == 0,"","and 货主省份 = '" + province + "'")}
${}中可以使用 FineReport 所有内置的公式,如 if 函数;
${}中除了 FineReport 内置的函数名、常量外,其他变量就是数据集参数。
如上 SQL 语句,if 函数是 FineReport 内置的公式,变量 area 就是数据集参数,如果len(area)!=0,即 area 参数不为空,比如说 area 的值为「华东」,那么 if 语句的执行结果为and 货主地区='华东',然后再把这句话拼接到 SQL 语句当中,SQL 语句就变成:
SELECT * FROM 订单 where 1=1 and 货主地区='华东'
-----------------------------------------------
二、后记
补充记录:
关于数据源导入,在学习伊始遇到较大阻碍。
第一个坎是数据库连接不上。找了同事帮忙看,原来是localhost后面应为“:”而不是“//”.
第二个坎是,之前连接上的数据库,再次打开查询表格时提示“严重:19:11:14 SwingWorker-pool-9-thread-4 ERROR [standard] 错误代码:11300001 数据集配置错误”。后面发现是因为我本地php的MySQL在电脑重启后没有去启动MySQL数据库,这样自然没法被连接上。
关于数据源导入/连接,其实通过某个措施,可以避免以上两个问题,就是,直接使用finereport自带的数据库数据FRDemo(参考链接:晚点再补,或者搜索“如何连接finerport帆软自带的数据库”)。