UReport2 参数
UReport2教学视频http://pan.baidu.com/s/1boWTxF5,密码:98hj
参数指的是从报表外部传入报表的值,在 UReport 2中,三种类型的数据源都支持参数。直接连接数据库和内置数据库连接两种方式本质上一样,都是采用 SQL 方式从数据库中获取报表数据,所以对于这种类型的数据源参数传递只需要在 SQL 层面配置好相关参数即可;对于 spring bean 类型的数据源,就更为简单,只需要在对应在方法中获取对应的参数即可。我们首先来看看 SQL 取数据方式如何配置参数。
SQL数据集参数
对于 SQL 方式数据集参数传递方式,实际上就是给 SQL 添加查询条件,UReport2 中S QL 参数传递采用的是命名参数的方式,这点与 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 的参数,如果存在则采用这个参数。
查询表单设计
从 UReport2.2版本开始,UReport 设计器提供了一个查询表单设计器,通过这个设计器,可实现在网页中对SQL里配置的参数参数配置相应的查询表单。具体做法就是我们首先需要配置一个SQL数据集,并为其配置相应的查询参数,如下图所示:
接下来点击报表模版设计器工具栏上如下图所示按钮:
点击后就会弹出如下图所示的表单设计器窗口,在这个窗口就进行相应的查询表单设计即可:
设计器设计方式比较简单,那就是采用直接拖曳方式,将布局或输入组件拖到画布上即可。对于输入类型的组件来说,在将其拖曳到画布后,可通过点击将其选中,然后切换到"属性"页即可对这个输入组件的属性进行调整,需要注意的是,所有的输入组件都需要配置其绑定的查询参数,否则将 HTML 预览页将不能提交查询,如下图所示:
这里要选择的绑定查询参数,就是我们在SQL数据集里配置的参数查询,如果不配置,那么这里将无法选择。
更多建议: