V5自定义函数实现动态生成sql
我们之前都做过使用宏来动态生成sql查询条件,在宏里判断参数再传sql语句到数据集。这个方法在查询一个或多个确定的 物理表数据的时候很好用。 但是如果想要根据参数动态从不同的物理表查询数据怎么实现呢?比如根据用户选择的不同月份,来动态生成表名,客户的表结构都是一 样的,每个月会生成一个,比如tab1,tab2,后面表示月份. 比如:客户选择了开始时间 2013-6-15 结束时间 2013-8-15 就要把 tab6,tab7,tab8三个表的数据查询出来.
下面我做了一个demo,写了一个自定义类来实现根据参数动态生成sql从不同表查询数据。
1,先建立了 12个表结构相同的数据表,tab1-tab12 (表名由1-12这样的顺序)。
2,新建报表建立参数模板 还有主表
3,主表的数据集定义
其中arg1 ,arg2 接收参数模板传来的日期参数,
Arg4 ,arg5 判断日期的月份
Arg3 则是要拼接的sql 语句 select * from tab
在宏里面用到一个getsql函数,这个类是自己定义的
是将获取到的 2个数 还有sql 拼接成sql语句并返回
如 getsql(2,3,”select * from tab”) 则返回 select * from tab2 union select *from tab3
动态的生成从这存储这2个月份的表中查询数据。
3现在演示一下 查询
下面是生成的sql语句
再查询 1-3月试试
则又生成了 从tab1 tab2 tab3个表查询数据的失去了。
这样根据参数动态生成sql 就避免了直接计算大数据量
另外@arg3 里面的sql语句也可以换成别的 如果要加where条件的话就需要多加参数,并重写这个getsql类了。
数据库文件,raq文件 还有类文件见附件。
登记自定义类的时候把api文件夹放到 下面路径里
E:\集深0816\GEEZNV5.0\tomcat\webapps\reportmis\WEB-INF\classes
并在config文件夹下 customFunctions.properties文件里加上要登记的类,属性加上
登记好以后这样方法就可以用了。