动态列动态分组汇总+下拉复选框固定列序解决方案

楼主
我是社区第67190位番薯,欢迎点我头像关注我哦~
本帖最后由 yets11 于 2016-12-12 12:33 编辑

此解决方案源于番薯 @austin1122的需求
FR能否做到单元格动态设置父格&动态列如何动态分组


原始cpt:\doc\Parameterr\DynamicCol\DynamicCol1.cpt
相关帮助:数据集参数实现动态列-http://help.finereport.com/doc-view-1289.html


改造过程:
第1步:分组
原始模板动态列效果


这个其实没有分组的,为了分组,我们把第1列数据设置由列表 改为分组

效果如下

第2步:分组汇总
因为原始模板提取的是销量数据,并未按选择的前面的列来进行汇总,而且销量列也不固定,不一定是在第5列 ,如果我们直接把后4列的数据设置都改成汇总,那么效果是这样的



发现根本就不行,原因是汇总要求数据列的类型为数值型,这样的话会把其他列的数据给弄没,显示的也不是我们想要的
如果不选择汇总,那么却是分开的,如下效果

看到了吗,销量并不汇总,而是每条都显示。
解决方法:
在sql中想办法,如果选择的列中有销量,就用替换为sum(销量),当然最后得用group by来进行分组。
效果如下


对嘛,这样才是我们想要的(具体sql请下载随便附件中任意一个模板,都是一样的)

第3步:固定列序

本以为这样就大功告成,楼主提出需求,当下拉复选框选择的值改变时,下面显示的列顺序会乱,也就是销量不一定是在最后的,看下面动态图效果

看到了吗,销量列跑到产品列前面去了,而不是在我们想当然的认为的的在产品列后面!
这也太不人性化了吧,这要是对于以前,铁定要提Bug去!


但转念一想,这个或许是设计时就这样定的,有需求,我们也可从其他途径解决啊,他现在不是按下拉复选框的选择的值顺序来显示吗,那我就对他排个序不就完了吗,按什么排呢,肯定是按数据库表中的字段顺序来排,又有两种解决办法:
(也算是解决了下拉复选框选择值后顺序不对的Bug吧)
1.JS实现(难度:较大)
这是我一开始的思路,选择完成后,排一下序,在编辑结束事件里面写代码,代码也写好了,alert输出也没问题

看到了吗,排序后并不是下拉复选框的值顺序(地区、销售员、销量、产品),而是我们想的最终顺序(地区、销售员、产品、销量),剩下的把这个值利用widget.setValue来设置到下拉复选框,赋新值就行了
对比图:(为了对比明显,我把下拉复选框拉宽了)
原来的(选择完后,下拉复选框对应的变量col值为地区、产品类型、销售员、销量、产品,报表部分显示的列顺序也是按这个顺序来的)

JS排序后(选择跟原来一样,当选择完成的一瞬间,自动排序,col变量值为地区、销售员、产品类型、产品、销量,其他的不用变动了,显示的列顺序肯定也对的)

2、FR函数实现(难度:中等)
JS虽能实现需求,但是难度毕竟较大,于是想到利用FR自带的数组函数来排序,主要用到greeparray函数,即把原始包含完整列的数组过滤成只剩下选择的那些列的数组,也就是变相的排序了。
加两个文本框,设置为不可见,暂时命名为p和c,p文本框值用公式计算即为完整列信息,c文本框为选择后排序的结果,公式为计算排序过后的列字段
利用公式的好处是选择下拉复选框值后,c自动变,即时进行排序。
然后在查询按钮点击事件中对下拉复选框赋值c,这样下拉复选框对应的值也为排序过后的了,显示肯定没问题了,最终效果如下图



最终效果
JS列排序效果



FR函数排序效果

两者效果都是一样的,都完美实现了我们的需求!
题外:这个解决方案巧妙地解决了动态列的动态分组汇总问题,特别是最后的固定列序解决办法,可能解决了困扰众多番薯多年的下拉复选框选择值排序问题,在这个方案里,你都可以得到完美的解决!


最后,顺便给自己拉拉票

我是陶孝文,正在参加帆软2016年度十佳用户评选大赛,如果你支持我,请用微信扫描下方二维码投你宝贵的一票吧!~~
                                                  
(每天都可以投一票,投票时间,即日起至2017年1月5日,我的微信名:和我的论坛名一样,yets11,有什么问题可以加我哦!欢迎交流)




附件下载:
动态列分组汇总固定列序(JS排序).cpt (13.39 KB, 下载次数: 29, 售价: 200 个F豆)

动态列分组汇总固定列序(FR函数排序).cpt (14.02 KB, 下载次数: 43, 售价: 200 个F豆)





分享扩散:
参与人数 +3 F豆 +668 +15 F币 +15 理由
mown0774 + 1 太棒了,给你32个赞,么么哒
传说哥 + 666 + 15 + 15 感谢分享
windy_gui + 1 赞一个!

查看全部评分

沙发
发表于 2016-12-11 00:00:52
板凳
发表于 2016-12-11 12:23:15
来自手机
{:8_199:}
地板
发表于 2016-12-12 01:05:36
牛逼的yets哥,我服
5楼
发表于 2016-12-12 08:14:22
谢谢大神的热心,我自己也做出来了,其实不用这么复杂的,我想多了。。。。参数那里不加销量,然后编辑结束后加上销量就是了
6楼
发表于 2016-12-12 08:38:06
大神你的模板JS不大对。。。。选参数选着选着就越来越少了,按回全选也只有两个参数


而且用着用着就卡主了会报错




7楼
发表于 2016-12-12 09:26:17
austin1122 发表于 2016-12-12 08:38
大神你的模板JS不大对。。。。选参数选着选着就越来越少了,按回全选也只有两个参数

你的方法也可以,不过只能适用于一个列,我这是通用解决方案
js不对是你用的有问题吧,卡的问题可以把下拉框的数据字典专门建一个数据,于不要共用一个数据集
8楼
发表于 2016-12-12 09:31:20
austin1122 发表于 2016-12-12 08:38
大神你的模板JS不大对。。。。选参数选着选着就越来越少了,按回全选也只有两个参数

参数越选越少也是你的sql的问题,可以参考我的模板或用上面的方法分开数据集
9楼
发表于 2016-12-14 11:02:22
牛逼的yets哥,我服
10楼
发表于 2016-12-15 12:20:56
高。真会研究呀
11楼
发表于 2017-5-13 08:22:14
厉害,下来学习学习!
12楼
发表于 2017-5-13 13:58:32
学习学习!
13楼
发表于 2017-9-26 15:37:42
牛逼的大神,学习了
14楼
发表于 2017-11-20 10:26:58
攒豆再买来学学
15楼
发表于 2017-12-7 22:03:54
66666
16楼
发表于 2017-12-19 10:49:57
做的不错,大赞一个。66666
17楼
发表于 2018-7-20 16:43:22
膜拜啊 大佬的传说
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表