润乾报表宏实现动态传递表名和where条件
之前我们介绍过通过API来实现这个需求,这里采用在报表里直接实现的方式。当然其中有一些优缺点我们稍后会做比较。
需求背景
客户处很多物理表中都有一些同名字段,现在需要使用参数模板和报表实现动态输入要查询的数据库表名展现结果的一个效果。
如:输入a,b,则查询出a,b的结果;输入e,f,则查出e,f的结果。
分析
动态传入表名并显示结果,我们可以通过动态宏接收并传到数据集中,但是有这样一个问题,当我们从多个表中查询数据时,要进行多表关联。这样要写类似where a.id=b.id and a.id=c.id 这样的关联条件。所以问题的难点是如何确定关联条件中的表名。
实现步骤
这里通过报表中的动态宏来实现,具体我们看如何实现:
报表,非常普通
参数,字符串组的类型
动态宏,注意写法
其中,tbName为:@tbName
whereMethod为:if(split(@tbName,”,”)[1]==null,”",
if(split(@tbName,”,”)[2]==null,”",(split(@tbName,”,”)[2]!=null && split(@tbName,”,”)[3]==null),”where “+split(@tbName,”,”)[1]+”.订单ID=”+split(@tbName,”,”)[2]+”.订单ID”,
if((split(@tbName,”,”)[3]!=null && split(@tbName,”,”)[4]==null),”where “+split(@tbName,”,”)[1]+”.订单ID=”+split(@tbName,”,”)[2]+”.订单ID and “+split(@tbName,”,”)[2]+”.订单ID=”+split(@tbName,”,”)[3]+”.订单ID”)
)
)
这里是最多判断传入3个表名的情况。
数据集
这样就可以实现最多传入3个表的需求了。
说明
我们注意到宏whereMethod的写法有点小复杂,而且这只是最多传入3个表时的写法,之所以会出现这样的问题是由于无法在报表里做循环导致的,所以要考虑到最多的情况。
所以这种实现方式适合动态传递的最多表个数不是很多的情况,否则建议使用API实现的方式;我们发现不管使用哪种实现方式,其中关联字段必须是已知的,如本例中的“订单ID”,这显然应该已知的啊!