巧用参数实现交叉表行列互换
01.18.2010 by hewei - 0 Comment - 0Posted in web报表应用
从上图可以看到这是一个多维交叉分组报表,上表头是地区/城市,左表头是日期。 如果想动态改变一下报表的样式,左表头变成地区和城市的分组展现,上表头变成年份和月份的分组展现,并且只通过一张报表,这就需要用文章标题中提到的:利用参数实现行列变换的方法了。 实现思路: 1. 设计单元格表达式根据参数不同而变化,从而实现样式跟随表达式变动。 2.点击一个超链接按钮通过url强制传参给报表中的单元格,从而控制报表的样式。 本文就以此报表为础,做一个可以行列互换的功能(上表头和左表头互换),实现报表在web页面上样式改变。 第一步:设计器中选择配置-参数 给报表增加一个参数,我们把这个参数叫做转换参数,顾名思义,这个参数就是控制行列转换用的。
第二步:修改单元格表达式,让单元格接受参数
我们把C2单元格的表达式修改为: =if(@arg1==’1′,ds1.group(year(订购日期),false,订购日期!=null)+”年”,ds1.group(货主地区,false,货主地区!=null))。 此表达式的意思是:当参数arg1的值为1时,C2单元格的表达式为ds1.group(year(订购日期),false,订购日期!=null)+”年”,否则默认为ds1.group(货主地区,false,货主地区!=null)。 关于快逸报表中if()函数的用法请参考快逸帮助文档中的相关介绍。 据这个逻辑,依照地区与城市之间的关系,年份和月份之间的关系,把单元格的表达式做如下修改: C3:=if(@arg1==’1′,ds1.group(month(订购日期),false)+”月”,ds1.group(货主城市,false)) A4:=if(@arg1==’1′,ds1.group(货主地区,false,货主地区!=null),ds1.group(year(订购日期),false,订购日期!=null)+”年”), B4:=if(@arg1==’1′,ds1.group(货主城市,false),ds1.group(month(订购日期),false)+”月”)。 第三步:修改交叉表头并在其中设置超链接
红色框中的交叉表头区是整张报表的关键,既要在行列转换的时候做到文字跟随变化,又要充当转换控制的按钮。 修改此单元格的表达式为:=if(@arg1==’1′,”分布,运货费,时间”,”时间,运货费,分布”) 然后在此单元格的属性中:
加入超链接属性: if(@arg1==null,”/reportJsp/showReport.jsp?raq=/交叉报表.raq&arg1=1″,”/reportJsp/showReport.jsp?raq=/交叉报表.raq”)
这个超链接的作用就是点击这个单元格,赋予arg参数值,然后通过超链接中的url把参数传递到jsp中的报表里,通过对参数值的判断,来确定超链 接中的url,这样就可以来回转换,防止只能转换一次的情况出现。(超链接也可以设置在其他单元格中,本文中这样做是为了美观且容易理解) 接下来,我们把报表发布到页面上去看效果:
点击设置了超链接的表头单元格后,url自动转换为/reportJsp/showReport.jsp?raq=/交叉报表.raq& arg1=1,强制把参数arg=1传给报表的各个单元格,单元格表达式发生变化,报表样式也随之变化,于是实现了行列互换的效果:
此时,如果想转换到前一种样式,只需再点击一次表头单元格即可。 在这个报表中,我们运用了很多颇具技巧性的方法,例如参数结合超链接的运用,if()函数的运用,往往一些看似很复杂的报表,通过一些技巧性的做法都是可以迎刃而解的。



单选钮比下拉框更加直观,操作更加简便,比如:下拉框选择至少要点击两次鼠标,第一次点击下拉,第二次点击选择;而单选钮只需要点击一次鼠标即可完成选择操作,而且可以一眼看出有哪些选项。因此对于选项不多的情况,如在5个以内的时候,用单选钮更加方便。 单选钮要自己编程实现并不算太困难,如果仅仅是在HTML里写一个也很容易,可是在实际业务中,有很多情况是HTML标准控件无法完成的: 首先,单选钮的选项有几个,往往并不固定,很可能由数据库里的数据动态决定,这就意味着单选钮所占的宽度有可能变化,同理,摆放在单选钮右边的元素就要动态调整位置; 其次,当单选钮所占的位置一行放不下时,可能需要摆两行或者多行,此时不光要动态算宽度,还要动态算高度,因为单选钮下面摆放的元素也得跟着动态挪位置。 所以,看似很简单的功能,一旦和真实业务联系起来,也变得不简单。快逸
要实现上述的功能,首先需要自己开发一个下拉控件,实现既可下拉又可输入。但是,面临一个问题:即真实值和显示值的对应关系。当下拉框既有显示值又有真实值的时候,你无法知道用户录入的是真实值还是显示值,其实两种情况都有可能。 当用户输入显示值的时候,你需要先帮他找匹配的真实值;当用户输入真实值的时候,不需要匹配。如何判断用户输入的是显示值还是真实值? 还存在另一种情况,用户输入的值有可能是下拉选项里存在的,也有可能是下拉选项里不存在的,是否允许用户输入下拉选项里不存在的项?需要加个开关来控制吧。 当然,更加麻烦的是多选的情况,多选的时候需要提供清空、全选等控制,还需要提供允许输入不存在的项、显示值与真实值的判断等。

