反饋已提交
網絡繁忙
同一张报表,不同的用户登录,看到的数据不同。
例如:北京分公司的人只能看到北京的数据,上海分公司的人只能看到上海的数据。
引入外部权限表,直接在数据库查询语句中实现数据权限的过滤。
$fine_username:该参数用于获取决策系统的登录名。详细内容参见:权限细粒度之参数控制。
在数据库中创建一张外部权限表。表中的 user_code 对应的就是决策系统的用户名,比如:zhangsan 就是用户名。
注:如果之前已经有用户和城市的对应表,就不需要创建这张对应表了。
在 FineReport 设计器中引用2.2中创建的外部权限表,把过滤条件写在数据源代码里。数据过滤分以下两种情况:
1)如果所有用户都要过滤权限,就比较简单,可以直接写在条件里。
注:以下代码以MySql数据库为例:
注:以下代码以SQL Server 2014数据库为例:
3)报表完成后,部署到决策平台,用 zhangsan 这个账号登录,就只能看到北京市的数据。用 lisi 登录,就只能看到上海市的数据。
通常情况下,查看报表的用户不止一种级别,可能会存在多种级别,如:省公司用户、分公司用户、业务员等。这个时候就需要调整一下外部权限表,增加一些字段来区分不同的用户。
下图所示的是经过调整的外部权限表fr_user_city的字段及内容,可以控制多级用户权限:
张三是1级用户,拥有江苏省公司的权限;
李四是2级用户,拥有3个分公司的权限;
管云云是3级用户,除了查看自己的业绩,还可以查看其他人的业绩;
王锐也是3级用户,只能查看自己的业绩。
SELECT t.prov_name AS '一级机构', t.city_name AS '二级机构', t.sales_name AS '业务员', t.int_value AS '数量'FROM yl_order_table tWHERE 1 = 1-- (1)过滤 1级部门 AND CASE WHEN (SELECT COUNT(1) FROM fr_user_city t WHERE t.valid = 'T' AND t.level IN (1,2,3) -- 注意:过滤不同级别权限时此处不同 AND t.user_code = '${fine_username}' )<>0 THEN t.prov_name IN (SELECT distinct t.org1_name -- 注意:过滤不同级别权限时此处不同 FROM fr_user_city t WHERE t.valid = 'T' AND t.level IN (1,2,3) -- 注意:过滤不同级别权限时此处不同 AND t.user_code = '${fine_username}' ) ELSE 1=1 END -- (2)过滤 2级部门 AND CASE WHEN (SELECT COUNT(1) FROM fr_user_city t WHERE t.valid = 'T' AND t.level IN (2,3) -- 注意:过滤不同级别权限时此处不同 AND t.user_code = '${fine_username}' )<>0 THEN t.city_name IN (SELECT distinct t.org2_name -- 注意:过滤不同级别权限时此处不同 FROM fr_user_city t WHERE t.valid = 'T' AND t.level IN (2,3) -- 注意:过滤不同级别权限时此处不同 AND t.user_code = '${fine_username}' ) ELSE 1=1 END -- (3)过滤 3级部门 AND CASE WHEN (SELECT COUNT(1) FROM fr_user_city t WHERE t.valid = 'T' AND t.level = 3 -- 注意:过滤不同级别权限时此处不同 AND t.user_code = '${fine_username}' )<>0 THEN t.sales_name IN (SELECT distinct t.org3_name -- 注意:过滤不同级别权限时此处不同 FROM fr_user_city t WHERE t.valid = 'T' AND t.level = 3 -- 注意:过滤不同级别权限时此处不同 AND t.user_code = '${fine_username}' ) ELSE 1=1 END;
不同的数据库会有一定的差异,请根据实际情况进行调整。
文 檔回 饋
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉