sql 实现批量修改_BIRT 中如何根据参数动态拼接 SQL

BIRT可以使用sql query来创建数据集,通过在报表中设置参数(Parameter)来传递客户端的用户输入,同时可以设置Dataset参数并且与报表参数关联(这两个参数是不同的),这样可以将客户端的用户输入传递给Dataset的参数供sql query的where语句使用,这是通常的创建sql语句的做法,但是这种方法只适合固定的sql语句,对于拼接动态的sql就不适用了。

比如要处理这么个场景:根据传入的用户名、起止日期,分级别查询出不同的订单信息。author存储用户部门信息,account存储账目信息(多个用户可归属于一个账目,以逗号分隔),META存储订单明细。示意图如下:

356f6ad9052fa7cc4f67e9c6d3170cd4.png

1、传入登录参数login_user,判断部门级别

2、当级别为manager,需提前获取当前账目

3、当部门为admin,统计所有账目、用户销售额

4、当部门为manager,统计当前账目下所属的用户销售额

5、当部门为engineer,只统计自己销售额

BIRT可以通过一个间接的方式来实现:在DataSet的Script页签下选择beforeOpen事件,通过编写JS脚本来动态拼接SQL,类似代码如下:

...

var query = "select ITEMS,USERS,sum(AMOUNT) as TOTALAMOUNT from META where ORDERDATE>=? and ORDERDATE<=?";

var user = reportContext.getParameterValue("login_user");

...

if(flag == "admin"){

...

query += " group by ITEMS,USERS";

}else if(flag == "manager"){

...

query += "and ITEMS ='"+ account +"'";

query += " group by ITEMS,USERS";

}else{

...

query += " and USERS = '" + login_user + "'";

query += " group by ITEMS,USERS";

}

this.queryText = query;

...

这种硬编码的方式会造成计算逻辑与展现之间耦合度过高,要么需要大量修改报表文件,要么需要每个报表继承一个公共的库文件,代码写起来非常复杂,在报表数量、开发人数较多时,难以管理、修改和维护。

更好的方式是引入一个显式的数据计算层,在其中提供可解释执行的脚本功能,把数据源计算独立出来(所有的业务逻辑判断和批量数据计算都放在这一层,最后将计算结果直接返回给BIRT的DataSet进行报表展现即可)。

集算器就是这么个数据计算中间件,它提供丰富的结构化数据集运算功能,可以很方便地实现批量数据计算和各类动态SQL拼接。比如上面的问题,集算器SPL代码则非常简单且直观:

3b025839a4e20001819c2f17af41867d.png

从上面的例子,我们看到:实现同样算法,SPL代码更短、工作量更少、调试方便,而且还有利于整体了解和把握算法。

其实还有很多情况BIRT解决动态计算问题不太方便,但有集算器SPL的辅助却很简单,感兴趣可以参考:解决 BIRT 动态数据源的若干示例

集算器提供了JDBC驱动,可以很方便的与BIRT等报表工具集成,BIRT调用SPL脚本有使用和获得它的方法。

关于集算器安装使用、获得免费授权和相关技术资料,可以参见如何使用集算器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值