引用
的回答
1. 描述
希望不同用户登陆系统后,访问相同的模板,所看到的数据是不同,样式不同等。如:访问报表A,中央的账号登陆系统,看到的是全国的数据,而省级用户登陆系统,看到的是该省的数据,依次往下类推。
2. 实现原理
用户认证后会将报表三个固定的默认参数$fr_username、$fr_authority、$fr_userposition保存在session中,同时提供两个函数GETUSERDEPARTMENTS()、GETUSERJOBTITLES()来分别获取部门角色的部门和职位同一报表环境下模板中就可以直接以参数的形式获取到对应的值,然后在模板里面进行筛选判断就可以显示不同数据及样式。
$fr_username:获取登录系统的用户名,比如说登录用户名为Anna,那么$fr_username=Anna;
$fr_authority:获取登录系统的角色,如果是管理员用户登录则,$fr_authority=SUPERROLE,如果是角色用户登录,比如说角色数据架构师用户登录,$fr_authority=数据架构师,如果是部门角色登录,该参数为空,$fr_authority返回值为数组,使用concatenate($fr_authority,"")即可将其转化为字符串;
$fr_userposition:获取部门职位,返回值为一个由部门和职位组成的数组,比如说人力资源部长职位登录系统,那么$fr_userposition={"departments":"人力资源","jobTitle":"部长"};
GETUSERDEPARTMENTS():获取部门职位里面的部门,比如说人力资源部长职位登录系统,那么GETUSERDEPARTMENTS()=人力资源;
GETUSERJOBTITLES():获取部门职位里面的职位,比如说人力资源部长职位登录系统,那么GETUSERJOBTITLES()=部长。
注:$fr_username、$fr_authority、$fr_userposition是我们报表默认的参数,所以调用时大小写必须保持一致。
3. $fr_username
不同用户登录查看的数据是不同的。在数据集中通过报表默认参数$fr_username进行过滤筛选,在sql中加入过滤筛选语句,即可达到不同的人看不一样的数据。
用户陈羽登陆成功之后只能看到自己的销量,定义的数据集为ds1:SELECT * FROM [销量] where 销售员='${fr_username}',配置好权限以王伟登陆成功之后,模板内容就会自动筛选到王伟的信息了, 以其他用户登陆进去则可以看到其他用户的信息。
在参数界面,控件的值根据权限参数值的改变而显示的值不同,这样通过动态sql获取,增加sql的过滤条件为权限参数名称即可。
用户王伟登陆成功,看到的下拉框控件只有自己的产品,在设置下拉框控件,选择动态sql输入sql语句为:SELECT * FROM [销量] where 销售员='${fr_username}'选择实际值和显示值。这样就实现不同的用户,登陆系统进入报表,下拉框所看到值就不同了。
注:参数界面必须定义控件,参数名为报表默认参数fr_username,因为参数界面传值是通过控件的值来引用的,所以先定义控件才可以把值传到控件chanpin里面,进行筛选数据。如果控件fr_username不希望显示,可以在控件设置,可见的勾去掉即可。
4. $fr_authority
希望不同角色看到的列数不同,行列的颜色不同,这样可以给行列添加条件属性设置行高、列宽、背景等,如果登录系统用户为角色用户,则可以在公式中通过$fr_authority进行过滤,如果是部门职位用户,则不可使用该参数进行过滤。设置模板的条件属性格式可参考条件属性文档。
若王伟是管理员,孙林的角色名称是销售主管,且为导入的角色或者手动添加的角色,王伟登录的时候可以看到所有的列,而孙林登录的时候只显示地区、销售员、产品和销量,汇总这列看不到。这里就得在汇总这列添加条件属性>列宽,设置为0,公式中写入默认参数$fr_authority='销售主管'判断登录的角色为销售主管,如下图所示:
以孙林登陆成功后,即角色为销售主管登录,访问模板只能看到报表展示了以下内容,如下图所示:
5. GETUSERDEPARTMENTS()和GETUSERJOBTITLES()
仍然以上面的$fr_authority示例中的模板为例,只是此时孙林不再是角色用户,而是部门职位用户,部门为销售部门,职位为主管,那么公式中应该写入两个函数GETUSERDEPARTMENTS()='销售部门'和GETUSERJOBTITLES()='主管',如下图:
|