同一张报表,不同的人,可查看不同的数据

2022-08-22_095530.pngOracle数据库,10.0版本如何实现同一张报表,根据以下条件进行报表权限查看隔离,类似图片中的多个case when条件,oracle数据库需要如何编写finereport 权限细粒度控制.png

1)B列子项目负责人可以查看自己负责的子项目行数据;($fine_username)

2)C列总项目负责人可以查看自己负责的总子项目行数据;($fine_username)

3)事业部领导可以查看报表中D列自己对于事业部的行数据(事业部领导我有单独建议一张role表存放对于领导的工号、姓名、事业部,可实现role表与$fine_username的匹配,再去抓取报表模版对应的事业部);

FineReport snowzl 发布于 2022-8-21 22:16 (编辑于 2022-8-22 09:56)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
fofantasyLv5初级互助
发布于2022-8-22 10:12(编辑于 2022-8-22 12:52)

在where 中增加:

项目负责人='${fine_username}' OR 总项目负责人='${fine_username}' OR 事业部=(SELECT 事业部 FROM 事业部领导 where  工号='${fine_username}')

显示项目负责人是当前用户,或者总项目负责人是当前用户,或者 事业部是当前用户管理的事业部的数据,这样就可以了。

回复提问人:

你这部分SQL写错了,权限控制部分的SQL应该用括号括起来。并且 前面应该是 AND 而不是OR

image.png

  • snowzl snowzl(提问者) 最后3个条件参照您给的已经设置后,权限没有实现隔离,请问是哪里不对么? select t0.* from (select distinct(t.recno), MAIN_PROJECT_NO, PROJECTNAME,PROJECT_TYPE,PROJECT_LEVEL,owning_user,PROPOSAL_PER as 项目负责人,DEPARTMENT_BUSINESS as 事业部,APP_UNIT,STATUS,CURRENT_PHASE,CURRENT_PHASE_STATUS,DEVELOPCYCLE,RUN_DAYS,FACT_DAYS,SELF_CHECK,industry,CREATEDATE, (case when t.MAIN_PROJECT_NO=\'—\' then \'总项目\' else \'子项目\' end ) as 总子项目, (SELECT owning_user FROM t_if_project_app A WHERE MAIN_PROJECT_NO=\'—\'AND A.recno=SUBSTR(t.recno,1,7)) as 总项目负责人 from T_IF_PROJECT_APP t) t0 where 1=1 ${if(len(项目编码) == 0,\"\",\"and t0.recno in (\'\" + 项目编码 + \"\')\")} ${if(len(项目名称) == 0,\"\",\"and t0.PROJECTNAME = \'\" + 项目名称 + \"\'\")} ${if(len(状态) == 0,\"\",\"and t0.STATUS = \'\" + 状态 + \"\'\")} ${if(len(项目分类) == 0,\"\",\"and t0.PROJECT_TYPE = \'\" + 项目分类 + \"\'\")} and TO_DATE(t0.CREATEDATE, \'yyyy-MM-dd\')>= TO_DATE(\'${开始日期}\', \'yyyy-MM-dd\') and TO_DATE(t0.CREATEDATE, \'yyyy-MM-dd\')<= TO_DATE(\'${结束日期}\', \'yyyy-MM-dd\') and t0.industry = \'光电\' or t0.项目负责人=\'${fine_username}\' OR t0.总项目负责人=\'${fine_username}\' OR t0.事业部 in (select t2.low as 权限low值 from T_PLM_FINE_USER t1,t_plm_fine_role t2 where t1.role=t2.role_id and t2.MOD=\'PROJECT_APP\' and t2.FIELD=\'BUSINESS\' and t1.user_id =\'${fine_username}\')
    2022-08-22 11:28 
  • fofantasy fofantasy 回复 snowzl(提问者) 你后面SQL写错了,看下我截图在回复里了。
    2022-08-22 12:51 
  • snowzl snowzl(提问者) 回复 fofantasy 参照你这样设置后,事业部领导可以查看到对应的数据了,总子项目负责人查不到对应的数据,是因为我报表里是姓名,而${fine_username}对应的是工号。请教下是否可以根据姓名匹配到帆软的登录名呢?
    2022-08-22 13:51 
  • snowzl snowzl(提问者) 回复 fofantasy 谢谢您的帮助哈,关于报表总子项目负责人姓名关联登录用户名,我设置一个模板参数:“username”,设置公式根据登录用户名获取姓名(第12列) sql(\"Finedb\",\"SELECT * FROM fine_user where username = \'\"+$fine_username+\"\' \",12) , 总子项目负责人=\'${username}\'来实现数据匹配。
    2022-08-22 15:26 
  • fofantasy fofantasy 回复 snowzl(提问者) 嗯嗯,不好意思才看到你消息,那个只是细节了,用你的方法SQL函数,转换下(查询下finedb)就行了。
    2022-08-22 16:53 
最佳回答
0
pilyxuLv6初级互助
发布于2022-8-21 23:11

使用系统参数编写SQL语句,可以用 添加where条件,where 项目负责人='${fine_username}' ,或者权限细粒度参数控制- FineReport帮助文档 - 全面的报表使用教程和学习资料 (fanruan.com)。如果需要进行匹配,可以加上if语句,${if(inarray(fine_username,['***','***','***'])!=0 ,"AND 项目 like '%**%'")}

  • snowzl snowzl(提问者) 我这个和帮助手册中的外部权限表实现数据权限过滤类似:https://help.fanruan.com/finereport/doc-view-3040.html,只是我不知道oracle数据库要如何在where后面添加多种case when的判断条件来实现,请问以下这种写法问题出在哪儿呢(判断事业部领导可查看的数据)? ${if((select count(1) from T_PLM_FINE_USER t1,t_plm_fine_role t2 where t1.role=t2.role_id and t2.MOD=\'PROJECT_APP\' and t2.FIELD=\'BUSINESS\' and t1.user_name =\'${fine_username}\')==0,\"\",\"and t0.事业部 in (\'\" + select t2.low as 权限LOW值 from T_PLM_FINE_USER t1,t_plm_fine_role t2 where t1.role=t2.role_id and t2.MOD=\'PROJECT_APP\' and t2.FIELD=\'BUSINESS\' and t1.user_id =\'${fine_username}\' + \"\')\")}
    2022-08-22 08:37 
最佳回答
0
johnsengLv6见习互助
发布于2022-8-22 06:51

(1)将$fine_username放在e1单元格,字体设置成白色,达到隐藏之目的

(2)设置条件属性,根据e1单元格的用户属性,分别隐藏B列、C列或D列

  • snowzl snowzl(提问者) 我不是要隐藏隐藏B、C、D列数据噢,是想实现: 1)当登录用户为B列的子项目负责人,子项目负责人可以看到自己的行数据; 2)当登录用户为C列的总项目负责人,总项目负责人可以看到C列有自己名字的行数据; 3)事业部领导人员可以看到D列自己所属事业部的行数据。
    2022-08-22 08:33 
  • 5关注人数
  • 625浏览人数
  • 最后回答于:2022-8-22 12:52
    请选择关闭问题的原因
    确定 取消
    返回顶部