當前為10.0版本文檔,更多實例內容將在最新幫助文檔中展現,點選跳轉至 最新版幫助文檔

JS實現動态數據庫表獲取

1. 概述

1.1 問題描述

當明細數據存在數據庫多張表中時,要根據篩選條件查詢這些表中數據,不同的條件對應查詢不同的表數據。

如數據庫中存放 2020-04-15 的數據表 test_0415,存放 20200416 的數據表 test_0416 ,如果界面選擇查詢 2020-04-15到 2020-04-16 的數據,則需要查詢 test_0415 和 test_0416 兩張表。如下圖所示:

1.2 實現思路

借助 JS 來進行判斷選擇的日期區間,然後通過 for 來實現多 select 的 union 操作,返回完整的 SQL 語句實現動态 SQL 獲取動态數據庫表。

2. 示例

2.1 準備數據

1)将使用 FRDemo 中的内置數據表 test_0415,test_0416,test_0417,test_0418,如下圖所示:

2)新建數據集 ds1 ,在 SQL 編輯框中 ${sql} ,即 SQL語句整體作爲一個參數,将根據不同的語句從這上述四張數據表中獲取不同的數據。如下圖所示:

sql 參數設置一個默認值:SELECT * FROM test_0415

2.2 添加控件

1)在「參數面板」中添加兩個「日期控件」,控件名分别爲 startdate 和 enddate,并添加對應的「文本控件」。

2)在「參數面板」中添加一個「文本控件」控件名爲 sql,用來展示查詢數據的 SQL 語句。

3)添加「查詢按鈕」。

如下圖所示:

image.png

2.3 設計報表

将 ds1 中的字段拖入報表模板中。如下圖所示:

image.png

2.4 添加事件

給「查詢按鈕」添加一個「點擊」事件。如下圖所示:

JavaScript 代碼如下:

//返回起始日期的毫秒數
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 效果預覽

2.5.1 PC 端

保存報表,點擊分頁預覽,效果如下圖所示:

注:預覽模板前,需要在平台 「管理系統>安全管理>SQL防注入」處取消勾選「禁用特殊關鍵字,詳細内容可參考:SQL防注入

動态獲取數據庫表.gif

2.5.2 移動端

App 及 HTML5 效果如下圖所示:

2021-01-29_14-15-50.gif

3. 模板下載

已完成模板可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\分頁預覽JS實例\JS實現動态數據庫表獲取.cpt

點擊下載模板:JS實現動态數據庫表獲取.cpt

附件列表


主題: 原簡體文檔
  • 有幫助
  • 沒幫助
  • 只是瀏覽

文 檔回 饋

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

8s后關閉

反饋已提交

網絡繁忙