这篇文章的内容主要围绕BIRT中怎么根据参数动态拼接SQL进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!
BIRT可以使用sql query来创建数据集,通过在报表中设置参数(Parameter)来传递客户端的用户输入,同时可以设置Dataset参数并且与报表参数关联(这两个参数是不同的),这样可以将客户端的用户输入传递给Dataset的参数供sql query的where语句使用,这是通常的创建sql语句的做法,但是这种方法只适合固定的sql语句,对于拼接动态的sql就不适用了。
比如要处理这么个场景:根据传入的用户名、起止日期,分级别查询出不同的订单信息。author存储用户部门信息,account存储账目信息(多个用户可归属于一个账目,以逗号分隔),META存储订单明细。示意图如下:
传入登录参数login_user,判断部门级别
当级别为manager,需提前获取当前账目
当部门为admin,统计所有账目、用户销售额
当部门为manager,统计当前账目下所属的用户销售额
当部门为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) |
感谢你的阅读,相信你对“BIRT中怎么根据参数动态拼接SQL”这一问题有一定的了解,快去动手实践吧,如果想了解更多相关知识点,可以关注编程网网站!小编会继续为大家带来更好的文章!