JS实现动态数据库表获取

  • 文档创建者:chuzhihao
  • 编辑次数:4次
  • 最近更新:Leo.Tsai 于 2020-05-07
  • 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实例\JS实现动态数据库表获取.cpt

    点击下载模板:JS实现动态数据库表获取.cpt

    附件列表


    主题: 二次开发
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!