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

目录:

1.描述编辑

背景:很多时候客户因为每日明细数据量产生的过大会将数据库数据进行分表的操作,这样就需要通过sql来获取多张数据表来实现完整数据的获取,如:对按天分表和按月分表的表,后缀是动态变化的,查询时需要跨天或跨月查询多个表才可得到结果。

场景:业务定义了按天分表的数据表Test,那么数据库中存放20200415的数据表的表名为test_0415,存放20200416的数据表的表名为test_0416;如果界面选择查询20200415~20190416时段的数据,则需要查询test_0415和test_0416才能得到结果,当然如果选择的日期区间n大于2,则取n张数据库底层的数据表。

2. 实现思路编辑

因为目前根据sql的执行逻辑,参数筛选可以实现单表动态获取,无法实现区间数据库表的动态获取,所以此处借助JS来进行判断选择的日期区间然后通过for来实现多select的union操作,返回完整的sql语句实现动态sql获取动态数据库表。

3. 操作步骤/示例编辑

3.1 此处先准备了相关场景下的数据库表(因为需要借助sql参数实现所以无法使用内置数据,用户需要自行定义的数据库表)。本次模板制作数据表名分别为test_0415,test_0416,test_0417,test_0418。数据库表中的字段内容可以任意定义。

image.png

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

image.png

3.3 数据获取界面sql中只写一个参数:${sql} ,即将文本控件中的值赋值给该参数。并且给参数一个sql语句的初始值。

image.png

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

image.png

3.4 在查询按钮中通过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);

4. 效果查看编辑

PC端预览模板效果如下:

动态获取数据库表.gif

5.已完成模板(提交附件)编辑

参考模板如下(其中数据库表需要自行在数据库中定义):



动态参数表.cpt