帆軟報表之 控件示例 -3


 控件示例

下拉復選框默認選中全部值
1. 描述
在使用下拉復選框或者復選框組控件作為參數控件時,希望默認的是全部選中的,此時要如何設置呢?
0
2. 思路
將下拉復選框選項的全部值來設置控件值。如果下拉復選框是通過數據庫表或數據庫查詢設置的,那么下拉框的全部內容就可以通過sql函數取出
注:數據只有從數據庫中取出的才能使用sql函數,如果是通過自定義的設置的,那么可以直接在控件值里輸入自定義的內容,用逗號隔開
3. 示例
下面我們以下拉復選框為例,為大家介紹下如何設置。
假設已經存在下拉復選框控件,並且其數據是來自FRDemo中的雇員表,實際值與顯示值分別為雇員ID和姓名,下面我們來看下如何實現選中全部值。
3.1 默認選中全部值設置
在屬性表>高級>控件值中選擇公式,並在公式中輸入:sql("FRDemo","select * from 雇員",2),目的是通過sql從數據庫中取出雇員姓名即下拉框的顯示值。
3.2 效果查看
點擊分頁預覽,將下拉框打開,可以看到默認的是全部選中所有數據的,如上效果圖。 
點擊任意位置展現下拉框列表
1. 描述
下拉框以及下拉復選框默認狀態,必須點擊最右側的三角才可以實現下拉,不夠人性化。用戶大多更傾向於點擊任意位置,都可以展開下拉框選項,具體效果如下:
優化前:                                                      
0
  優化后:                                
0
2. 解決方案
打開%FR_HOME%\webapps\webroot\WEB-INF\reportlets\GettingStarted.cpt
切換至參數面板,選中下拉框控件,添加初始化后事件:
0
 
  1. var self = this;  
  2. $('input',this.element).click(function(){  
  3.     if(self.$view.css('display')=='none'){  
  4.         self.onTriggerClick();  
  5.     }  
  6. });  
注:理論上來說,只需要在初始化后事件中添加就可以,但測試的時候,有失效的可能,此時可以在編輯前事件中添加一條一模一樣的代碼。
適用環境:
如下環境使用此方式會較大提高交互容易度。比如,app展現時三角形太靠右側了。高分辨率下,三角形太小不容易點擊。
 
下拉樹示例
1. 如何定義下拉樹控件?
下拉樹的定義有兩種方式:自動構建及分層構建。關鍵在於你的數據結構是怎樣的?根據你的數據來選擇定義方式。
2. 自動構建怎么做及何時選擇自動構建?
下拉樹主要在於自動構建方式,通過將數據集直接轉為樹數據集,下拉樹直接選擇樹數據集來自動構建層級。
自動構建的好處就不需要你書寫SQL查詢語句,全部由FR自動完成。
當然前提是你的基礎數據必須滿足下面的條件,即需要有明顯的父子關系,如下圖,只有類似這樣的數據才能夠生成樹數據集。
0
具體定義過程可以參考 下拉樹控件自動構建示例
3. 分層構建怎么做及何時選擇分層構建?
每一層都要寫SQL來實現,且每一層的SQL語句必須單獨定義為一個報表數據集,在下拉樹數據定義界面選擇對應的數據集。
在FR中引用上層的值進行過濾如需要引用第一層,則使用layer1。
那什么時候選擇分層構建呢?可以說任何數據結構都可以使用分層構建,當然如果你數據滿足自動構建的話,可以直接使用自動構建啦,其他情況下就選擇分層構建吧。
具體定義過程可以參考 下拉樹控件分層構建示例
下拉樹控件默認全選
1. 描述
在構建下拉樹的時候,希望可以默認選中全部的選項,這要如何才能做到呢?
0
2. 實現步驟
2.1 自動構建下拉樹
在參數面板中,拖入下拉樹控件,選中下拉樹控件,出現控件屬性欄,點擊數據字典,構建下拉樹,構建完成后勾選高級>多選。
構建下拉樹可參考 下拉樹控件自動構建示例
0
2.2 添加控件值
在屬性表中,點擊高級>控件值,選擇公式,彈出公式定義對話框,輸入公式:EVAL("["+JOINARRAY(sql("FRDemo", "select '['||''''||部門名稱||''''||']' from 公司部門", 1), ",")+"]")
注:EVAL()返回表達式計算后的結果。用joinarray函數將數組轉換為字符串。sql()中查詢公司部門中的部門名稱。
0
2.3 預覽效果
保存后,點擊分頁預覽,如描述中所示,下拉樹控件默認全選。
下拉樹控件極速分層構建示例
1. 描述
極速分層構建其實就是簡化版的普通分層構建下拉樹,只需要定義一個數據集,通過依賴的層次和依賴的字段,實現普通分層下拉樹動態查詢的效果。
極速分層構建后的預覽效果:
0
2. 示例
下面我們用省份、地區、城市三列數據,通過極速分層構建的方式來實現下拉樹。
2.1 定義數據集
只需要定義一個數據集,里面包含所有需要的字段。
添加內置數據集,輸入省份、地區、城市三列數據,如下圖所示:
0
2.2 定義下拉樹
在參數界面中,選擇下拉樹控件,拖曳至參數界面中,選擇屬性表>高級>數據字典,構建方式選擇極速分層構建,選擇每層對應的值,並且設置相應的依賴層次和依賴字段,下拉樹便完成了。操作方式如下:
1)層次1
0
2)層次2
0
3)層次3
0
2.3 效果查看
點擊分頁預覽,則可在參數界面上看到下拉樹控件,效果如上圖所示。
 
下拉樹控件自動構建示例
1. 描述
FineReport 能夠將滿足以下條件的數據自動生成樹數據集,完全不用用戶手動書寫SQL查詢語句,使用樹數據集自動構建下拉樹:
0
2. 示例
2.1 定義數據集
增加數據集ds1,SQL語句為:SELECT * FROM 公司部門,數據結構如下圖:
0
需要特別強調的是,此種數據結構的情況,需要有唯一根節點(就是下圖parentID為空的節點)。
如果沒有,那么構建樹時會無法正常建立索引,最后在前台使用下拉樹控件時容易出現一些功能問題,比如控件不能給默認值、比如不能模糊搜索等。
2.2 轉為樹數據集
新建樹數據集Tree1,使用ds1來構建樹,如下圖:
0
2.3 定義下拉樹
選中下拉樹,點擊屬性表>高級>數據字典,將構建方式選擇自動構建,選擇樹數據集Tree1,實際值與顯示值分別為部門ID和部門名稱,這樣下拉樹便定義好了,預覽就可以看到效果。
0
 
下拉樹控件分層構建示例
1. 描述
分層構建下拉樹其實就是FR中的動態SQL,在這里需要將每個SQL定義為一個報表數據集,在下拉樹數據定義界面選擇對應的數據集。
2. 示例
以下我們用下圖地區、省份、城市三列數據,通過分層構建的方式來實現下拉樹:
0
2.1 定義下拉樹要使用的數據集
需要定義動態SQL,在這里需要將每層的動態SQL定義為一個數據集,然后在下拉樹中使用。
如該例下拉樹共3層,對應3個數據集:
數據集ds1,查詢出所有地區,SQL語句為:SELECT 貨主地區 FROM 訂單 where 貨主地區!=""
數據集ds2,根據第一層layer1的值查詢出省份,SQL語句為:SELECT  貨主省份 FROM 訂單 where 貨主省份!="" and 貨主地區='${layer1}'
數據集ds3,根據前兩層layer1、layer2的值查詢出城市,SQL語句為:SELECT  貨主城市 FROM 訂單 where 貨主城市!="" and 貨主地區 = '${layer1}'and 貨主省份='${layer2}'
注:這里是通過layer1、layer2來引用,以此類推。其中layer1,layer2等均是預定義好的,不可更改。
2.2 定義下拉樹
在參數界面中,選擇下拉樹控件,拖曳至參數界面中,選擇屬性表>高級>數據字典,構建方式選擇分層構建,選擇每層對應的數據集,下拉樹便完成了。操作方式如下圖:
1)第一層
0
2)第二層
0
3)第三層
0
2.3 效果查看
點擊分頁預覽,則可在參數界面上看到下拉樹控件,效果如上圖所示。
已完成模板,可參考:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\Parameter\下拉樹控件分層構建.cpt
 
 
多選下拉樹實現不同級別之間的查詢
1. 描述
數據庫中有3個級別的數據,分別是地區,城市,以及客戶名稱,如果想實現同時選擇查詢出華東地區下所有公司以及北京的某個公司的數據,這個該怎么實現呢?效果如下:
0
2. 數據准備
新建3個數據查詢ds1,ds2,ds3
ds1:SELECT * FROM 客戶
ds2:SELECT * FROM 客戶 where 地區 = '${layer1}'
ds3:SELECT * FROM 客戶 where 城市 = '${layer2}',實際值為客戶ID。
3. 報表主體設計
報表主體設計如下圖:
0
4. 參數界面設計
4.1 新建模板參數
切換到參數界面,點擊菜單欄中的模板>模板參數,點擊添加按鈕,新建模板參數tree。
4.2 構建樹
點擊右側上方的
0
按鈕,可以講參數全部添加到參數界面,然后將tree控件的類型選擇為下拉樹。
數據
選中下拉樹控件,在控件屬性面板中點擊數據,開始構建樹。
構建方式選擇分層構建。
層次1:選擇ds1,實際值和顯示值都為地區。
層次2:選擇ds2,實際值和顯示值都為城市。
層次3:選擇ds3,實際值為客戶ID,顯示值為客戶名稱。
注:此處使用的是列序號選取實際值和顯示值,亦可使用列名選取實際值和顯示值。
0
4.3 屬性設置
在高級里面勾選多選,即使用多選下拉樹,如果不勾選,則為單選下拉樹,其他屬性默認,屬性的具體介紹請查看 下拉樹控件
結果返回完整層次路徑
如果勾選該選項,那么,下拉樹返回的值為完整的層次路徑,在使用時需要通過treelayer函數進行獲取最底層的值,如果不勾選,則可以直接使用,這里先勾選上。
5. 過濾設置
參數界面和報表主體都設計好了之后,由於我們使用的是模板參數,需要通過參數將參數界面和報表主體聯系起來,
雙擊A2單元格,在過濾屬性中設置,客戶ID包含於treelayer($tree),如下圖:
0
注:公式treelayer($tree)的意思是返回參數tree中的值的最后一層數據。具體介紹請查看 treelayer函數
如果在參數面板設置下拉樹屬性時沒有勾選【結果返回完整層次路徑】,那么其過濾設置如下圖:
0
注:如果在參數面板設置下拉樹屬性時沒有勾選【結果返回完整層次路徑】,無需使用treelayer函數,可直接用下拉數參數,返回值即為tree的值。
6. 保存和預覽
點擊分頁預覽,則在BS端看到上圖的效果。
模板效果在線查看請點擊: tree.cpt
已完成的報表,可參見%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\widgetReport\多選下拉樹實現不同級別之間的查詢.cpt。
 
下拉樹實現數據集過濾
1. 描述
我們在制作模板時,經常要使用到參數,參數分為兩種,一種是數據集參數,一種的模板參數,因此,過濾也分為兩種,一種是數據集參數過濾,一種是模板參數過濾,這兩種在前面都有講到過,也介紹過用法,由於下拉樹的特殊性,其返回值是路徑數組值,並不是一個字符串,那么如果使用下拉樹的話,其過濾的方式也就有所不同,下面分別講述數據集參數過濾和模板參數過濾的方法。
2. 數據集參數過濾
2.1 單選下拉樹
1)數據准備
新建數據集ds1:SELECT * FROM S訂單  where 1=1 ${if(len(aa)==0,""," and 貨主城市 = '"+treelayer(aa)+"'")}
新建數據集layer1:SELECT  貨主地區 FROM 訂單 where 貨主地區 is not null 
新建數據集layer2:SELECT  貨主省份 FROM 訂單 where 貨主省份 is not null and 貨主地區='${layer1}'
新建數據集layer3:SELECT  貨主城市 FROM 訂單 where 貨主城市 is not null and 貨主省份='${layer2}'
注:數據集ds1中使用到了treelayer函數,即取得參數aa的最后一層值,詳細用法請查看 treelayer函數
2)下拉樹創建
在參數界面由參數aa生成控件,控件類型選擇下拉樹,下拉樹的數據字典選擇分層構建方式,數據來源是layer1,layer2和layer3,具體使用方法清查看 下拉樹分層構建示例
下拉樹控件默認為單選下拉樹,勾選結果返回完整層次路徑。
參數界面如下圖:
0
注:如果下拉樹屬性中不勾選結果返回完整層次路徑,那么下拉樹返回值不是路徑值,故無需使用treelayer函數對下拉樹返回值進行再次修改,直接使用即可,此時,可以將ds1數據集的SQL語句修改為SELECT * FROM [S訂單] where 1=1 ${if(len(aa)==0,""," and 貨主城市 = '"+aa+"'")}
3)報表設計
如下圖:
0
4)效果查看
0
模板效果在線查看請點擊: singletree.cpt
具體模板請查看:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\widgetReport\單選下拉樹實現數據集過濾.cpt
2.2 多選下拉樹
1)數據准備
打開上面的單選下拉樹模板,更改數據集ds1:SELECT * FROM S訂單  where 1=1 ${if(len(aa)==0,""," and 貨主城市 in ("+"'"+treelayer(aa,true,"\',\'")+"'"+")")}
注:treelayer(aa,true,"\',\'")返回的值是以“,”為分隔符的字符串,形如“北京,天津”這樣的字符串,但是在sql語句中實現in過濾必須形如“'北京,天津'”,兩者比較,后者比前者最前面和最后面多了兩個單引號,則在treelayer(aa,true,"\',\'")前面和后面拼接兩個單引號即可。
2)下拉樹
選中下拉樹控件,在控件屬性表中,勾選多選復選框和結果返回完整層次路徑。如下圖:
0
注:下拉樹屬性中勾選結果返回完整層次路徑選項,在ds1數據集實現過濾的時候都需要使用treelayer函數,勾選該選項treelayer有兩個作用,一個是獲取最底層值,另一個是將數組轉換為字符串,而不勾選該選項,則只是將數組轉換為字符串。
另:下拉樹屬性中不勾選結果返回完整層次路徑,只返回葉子節點,這個時候過濾中不需要用到treelayer這個函數 ,可以把("+"'"+treelayer(aa,true,"\',\'")+"'"+"))修改為("+"'"+replace(aa,',',"','")+"'"+"))。
3)效果查看
0
模板效果在線查看請點擊: mutitree.cpt
詳細模板請查看:%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Primary\widgetReport\多選下拉樹實現數據集過濾.cpt
 
填報頁面下拉樹控件返回所選層級值
1. 描述
前面幾篇文檔介紹了參數界面下拉樹的使用方法,以及treelayer函數的使用,那么在填報頁面使用下拉樹控件時,如果不做任何處理,控件的返回值就會是層級路徑,而不是所選層級的值,並且往數據庫中填報的值也會是路徑值,那么怎樣設置才能使單元格顯示為所選層級值,並且錄入數據庫也是所選層級值呢。
2. 示例 
在填報頁面使用下拉樹展現部門結構,實際值為部門ID,顯示值為部門名稱,希望實現下拉樹所在單元格返回值為所選層級值的顯示值,入庫時時所選層級值的實際值。如下圖所示:
0
2.1 數據准備
新建一張模板,添加數據集ds1:SELECT * FROM 公司部門。
接着添加樹數據集tree1,如下圖:
0
2.2 添加下拉樹
在報表主體添加一個下拉樹控件,在屬性設置頁面去掉只返回葉子節點前面的勾選,新建一個單選下拉樹,構建方式選擇 自動構建,實際值為部門ID,顯示值為部門名稱,設置如下圖:
0
此時,下拉樹就可以正常使用,但是控件的返回值是路徑值,並且還是實際值,如下圖:
0
那么,為了讓其返回為所選層級的顯示值,即返回“財務部”,就需要在形態中設置,將控件返回實際值的路徑轉化成所選層級的顯示值,即獲取到控件返回值部門ID“1,13”中的“13”,並通過sql語句,將部門ID轉換為部門名稱即可。
2.3 形態設置
如上所說,獲取路徑值的最后一個部門id的值,可用 treelayer函數實現,即treelayer($$$),用sql語句轉換部門ID和部門名稱,則可用 SQL函數,完整的公式如下:
sql("FRDemo","select 部門名稱 from 公司部門 where 部門id='"+treelayer($$$)+"'",1)
如下圖:
0
注:如果此處的下拉樹是多選下拉樹,那么sql函數應該為:sql("FRDemo","select 部門名稱 from 公司部門 where 部門id in ('"+treelayer($$$)+"')",1)。
2.4 填報屬性設置
到此為止,報表展示時的數據顯示已經滿足需求,但是上面所做的一切設置都只是改變了數據的形態,並沒有改變數據的實際值,那么在入庫的時候還是會用實際值入庫,比如說,選擇了“財務部部長”,填報進數據庫的值卻是“131”,很明顯,填報進數據庫的值應該是“財務部部長”對應的部門ID“131”,所以在填報屬性處也需要使用公式treelayer(B2),B2單元格為下拉樹所在單元格,如下圖:
0
2.5 結果查看
點擊填報預覽,選擇“財務部部長”,web端的結果如上所示,點擊提交按鈕之后,查看表里面的數據,會發現填報進去的是財務部的實際值“13”。如下圖:
0
注:不論是單選下拉樹還是多選下拉樹均可這么設置。
 
下拉樹控件FAQ
1. 下拉樹控件無法使用模糊查詢
問題:下拉樹有正常的樹結構,但是無法使用模糊查詢。
原因:根節點的父節點不為空。
解決方案:根節點的父節點設為空,不存放數據。
0
2. 下拉樹控件子節點無法展開
問題:下拉樹結構顯示異常,子節點無法展開。
原因:數據列中包含重復值,且實際值與顯示值不同,目前不支持實際值重復的數據結構。
0
解決方案:將實際值和顯示值設為相同。
iframe中嵌入報表
1. 描述
如何實現在iframe中嵌入報表?效果如下圖:
0
 
 

 

按鈕的快捷按鍵設置
1. 描述
有時我們希望能夠通過快捷鍵來觸發按鈕,我們可以對按鈕控件進行快捷鍵設置來實現。
2. 設置方法
可以通過控件的控件設置來添加或修改觸發快捷鍵。
例如,查詢按鈕中設置快捷鍵為enter,則按enter就會觸發查詢按鈕:
0
注:FineReport只支持部分的鍵設置為快捷鍵,即不是所有的鍵都可以設置快捷鍵。
當將鼠標移至 屬性表>高級>快捷鍵 時,會出現可以設置的快捷鍵。支持的快捷鍵如下圖所示,若設置了不屬於上述快捷鍵的按鍵,快捷鍵將會無效:
0
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM