关于如何解决大数据量下报表块(决策报表)工具栏数据行数显示不准的问题
问题引出:
当前处理方法是按照类似cpt报表的用count(A2)计算报表块单元格人后再使用_g().getWidgetByName("report0").getCellValue("A1")引用A1单元格的的行数从而实现行数计算!
count(A2)计算行数参考文档:JS实现工具栏添加计数
该方法弊端:
该方式必须在报表块数据渲染完毕才可引用,对于小数据量(渲染较快)的情况下可以实现正确的行数显示,但对于大数据量(渲染较慢)的情况下,使用_g().getWidgetByName("report0").getCellValue("A1")方法可能会出现A1单元格取数比渲染出A1单元格(计算出当前查询的总行数)快的情况发生,此时A1单元格保留的是上一次的计算行数,所以会错误获取到上一次A1单元格统计的行数。
如下所示:
解决办法:
使用数据集行数统计替代单元格行数统计,关键处理使用FR远程公式计算当前数据集行数:FR.remoteEvaluate('=ROWCOUNT("数据集名称")')
以下展示在工具栏显示报表块行数:
(1)打开报表块工具栏,开启使用工具栏,添加一个自定义按钮(用于后续现实页数使用)
点开设置可以看到设置的自定义按钮
(2)选中刷新按钮,添加点击事件
(3)刷新按钮点击事件js代码如下
// 传递新参数刷新报表块0
_g().getWidgetByName("report0").gotoPage(1,{
// para1:xxx,
// para2:xxx,
// <这里填写你的参数>
// ...
},"lazy")
// 必须添加延迟函数,否则会查询到到上一次查询的行数,导致获取的行数错误
setTimeout(function(){
// 获取传递新参数后数据集的行数,
// ds1改为你的报表块对应的数据集名称即可
var rownums = FR.remoteEvaluate('=ROWCOUNT("ds1")');
// 获取报表块0后发现获设置新的函数提示,这里我设置了2个自定义按钮,所以需要选择第二个自定义按钮:eq(1),只有一个自定义按钮的改为eq(0)即可
$("div #fr-btn-CustomToolBarButton:eq(1)").text("共"+rownums+"行")
},500)
(4)给报表块添加初始化事件,js代码同(3),用于报表初始化的时候计算数据行数
(5)最终效果
演示附件:报表块工具栏设置数据行数.zip (31.86 K)
* 题外话:count(A2),该方式不会计算空行,所以A2单元格必须用表主键设置,确保不为空,否则会影响计算行数