1. 概述
1.1 預期效果
使用函數實現動态列 報表需要取出所有的數據,然後來實現動态列報表,當數據量大且所選列不是很多的情況下性能就慢了。
本文介紹另一種動态列制作方法,該方法在數據量大時可以實現 層式報表分頁查詢,從而提高報表性能。如下圖所示:
1.2 實現思路
通過定義數據集參數,直接選出需要展示的列,将數據列拖入到單元格中即可。
2. 示例
2.1 準備數據
新建普通報表
1)新增數據集 ds1,SQL 語句爲:SELECT ${col} FROM 銷量。設置數據集參數 「col」,默認值爲字符串類型「*」,即查詢出所有數據。如下圖所示:
2)新增數據集 ds2,SQL 語句爲:SELECT * FROM 銷量 limit 1。通過查詢一條數據,來獲取表當中的所有字段名稱。如下圖所示:
2.2 設計報表
2.2.1 表樣設計
由於不确定用戶選擇的字段個數,因此制作模板時需要拖入所有的 6 個字段。
1)表頭行
在 A1-F1 單元格插入公式,将 $col 參數轉換成數組,A1-F1 單元格分别返回數組裏的第 1-6 個的值。
公式内容如下表所示:
單元格 | 公式 | 公式說明 |
---|---|---|
A1 | INDEXOFARRAY(split($col,","),1) | INDEXOFARRAY(array,index):返回數組array的第index個元素。 SPLIT(String1,String2):返回由String2分割String1組成的字符串數組。 注:此處參數 $col 默認值爲字符串類型,因此需要先轉換成數組才能返回正确的值。 |
B1 | INDEXOFARRAY(split($col,","),2) | |
C1 | INDEXOFARRAY(split($col,","),3) | |
D1 | INDEXOFARRAY(split($col,","),4) | |
E1 | INDEXOFARRAY(split($col,","),5) | |
F1 | INDEXOFARRAY(split($col,","),6) |
操作步驟如下圖所示:
2)表内容
在 A2-F2 單元格插入「數據列」,數據集選擇 ds1,「數據列」分别爲 #1、#2、#3、#4、#5、#6,「數據設置」爲「列表」,「擴展方向」爲「縱向」,如下圖所示:
注:「# 數字」代表數據對應的第幾列,#1 表示第一列的數據。
2.2.2 設置報表邊框
分别選中 A2-F2 單元格,點擊右側「條件屬性」,點擊添加條件,設置「邊框屬性」爲「外部邊框」;選擇公式條件類型爲「公式」,公式内容爲:len($$$)!=0,即單元格有數據的話顯示邊框。如下圖所示:
2.2.3 設置表頭背景
給 A1-F1 增加「條件屬性」,選擇「背景屬性」,設置爲「藍色」;選擇「邊框屬性」,設置爲「外部邊框」;選擇條件類型爲「公式」,公式内容爲:len($$$)!=0,即單元格有數據的話顯示背景和邊框。操作步驟同 2.2.2 ,設置界面如下圖所示:
注:公式 len($$$)!=0 中,如果單元格數據類型爲字符串,則公式應爲 len('$$$')!=0 。
2.3 設置參數
點擊參數面板,點擊「全部添加」,參數面板出現可選擇的控件,選擇「下拉複選框控件」,如下圖所示:
選中「下拉複選框控件」,控件值類型爲「字符串」,默認值爲空,數據字典類型爲「公式」,實際值輸入公式:TABLEDATAFIELDS("ds1"),如下圖所示:
注:參數面板中下拉複選框控件的默認值必須爲空,否則無法獲取所有列。
2.4 設置點擊事件
參數爲空時,點擊「查詢按鈕」,默認查詢全部列。
點擊參數面板「查詢按鈕」,新增「點擊事件」,設置參數「a」,值爲公式TABLEDATAFIELDS("ds2"),獲取所有字段名稱。添加 JavaScript 代碼。如下圖所示:
JavaScript 代碼如下:
var Widget = this.options.form.getWidgetByName("col");
var value =Widget.getValue(); //獲取控件實際值
if(value==''||value==null){
/*獲取參數面板中的文本控件,判斷後賦*/
var area2=contentPane.parameterEl.getWidgetByName("col");
area2.setValue(a);
_g().parameterCommit();
}
else{
_g().parameterCommit();
}
2.5 效果預覽
1)PC 端
點擊「分頁預覽」,當選擇對應的一些數據列,點擊查詢就展示對應選擇列的數據,效果如下圖所示:
2)移動端
APP 端和 H5 端均支持,效果如下圖所示:
3. 已完成模板
已完成模板請參見:%FR_HOME%\webroot\WEB-INF\reportlets\doc\Parameter\DynamicCol\數據集參數實現動态列.cpt。
點擊下載模板:數據集參數實現動态列.cpt