历史版本4 :JS实现动态数据库表获取 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 应用场景

很多时候需要对每日明细数据量过大的数据库表进行分表操作,这样就需要通过 SQL 来获取多张数据表来实现完整数据的查询。

实际业务场景例如:

业务定义了按天分表的数据表 Test,那么数据库中存放 20200415 的数据表的表名为 test_0415,存放 20200416 的数据表的表名为 test_0416 ;

如果界面选择查询 20200415~20190416 时段的数据,则需要查询 test_0415 和 test_0416 才能得到结果,当然如果选择的日期区间 n 大于 2 ,则取 n 张数据库底层的数据表。

1.2 实现思路

目前根据 SQL 的执行逻辑,参数筛选可以实现单表动态获取,但无法实现区间数据库表的动态获取。

所以此处借助 JS 来进行判断选择的日期区间,然后通过 for 来实现多 select 的 union 操作,返回完整的 SQL 语句实现动态 SQL 获取动态数据库表。

2. 示例编辑

2.1 数据准备

此处先准备了相关场景下的数据库表。(因为需要借助 SQL 参数实现所以无法使用内置数据,用户需要自行定义的数据库表)

本次模板制作数据表名分别为 test_0415,test_0416,test_0417,test_0418,数据库表中的字段内容可以任意定义。

image.png

2.2 添加控件

然后参数面板中定义两个日期控件,分别为 startdate 和 enddate,并且放入一个文本控件,控件名为sql。

image.png

2.3 参数定义

1)数据集 SQL 编辑界面只写一个参数:${sql} ,即将文本控件中的值赋值给该参数。并且给参数一个 SQL 语句的初始值。

image.png

2)在报表模板中将相应的字段拖入到模板中。(图示字段为任意定义的内容)

image.png

2.4 添加JS事件

在查询按钮中通过 JS 实现 SQL 语句的拼接即可,代码如下:

//返回起始日期的毫秒数
var startdate = Date.parse(_g().parameterEl.getWidgetByName("startdate").getValue());
//返回截止日期的毫秒数
var enddate = Date.parse(_g().parameterEl.getWidgetByName("enddate").getValue());
//返回两个日期之间的天数
var days=(enddate - startdate)/(1*24*60*60*1000);

//定义字符串
var str = new String();
//返回拼接sql代码
for(var i=0;i<=days;i++)
{
var temp_num = 15;
temp_num = temp_num + i;
var temp = "select * from ";
temp = temp + 'test_04' + temp_num.toString() + ' ';
str = str + temp;
if(i<days)
{
str = str + 'union ' ;
}
}
_g().parameterEl.getWidgetByName("sql").setValue(str)

2.5 效果预览

保存报表,点击分页预览,效果如下图所示:

动态获取数据库表.gif

3. 模板下载编辑

已完成模板可参见:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\分页预览JS实例\动态参数表.cpt

点击下载模板:动态参数表.cpt