数据库数据集
教学视频
简介
利用定义好的直连数据库的数据源可以利用SQL语句或存储过程定义数据集,用于查询数据库中的一张多多张表,或者直接查询视图或存储过程获得报表的数据。
在数据源设置面板中,选择第一个数据集标签页,并单击添加按钮:
在弹出菜单中选择创建数据库表数据集:
在弹出的数据设置界面中进行配置工作,如下图:
配置好数据集,可以单击确定按钮生成数据集,也可以单击预览SQL数据按钮预览数据:
单击确定按钮,这样就创建好了数据集。
动态SQL
数据库数据集的SQL也支持动态参数设置,例如:
select * from EMPLOYEE where DEPT_ID=${$dept_id}
其中${}是Bask Report的表达式的定义方法
$dept_id表示使用报表中名称为dept_id的参数。
参数的定义可以参考:报表参数
利用表达式我们可以实现更为丰富的SQL语句编写。
范例1
${
if (isEmpty($dept_id)) {
return "select * from EMPLOYEE"
} else {
return "select * from EMPLOYEE where DEPT_ID = ${$dept_id}"
}
}
范例2
${
var sql = "select * from EMPLOYEE where 1=1"
if (isNotEmpty($dept_id)) {
sql = sql + "and DEPT_ID = ${$dept_id}"
}
if (isNotEmpty($employee_id)) {
sql = sql + "and EMPLOYEE_ID = ${$employee_id}"
}
if (isNotEmpty($sex)) {
sql = sql + "and SEX = ${$sex}"
}
return sql;
}
又因为BaskReport中表达式可对一个普通值进行判断,值为null或为false皆返回false,否则返回true(类似Javascript语法),所以上面的SQL又可简写成下面的样子:
${
var sql = "select * from EMPLOYEE where 1=1"
if ($dept_id) {
sql = sql + "and DEPT_ID = ${$dept_id}"
}
if ($employee_id) {
sql = sql + "and EMPLOYEE_ID = ${$employee_id}"
}
if ($sex) {
sql = sql + "and SEX = ${$sex}"
}
return sql;
}
从2.0.3版本开始,BaskReport表达式中字符串支持多行,多行字符串间采用+连接,可以就可以更为方便的输入复杂SQL,比如下面这样:
${ var sql="select *" +" from employee" +" where dept_id='D11'"; return sql; }
在上面的示例当中,字符串连接使用的是+号,且+号放在字符串之前;当然连接多行字符串的+号也可以放在字符串之后,如下面这样:
${ var sql="select *"+ " from employee"+ " where dept_id='D11'"+ " order salary desc"; return sql; }
SQL中的in查询
在BaskReport当中,在SQL数据集中使用的sql里面含有in的查询条件,且条件对应的值是一个参数的话,如下所示:
select * from employee where dept_id in ${$deptIds} and degree in ${$degrees} order by salary desc
上面的SQL中就用到了两个in查询条件,对应的值是两个参数,分别是deptIds和degrees。因为在sql中用到了这两个参数,所以我们必须要在报表层面预先定义好这两个参数,并设置它们的数据类型为集合,并设置好它们默认值,如下图所示:
需要注意的时,in查询用到的参数,首先必须要有默认值,其类型必须是集合类型。因为是集合类型,所以默认值如果需要有多个,那么默认值可以用英文半角状态下的逗号(,)号分隔,比如上面的D12,D13。
如果SQL中使用了in查询条件,但又没有为对应的集合类型的参数设置默认值,那么我们就可以在拼装SQL的时候使用表达式,对参数进行判断,如果对应的参数不为空才加入到对应的SQL中,否则不加,如下面的SQL代码所示:
${
var sql="select * from employee where 1=1";
if($deptIds){
sql=sql+" and dept_id in ${$deptIds}";
}
if($degrees){
sql=sql+" and degree in ${$degrees}";
}
sql=sql+" order by salary desc";
return sql;
}
查看运行时SQL
在使用基于SQL产生的数据集时,因为SQL可能由复杂的表达式生成,此时我们可能需要查看运行时执行的SQL具体是什么样子,要实现这一功能也比较简单,BaskReport当中日志是基于apache的commons-logging包实现的,日志输出的级别是debug,所以在不做任何配置的情况下是看不到运行时输出的SQL。 如果需要查看运行时的SQL,我们只需要在项目的classpath下添加两个文件即可。
第一个文件是commons-logging.properties,内容如下:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
第二个文件是simplelog.properties,内容如下:
org.apache.commons.logging.simplelog.defaultlog=debug
添加好上面两个properties文件后,重启应用,再次访问BaskReport报表,如果报表中使用到了SQL类型的数据集,那么就可以在控制台看到具体的SQL输出,如下面所示:
上图当中运行时的SQL就是:select * from employee。 可以看到上面配置的的日志输出格式比较简单,只是在控制台输出,如果需要输出到其它地方,或格式有进一步要求,可以按照commons-logging的要求配置即可,这里不再赘述。
从2.0.2版本开始,我们还可以在项目的配置文件中添加一个名为baskreport.sql.output.enable=true的参数,这样就会在运行时将SQL及其可能用到的动态查询参数打印到控制台。
添加日志文件和添加baskreport.sql.output.enable=true系统属性,二者选其一即可。