一、概述
1
應用場景。
類似通訊、監視行業,每天都有海量資料生成,資料庫表中總資料量非常大,而報表中往往只要獲取當天的幾百筆資料就可以了。
如果使用範本參數,就需要先取出所有資料,再進行過濾,取數+過濾,將消耗大量時間,極大影響報表的查詢效率。而資料集參數在資料庫查詢時就已經完成了資料過濾,所以使用資料集參數設計的查詢報表會比使用範本參數的效率高。
2
功能簡介。
定義資料集時,透過在 SQL 語句中新增【${para}】格式的內容,即可定義資料集參數,定義完成後,使用方法和範本參數一緻。如下圖所示,下拉框選擇【華東】,點選查詢,只查詢出報表中華東地區的銷售資訊。
二、使用說明
資料集 SQL 查詢語句中可以使用參數巨集 【${}】動態地生成過濾條件,【${} 】執行結果與 SQL 語句連接起來形成最終的查詢語句,傳遞給資料庫執行。SQL 語句中可以使用多個 【${}】,定義多個參數使用。
使用【${} 】定義參數時,{ }內寫入的內容即為定義參數的內容,其中可以使用 FineReport 所有內建函式,如 if 函式、len 函式等。{ }中除了 FineReport 內建函式名、常數、字串連接文法外,其他變數就是資料集參數。
如:【SELECT * FROM 銷量 where 地區 = '${area}' 】中定義的資料集參數為 area。
帶有資料集參數的 SQL 語句寫好後,點選資料集定義介面【預覽】按鈕時,若顯示出定義的資料集參數。則表明資料集參數定義成功。如下圖所示。
在參數位置輸入值後點選確定,參數值就會代入 SQL 語句中,查詢出資料。
如下給出幾種常見的應用方式,使用者在使用時按實際場景調整即可。注意,因為資料集參數用在 SQL 查詢語句中,所以在使用時,特別要注意文法和對應資料庫型別的 SQL 文法匹配。
注:定義資料集參數時,盡量不要在${}中直接使用{ 、},可能會無法決議。若必須在${}中直接使用{ 、},需要使用函數 CONCATENATE 轉義,例如:SELECT * FROM 銷量${'{'}語句會出現報錯,需要將語句改為 SELECT * FROM ${CONCATENATE("銷量{")},即可正常查詢。
1
簡單應用。
如要定義一個地區參數,透過此參數過濾資料。建立資料集時,就可以在 SQL 查詢語句中定義一個資料集參數 area:【SELECT * FROM 銷量 where 地區 = '${area}'】。
SQL 語句中,其他內容都是確定的,唯有 area 不確定,當 area 對應不同值時,資料集也將查詢出不同地區的資料。
如果要實現多選查詢,就可以結合 SQL 語句 in 的用法定義一個參數,如:【SELECT * FROM 銷量 where 地區 in ('${area}')】
輸入參數值時注意要和資料庫文法一緻,如查詢華東華北的資料 SQL 文法為 【SELECT * FROM 銷量 where 地區 in ('華東','華北')】,輸入參數值形式應該為 【華東','華北】,這樣加上定義時的 ('${area}') 就會連接成正確的文法。
2
帶公式的應用。
定義資料集參數時,可以使用 FineReport 所有內建函式。如需要定義一個地區參數,當地區為空時,查詢所有地區的資料;當地區值不為空時,查詢對應地區的資料:
【SELECT * FROM 訂單 where 1=1 ${if(len(area) == 0,"","and 貨主地區 = '" + area + "'")} 】
定義時,先使用函式 len 獲取參數的長度,然後使用 if 函式進行判斷
如果 area 參數的長度為 0,則內容為空,SQL 連接後為 【SELECT * FROM 訂單 where 1=1】;
如果 area 參數的長度不為 0,則將字串 【and 貨主地區 = '】、【參數area】、'連接成一句 SQL ,如【area】的值為華東,那麼參數定義部分的執行結果為【and 貨主地區='華東'】,完整的 SQL 語句就變成:【SELECT * FROM 訂單 where 1=1 and 貨主地區='華東'】。
3
定義多個參數。
如果在資料過濾中,需要多個過濾條件,則可以定義多個資料集參數,如:
【SELECT * FROM 訂單 where 1=1 ${if(len(area) == 0,"","and 貨主地區 = '" + area + "'")} ${if(len(province) == 0,"","and 貨主省份 = '" + province + "'")}】
其中使用了兩次 ${},定義了兩個資料集參數 area 和 province,定義過程解譯可參考第二章第2節。
4
嵌套應用。
定義資料集參數時,也可以透過一些邏輯判斷巢定義多個資料集參數。如:
【SELECT * FROM 銷量 where 1=1 ${if(len(area)!=0," and 地區='"+area+"'",if(len(product)=0,""," and 産品='"+product+"'"))}】
if 函式是 FineReport 內建公式,變數 area 和 product 是資料集參數,如果【len(area)!=0】,即 area 參數不為空,即以
【SELECT * FROM 訂單 where 1=1 and 貨主地區='area' 】查詢,如地區為空,則要判斷 【len(product) 】,若【product】參數為空,則不連接任何查詢條件,即查出所有,否則以 【SELECT * FROM 訂單 where 1=1 and 産品='product' 】查詢。
三、範例
1
定義資料集參數。
建立資料集 ds1,資料庫查詢對話框中寫入 SQL 查詢語句 【SELECT * FROM 銷量 WHERE 地區='${area}'】,相當於在資料庫查詢語句中定義一個資料集參數【area】。點選右下角【重新整理】按鈕,下方資料集參數管理面板會顯示已經建立好的資料集參數【area】,設定它的預設值為【華東】。點選【確定】,即同時完成了資料準備和定義資料集參數的工作。如下圖所示。
2
表格樣式設計。
設定表格樣式,其中給表格選擇預定義樣式 【Head】型別的樣式,標題字體自動置中。如下圖1所示;
將資料集中的欄位拖入到對應儲存格中,字體置中,給表格整體新增預定義樣式預設天藍色內外框。如下圖2所示;
選中 C2 儲存格,右邊屬性面板選擇【儲存格元素】→【基本】。資料設定下拉框選擇【彙總】→【求和】。如下圖3所示。
3
參數新增元件。
點選參數面板的【編輯】按鈕,進入參數面板設定介面。如下圖1所示;
右上角元件設定面板會顯示沒有新增元件的參數,點選 【area 】或者點選【全部新增】,將參數的預設元件新增到參數面板。
點選自訂元件的【編輯】按鈕,選擇下拉框元件型別,讓使用者透過下拉框選擇參數值。如下圖2所示;
要想報表預覽時點選【下拉框】可以出現參數值的選項,則需要設定下拉框的資料字典為銷量表下的地區欄位。參數面板選中【下拉框元件】,右邊屬性面板選擇【屬性】→【資料字典】,點選資料字典【編輯】按鈕,彈出資料字典設定對話框。資料字典的型別設定為【資料庫表】,資料庫為 【FRDemoTW 】,選擇資料庫表為【銷量】,欄名實際值和顯示值都為【地區】。如下圖3所示;
點選【標簽元件】,將元件值命名為【地區:】。如下圖4所示;
將查詢按鈕往左邊拖拽,形成緊湊式佈局,讓元件面板更加美觀。再次點選參數面板的【編輯】按鈕,完成參數元件的設定。如下圖5所示。
注1:參數與元件是透過參數名稱進行綁定的,也就是說當元件名稱與參數名稱一緻時,參數與元件就進行了綁定,即在 Web 端給元件指派就相當於給參數指派。
注2:如果不想點選【全部新增】或【參數】快捷新增預設元件,也可以直接從元件欄中將元件拖拽到參數面板中,修改元件的名稱與參數名稱一緻,即可將元件與參數進行綁定。
注3:元件綁定資料字典時,當資料集中有和元件同名的參數時,不要使用,否則將造成循環引用,使得範本出錯,如此處 ds1 。
4
效果預覽。
PC 端:儲存報表,點選【分頁預覽】查看報表。下拉框選擇【華東】,點選查詢,只查詢出報表中華東地區的銷售資訊。下拉框選擇【華北】,點選查詢,只查詢出報表中華北地區的銷售資訊。
行動端:行動端查看報表的方式參見 報表行動端預覽。下拉框選擇【華東】,點選查詢,只查詢出報表中華東地區的銷售資訊。下拉框選擇【華北】,點選查詢,只查詢出報表中華北地區的銷售資訊。
四、已完成範本
已完成範本可參見:【%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doctw\Primary\Parameter\資料集參數.cpt】
點選下載範本:資料集參數.cpt。