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

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

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代码则非常简单且直观:

A

B

1

=connect("myDB")

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

2

=flag=A1.query("select dept from author where userid=?",login_user).dept

3

if flag=="admin"

>B1=concat(sql,"group by ITEMS,USERS\"")

4

else if flag=="manager"

>B1=concat(sql,"and ITEMS='",A1.query("select accountid from account where find_in_set(?,limits)",login_user).accountid,“'  group by ITEMS,USERS\"")

5

else

>B1=concat(sql,"and USERS='",login_user,"' group by ITEMS,USERS\"")

6

=A1.query@x(${B1},startdate,enddate)

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

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

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

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

BIRT 中如何根据参数动态拼接 SQL相关推荐

  1. mysql存储过参数拼接_mysql 存储过程动态拼接sql并执行赋值

    CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50)) BEGIN ## 定义变量 DECLARE _num FL ...

  2. 代码中(C#)支持动态拼接SQL的参数化查询

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...

  3. MyBatis动态拼接SQL

    通过使用MyBatis提供的标签方法可以实现动态SQL拼接 1.if标签 <include refid="temp_sql"></include>这里代表s ...

  4. ros中move_group的参数动态设置

    为什么80%的码农都做不了架构师?>>>    1.写一个配置文件 cfg/ElfinBasicAPIDynamicReconfigure.cfg #!/usr/bin/env py ...

  5. excel动态拼接sql语句

    需求: 根据Excel中的一个字段的值作为条件,把对应行中的其他字段插入. 例子:表A根据id更新Name =C2&B2&D2&A2&E2   表示单元格根据值& ...

  6. mybatis in 参数动态拼接

    // 接口List<SysUser> findByIdList(List<Integer> idList);//xml<select id="findByIdL ...

  7. ireport模块之间的动态传参及拼接SQL

    1.有些业务逻辑需要在ireport中判断.所以经常将拼接SQL的任务由Parameters的Default Value Expression来完成 ,如果有子模版,则在子模版参数里面处理,怎么将SQ ...

  8. mysql函数 动态语句_自定义函数动态执行SQL语句

    Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者. DDL 和 DML Sql代码 收藏代码 /*** DDL ***/ begin EX ...

  9. python sql拼接_python 字典 拼接SQL语句

    def gen_sql(table_name, data): """ :param table_name: 表名称 :param data: 字典对象 key为字段(要与 ...

最新文章

  1. 2072. Kirill the Gardener 3
  2. BZOJ1951: [Sdoi2010]古代猪文
  3. CreateProcess返回错误998
  4. JS 数组 各项操作
  5. 基于公开数据的特殊人群在线活动特征挖掘
  6. 别乱用,这样打日志定位 Bug 又快又准!
  7. ip归属地是什么?ipv4和ipv6区别?
  8. Android移动开发的几种方式
  9. python抓取京东商品评价总数_python爬虫抓取和分析京东商城评价
  10. chroma8000使用_台湾致茂MES系统Chroma8000上使用更安全敏捷
  11. 再玩五分钟手机就开始学习
  12. 微型SR602人体感应模块原理图
  13. Lattice ddr3教程全攻略之时序约束篇
  14. 几款软件,内有很多人求而不得的破解版TeamViewer
  15. GD32F130 使用ST库开发项目
  16. 华为120hz鸿蒙系统,120Hz屏刷新率、鸿蒙OS系统:华为智慧屏V75于今日正式发售
  17. iOS中几种数据持久化方案-转自简书
  18. 【mysql的使用】
  19. sklearn 的基本机器学习(分类方法)
  20. matlab白化权函数,《灰色系统、白化规律和白化权函数.pdf》-支持高清全文免费浏览-max文档...

热门文章

  1. 创维linux怎么连接wifi,创维酷开电视多屏互动Miracast玩法详解
  2. Nginx自动封禁IP
  3. MySQL : Incorrect string value: '\xE5\x9B\xBD\xE5\xBA\x86' for column 'stu_name' at row 1
  4. 投影仪和电视哪个更适合家庭用?买当贝投影好么?
  5. 原神通数据库、oracle转postgresql进行适配
  6. linux 终端分屏命令vsp(转)
  7. 【C++】 福到了(PTA)
  8. 程序员百度云干货 不谢~~~~~~
  9. 【js实现手写签名板】canvas
  10. shell 对字符串去重并排序