请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

williamluo

高级会员

97

主题

222

帖子

1063

积分

高级会员

积分
1063

活字格认证

williamluo
高级会员   /  发表于:2017-12-16 15:52  /   查看:3865  /  回复:0
本帖最后由 williamluo 于 2017-12-16 21:27 编辑

  业务报表中,有些敏感数据是需要根据用户身份过滤的。比如销售数据统计表,只允许报表用户看到本部门的销售数据。这时就需要将用户信息作为报表数据的查询条件。
  葡萄城报表提供了一个专门的表达式变量,表示用户身份信息。不仅可以按登录报表系统的用户名来查询数据,也可以按照用户所属部门等其他关联信息作为查询条件。这种用户身份关联信息称为“用户上下文(User Context)”信息。引用用户上下文信息的表达式形式为:
  =Code.UserContext.GetValue("Key")
  其中,Key表示上下文信息的键值,比如:Name表示用户名,也就是说,Code.UserContext.GetValue("Name")返回的就是正在查看报表的用户登录名。
  通过葡萄城报表特有的安全提供程序机制,可以支持任意字符串的Key,比如用户所属部门、业务管辖区域、甚至姓名、年龄、身份证号等任何与用户帐号关联的信息。

  下面是一个销售统计表的简单示例,在此示例中,查看报表的用户只能看到其所属部门的销售数据。
数据库中的用户关联信息如下表:
image.png387020568.png
其中:UserName表示用户登录报表系统的用户帐号;DepId为用户所属部门的代码。

销售数据如下表:
image.png737998046.png
其中的DepId就是部门代码,SalesQty为销售数量,SalesAmt为销售额。


新建一个RDL报表,添加用户信息参数,参数名为UserName,如下图:
image.png431040038.png
注意:因为这个参数的值要从系统中自动获取,而不是让用户在参数栏自行输入,所以勾选了【隐藏】,这样可以避免用户输入其他用户的用户名,从而“偷窥”敏感信息。

切换到【默认值】选项卡,选择【非查询结果】,点击加号图标,添加一个参数默认值,设置其表达式为:
=Code.UserContext.GetValue("Name")
如下图:
image.png328740844.png
点击【确定】按钮,保存参数设置。

添加数据源,如下图:
image.png324541320.png

添加数据集,先定义数据集参数,使之引用前面定义好的取用户信息的报表参数UserName,如下图:
image.png109942626.png

再定义查询语句,select * from DepSales
where DepId in (select DepId from Emp where UserName = @p1)

如下图:
image.png809631652.png
其中的Where子句,就是根据用户所属部门来过滤数据。

准备好数据集之后,在设计区拖放一个文本框,用于显示UserName参数的内容,再放一个表格,绑定数据集的字段,如下图:
image.png914649963.png

注意:
因为本地设计器中并没有哪个用户登录,因此在设计器中预览时,是取不到用户上下文信息的。如果在预览时看到报错,可将UserName参数设置为【允许空值】,如下图:
image.png60303648.png

为了检查按用户身份过滤数据的效果,请点击【文件】菜单的【保存到服务器】,将报表模板上传到报表服务器。
然后在报表管理门户设置报表查看权限,如下图:
image.png418501891.png

再在系统管理门户创建几个用户,如下图:
image.png394603881.png

以zhang,li,wang等用户身份登录到报表查看门户,查看报表,如下图:
image.png633161010.png

可以看到,报表内容正确显示了当前用户名,并且表格中仅显示该用户所属部门的业务数据。


0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部