数据库数据集

教学视频

简介

利用定义好的直连数据库的数据源可以利用SQL语句或存储过程定义数据集,用于查询数据库中的一张多多张表,或者直接查询视图或存储过程获得报表的数据。

在数据源设置面板中,选择第一个数据集标签页,并单击添加按钮:

image-20210412123947359

在弹出菜单中选择创建数据库表数据集:

image-20210412124139316

在弹出的数据设置界面中进行配置工作,如下图:

image-20210412132729619

配置好数据集,可以单击确定按钮生成数据集,也可以单击预览SQL数据按钮预览数据:

image-20210412132833569

image-20210412132859854

单击确定按钮,这样就创建好了数据集。

动态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中用到了这两个参数,所以我们必须要在报表层面预先定义好这两个参数,并设置它们的数据类型为集合,并设置好它们默认值,如下图所示:

1700035989099

需要注意的时,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系统属性,二者选其一即可。

results matching ""

    No results matching ""