問題:實際應用環境中,不一樣角色的人可能對數據具備不一樣的訪問權限,經過直接在SQL語句中篩選出須要的數據製做模板能夠解決該需求,但對於角色較多的狀況,就須要製做不少張樣式相同只是數據集不一樣的報表,不利於後期的維護而且加大了報表製做的工做量。html
方案:針對該問題,在報表系統FineReport中,能夠利用SQL參數配合參數處理器再結合權限以完成該需求。使用該方案只須要製做一張表樣,利用SQL中的參數進行動態過濾達到該目的。下面具體描述該方案的實施過程。數據庫
第一步:數據準備服務器
這裏使用的是DEMO數據,主要爲了演示該方案的操做,具體使用的時候須要根據具體的數據狀況進行調整:編碼
表:datasspa
IDorm |
DATAhtm |
ROLEblog |
1ci |
100文檔 |
|
2 |
200 |
|
3 |
300 |
|
4 |
400 |
1 |
5 |
500 |
1 |
6 |
600 |
2 |
7 |
700 |
2 |
8 |
800 |
3 |
ID:編號
DATA:數據
ROLE:可查看角色編碼
表:roles
ID |
ROLENANME |
ROLE |
1 |
總裁 |
|
2 |
總經理 |
1 |
3 |
部門經理 |
2 |
4 |
銷售人員 |
3 |
ID:編號
ROLENAME:角色名稱
ROLE:角色編碼
第二步:製做模板
2.1 新建一張模板,報表數據集中新建一個「數據庫查詢數據集」,名稱爲:datas,SQL語句寫成「select * from datas where ROLE>=[?ROLE?]」
2.2 拖拽新建的報表數據集datas的數據列至報表中,以下圖所示:
http://www.finereport.com/forumimages/tgqxkzsjfw1.jpg
2.3 新建一個服務器數據字典,用於進行角色名稱與角色編碼的轉換,由於這裏是演示用,就直接將數據寫死了,使用自定義的服務器數據字典,用戶能夠根據具體的狀況使用數據庫查詢數據字典來定義,關鍵點是要將「角色名」設置爲key,「角色編碼」設置爲value。由於在應用的過程當中,一個用戶的角色是經過角色名來定義的,而對數據的訪問控制是經過角色編碼來控制的,這裏須要一個值轉換的過程。若是角色名與角色編碼一致則能夠不通過下列步驟的設置。
數據字典的名稱爲:roles_map
http://www.finereport.com/forumimages/tgqxkzsjfw2.jpg
2.4 設置參數處理器,選擇菜單中的「報表」-「參數處理器」,定義先前SQL語句中定義的參數「ROLE」的參數處理器,這裏採用公式類型,用於將角色名處理爲角色編碼,公式爲:「MAP($ROLE,」roles_map」)」以下圖所示:
http://www.finereport.com/forumimages/tgqxkzsjfw3.jpg
2.5 保存模板文件便可。
2.6 用戶在集成應用的時候,須要在系統登陸後設置當前登陸的用戶的角色,或者使用FineReport自帶的權限管理系統。若是採用FineReport自帶的權限管理系統,上述SQL語句中的ROLE參數可以使用FR_ROLE_NAME來替代,該參數是FineReport權限系統中的默認登陸角色參數名。具體登陸角色設置方式請參見FineReport權限集成幫助文檔或諮詢FineReport服務人員。