UREPORT 2 : 8.参数

UReport2教学视频

UReport2 QQ群

UReport2的QQ群号:423339793

       参数指的是从报表外部传入报表的值,在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。

参数配置值的注意事项

还需要注意的是,如果SQL中有命名参数,那么一定义配置好参数的默认值,否则将无法为对应的SQL数据集生成对应的表字段。

关于参数的数据类型

要求配置参数时定义好参数的数据类型, 是为了与数据库中定义的字段的数据类型匹配,在运行时外部传入的参数或在外部未传入参数而采用的默认值时,引擎会根据参数配置的数据类型将采用的数据值进行自动转换,以期与目标数据类型吻合。

比如,参数为日期类型,外部可传入对应的日期类型的对象或普通字符串,如果是字符串,要求是yyyy-MM-dd或yyyy-MM-dd HH:mm:ss格式,否则引擎将无法解析成日期对象,同样参数类型为Date的参数默认值也必须是yyyy-MM-dd或yyyy-MM-dd HH:mm:ss格式的字符串。

如果参数是List类型,那么外部可以传入一个List对象,或一个以逗号分隔的字符串,如果是一个以逗号分隔的字符串,那么引擎将以逗号为分隔符,将字符串转换成一个ArrayList对象,List类型的参数多用在存在in条件的SQL中。

       设计好带有参数的报表后,我们可以直接预览,默认预览显示的数据将是参数配置时参数默认值对应的数据,这时我们可以在预览报表的URL后面手工添加对应的参数名,以使报表呈现我们需要的数据。在URL后面添加参数是最简单、最直接的一种为带参数的报表提供外部参数的方法,报表一旦检测到外部有对应的参数传入,则不再取这个参数对应的默认值来填充SQL。

       从2.0.9版本开始,SQL数据集中的SQL开始支持表达式(表达式语法见5.表达式),参数格式为:${表达式},也就是说,在${}中输入的内容引擎认为是表达式,否则认为是标准SQL。一旦在${}中输入表达式,引擎会尝试进行语法检查。在SQL表达式中,我们可以对传入参数进行判断,这样就可以实现诸如当有参数传入SQL时,就取该参数过滤后的结果集,如果没有该参数传入时则取所有数据集需求,示例如下图所示:

表达式中返回SQL的注意事项

我们在使用表达式返回SQL时,如果SQL中包含单引号包裹的字符串,那么需要加上“\”来为单引号转义,否则会出现语法错误,如下面的表达式:

${

if(param("deptId")==null || param("deptId")==''){

return "select * from employee where dept_id=\'D11\'";

}

}

在上面的表达式中,return后面的SQL中dept_id=\'D11\'就用来“\”为单引号转义。

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的参数,如果存在则采用这个参数。

Attachments:

sql-dataset.png (image/png)
sql-expr.png (image/png)