参数指的是从报表外部传入报表的值,在UReport2中,三种类型的数据源都支持参数。直接连接数据库和内置数据库连接两种方式本质上一样,都是采用SQL方式从数据库中获取报表数据,所以对于这种类型的数据源参数传递只需要在SQL层面配置好相关参数即可;对于spring bean类型的数据源,就更为简单,只需要在对应在方法中获取对应的参数即可。我们首先来看看SQL取数据方式如何配置参数。
SQL数据集参数
对于SQL方式数据集参数传递方式,实际上就是给SQL添加查询条件,UReport2中SQL参数传递采用的是命名参数的方式,这点与Spring中NamedParameterJdbcTemplate中采用命名参数的写法完全一致,所以如果您用过Spring中的NamedParameterJdbcTemplate,那对命名参数一定很熟悉。
示例 | 说明 |
---|---|
select * from emp where dept_id=:deptId | 查询条件为dept_id=:deptId,运行时引擎将采用名为deptId的参数值来填充SQL |
select * from emp where age > :age and dept_id in (:deptIds) | 这个SQL中条件有两个,同样运行时引擎将尝试从外部参数中获取对应的值来填充SQL |
打开报表设计器,添加一个数据库连接方式数据源(直接连接数据库或内置数据库连接两种方式任选其一),添国一个SQL数据集,即可在弹出的窗口中定义SQL及相关参数。
定义好带命名参数的SQL后,接下来我们需要需要在下面的参数配置区域配置SQL中用到的命名参数,当然如果你的SQL中没用到命名参数,那就不需要配置。
参数各字段 | 说明 |
---|---|
参数名 | 对应的命名参数名称,比如上面的deptId等 |
数据类型 | 当前参数在数据库中定义的数据类型。UReport2中对应的数据类型有六种,分别是:String、Integer、Float、Boolean、Date和List。 |
默认值 | 当前外部没有为这个命名参数提供值的时候将采用这里提供的默认值来填充SQL。 |
设计好带有参数的报表后,我们可以直接预览,默认预览显示的数据将是参数配置时参数默认值对应的数据,这时我们可以在预览报表的URL后面手工添加对应的参数名,以使报表呈现我们需要的数据。在URL后面添加参数是最简单、最直接的一种为带参数的报表提供外部参数的方法,报表一旦检测到外部有对应的参数传入,则不再取这个参数对应的默认值来填充SQL。
从2.0.9版本开始,SQL数据集中的SQL开始支持表达式(表达式语法见5.表达式),参数格式为:${表达式},也就是说,在${}中输入的内容引擎认为是表达式,否则认为是标准SQL。一旦在${}中输入表达式,引擎会尝试进行语法检查。在SQL表达式中,我们可以对传入参数进行判断,这样就可以实现诸如当有参数传入SQL时,就取该参数过滤后的结果集,如果没有该参数传入时则取所有数据集需求,示例如下图所示:
Spring Bean数据源参数
早在3.报表存储与数据源配置一节中我们就介绍过,要将一个Spring Bean的方法定义某个数据集的数据来源,那么方法必须要有三个参数,依次是String,String,Map,最后一个Map参数就是外部传入报表的参数集合,UReport2会将外部传入的各种参数都收集到这个Map中,我们只需要根据需求从Map中获取即可。
public List<Map<String,Object>> loadReportData(String dsName,String datasetName,Map<String,Object> parameters){ int salary=0; Object s=parameters.get("salary"); if(s!=null){ salary=Integer.valueOf(salary); } List<Map<String,Object>> list=new ArrayList<Map<String,Object>>(); for(int i=0;i<1000;i++){ int ss=RandomUtils.nextInt(10000)+i; if(ss<=salary){ continue; } Map<String,Object> m=new HashMap<String,Object>(); m.put("id", i); m.put("name", RandomStringUtils.random(10, true, false)); m.put("salary", ss); list.add(m); } return list; }
在上面的代码中,我们尝试从Map中获取名为salary的参数,如果存在则采用这个参数。