如何在Web填报报表中实现:关联过滤输入同时支持单选,多选和全不选(空填报)
在web报表项目中,常常会遇到在填报报表中用下来框实现关联过滤的情况,比如,在省份填报格中下来选定山东省后,在接下来的城市选择框中会自动出现山东省内的城市,供用户选择。
但问题紧接着就来了,用户可能会选择山东省的一个城市,或者选多个城市,甚至什么都不选,从而想输出山东省所有城市的信息,这时应该如何实现?
有过Web报表开发经验的人可能都会知道这个看似简单的功能实现起来有多么复杂!比如用Hibernate编程实现会非常麻烦。
下文提供一个基于润乾报表的解决方案,可以非常方便地解决这个问题!润乾报表是一个纯Java开发的强大的Web报表工具软件,开发人员可以很方便地基于润乾实现关联过滤输入时对单选,多选和全不选(空填报)的支持。
问题描述:
假设web报表用户需要相关城市的订单信息,现在在润乾报表有如下两个报表文件:
一张为参数模板dingdan_arg.raq,一张为报表dingdan.raq。
参数模板:
在参数模板dingdan_arg.raq中,设置的数据集的SQL如下: SQL:SELECT 订单.货主地区,订单.货主城市 FROM 订单 dingdan_arg.raq中有A,B两列和1,2两行,格式和excel文件的格式一样,所以此填报表单的格式 A B 1 货主地区 下拉数据集1 (其中B1格对应的变量名为 arg1) 2 货主城市 下拉数据集2 (其中B2格对应的变量名为 arg2)
而且在dingdan_arg.raq中B1关联过滤B2,也就是说,下拉选中B1中的某个地区,那么在B2中则可以下拉选择这个地区中所有的城市。
报表:
在报表dingdan.raq中,设置的数据集的SQL如下: SQL:SELECT 订单.订单ID,订单.订购日期,订单.发货日期,订单.货主名称,订单.货主地区,订单.货主城市,订单.运货商,订单.运货费 FROM 订单 where (订单.货主地区=? or ? is null) and (订单.货主城市 =? or ? is null) dingdan.raq中的参数为:arg1和arg2,分别对应从dingdan_arg.raq传过来的arg1和arg2.
设置到这里,这张关联过滤报表已经可以运行的,现在是用户想在”货主城市”中可以通过下拉数据集输入多个城市值。如果用字符串组,arg2类型定义成字符串组,在SQL里就要写成”and (订单.货主城市 in (?))”,这样,当”货主城市”不输入值(全不选)的时候,就又什么都查不出来了。
但是此项目中,用户就是想可以同时选择多个城市值,而且又当一个都不选择的时候,又可以把全部城市的信息查出来。
问题解决:
要达到用户的需求,用润乾报表的动态宏可以达到,但有时用动态宏做判断会不方便。所以我们选择对上面的方法稍作调整来实现客户要求:
第一步:参数模板dingdan_arg.raq不变;
第二步:更改报表dingdan.raq中的SQL语句为下所示:
SQL:SELECT 订单.订单ID,订单.订购日期,订单.发货日期,订单.货主名称,订单.货主地区,订单.货主城市,订单.运货商,订单.运货费 FROM 订单 where (订单.货主地区=? or ? is null) and (订单.货主城市 in (?) or ? is null)
第三步:更改dingdan.raq的参数配置:在语法后面的参数表达式那里增加4个参数:arg1 arg1 arg2 str(arg2),如下图所示
第四步,在菜单:配置->参数 中设置两个参数,arg1和arg2。arg2的数据类型设置为”字符串组”,参数类型为”普通参数”。
这样,发布Web报表后,用户就可以在”货主城市”框里对城市进行单选、多选,或者不选(为空)的操作了。
从而用润乾报表的关联过滤功能,实现了对订单数据在相应”货主地区”下查询一个城市、多个城市和所有城市的订单信息了。