设计者思维丨权限轴

应用背景

数据的本质是为了业务服务,从而达到更高效的工作方式,实现数据对业务的赋能和推动作用。
因此在构建报表时,需要开发者有设计思维,能够考虑多种应用场景,帮助业务解决实际应用中的问题。
例如,在实际业务场景中,管理层用户习惯向下管理的方式,那么在查看报表时,能否也保留这种方式呢?

规则描述

  • 组织架构分为多级,1级、2级、3级,数字越小,级别越高

  • 上级用户有权限查看下属子部门数据

  • 各级用户在查看报表时,默认展开下级部门,例如1级部门用户,则展示下属所有2级部门,以此类推

  • 当用户分管多个平级部门时,则展示自身所在层级,不进行展开

案例数据


图1和图2两张事实表分别存储Actual和Budget数据。

  • 预算和实际存在挂在父级部门不下放的情况,因此事实表存在1级2级3级部门混合在一列的情况

  • 除了预算和实际存在此情况外,有时候项目也会存在这种情况

图3是维度表,存储部门数据。

  • 因为存在预算和实际不下放的情况,所以需要将本部门下落到子级,保证该部门的数据完整

  • 除了保证数据完整,还要保证数据可进行钻取,父级部门既可以看到下属子级部门的数据,也可以看到挂靠在本部门的数据

图4是维度表,存储Actual和Budget的类别数据。

级别字段1字段2字段3
1一级一级一级
1一级二级二级
1一级二级三级
2一级一级一级
2二级二级二级
2二级三级三级
3一级一级一级
3二级二级二级
3三级三级三级

图5是多维的维度表,本身是部门维度数据的变体。

  • 多维表结构图,是多维表的设计理念

  • 级别分为3级,代表着部门的层级结构

  • 从权限管理的角度来说,子级部门不可以看到归属上级部门的数据

  • 每个级别中,都有不属于该级别的数据,例如:2级部门中,存在1级部门,这个是为了保证测试时,每个级别的数据都是完整的,减少测试的工作量

图6是配置表,存储用户的权限信息。

图7是表模型,多维表和配置表不需要建立模型关系。

构建度量值

01.Actual = 
SUM ( 'Fact_Act'[实际] )
02.Budget =
SUM ( 'Fact_Bud'[预算] )
03.AnalysisActual =
VAR Analysis=
    VALUES ('Dim_Analysis'[L3])
VAR Result=
    CALCULATE ([01.Actual], FILTER ('Dim_Dept','Dim_Dept'[部门2] IN Analysis))
RETURN
    Result
04.AnalysisBudget =
VAR Analysis=
    VALUES ('Dim_Analysis'[L3])
VAR Result=
    CALCULATE ([02.Budget], FILTER ('Dim_Dept','Dim_Dept'[部门2] IN Analysis))
RETURN
    Result
05.AnalysisRate = 
DIVIDE ( [03.AnalysisActual], [04.AnalysisBudget] )

可视化结果

添加轴权限

06.DisplayLevel =
VAR Access =
    CALCULATE (
        MIN ( 'Config_Access'[ID_DepartmentLevel] ),
        'Config_Access'[LB_AdAccount] = USERNAME ()
    ) + 0
VAR AccessCount =
    COUNTROWS (
        CALCULATETABLE (
            VALUES ( 'Config_Access'[LB_Accessible] ),
            'Config_Access'[LB_AdAccount] = USERNAME (),
            'Config_Access'[ID_DepartmentLevel] = Access
        )
    )
VAR AccessLevel =
    IF ( AccessCount > 1 && Access <> 0, Access - 1, Access )
VAR Result =
    IF (
        AccessLevel <> 3,
        VALUE ( MIN ( 'Dim_Analysis'[LB_LEVEL] ) ) - AccessLevel,
        VALUE ( MIN ( 'Dim_Analysis'[LB_LEVEL] ) ) - 2
    )
RETURN
    Result

DAX解析

  • 变量Access是为了获取当前用户的最大权限,数字越小权限越大

  • 如果用户有访问此报表的权限,但是权限表中没有对应的权限数据,则该用户为Admin权限,Access度量值需要进行补0操作

  • 变量AccessCount是为了获取当前用户的权限行数,因为存在一个用户管理多个部门的情况

  • 变量AccessLevel是为了输出参数,实际场景中,如果用户管理多个部门,全部展开下属部门数据会变的特别多,因此不需要展开,仅需要展示同级即可

  • 变量Result是判断用户默认的查看层级,如果用户非3级部门,那么管理多个部门看本级,管理一个部门看子级,3级部门则看本级

结果

从结果上看,权限控制展示的维度是正确的,但是展示的数据不正确,A的达成率应该是16.67%,C的达成率应该是2.33%。

产生原因

  • 筛选器会将X轴的所有字段与列图例里面的字段组合,重新构建上下文

  • 筛选器构建上下文的过程中,度量值03参与了此过程,导致一部分值被排除在外了

  • 类别维度表与部门维度表之间没有直接关系,二者在一起有类似笛卡尔积的效果,也对结果有影响

解决方案

度量值内部权限判断,不依赖于筛选器判断

07.DisplayRate =
VAR Access=
    CALCULATE (
        MIN ('Config_Access'[ID_DepartmentLevel]),
'Config_Access'[LB_AdAccount]= USERNAME ()
)+0
VAR AccessCount=
    COUNTROWS (
        CALCULATETABLE (
            VALUES ('Config_Access'[LB_Accessible]),
'Config_Access'[LB_AdAccount]= USERNAME (),
'Config_Access'[ID_DepartmentLevel]=Access
)
)
VAR AccessLevel=
    IF (AccessCount>1&&Access<>0,Access-1,Access)
VAR Result=
    IF (
AccessLevel<>3,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-AccessLevel,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-2
)
RETURN
    IF (Result=1,[05.AnalysisRate], BLANK () )

结果如下:

度量值内部屏蔽多余上下文干扰

08.AnalysisRateExcept =
CALCULATE (
    DIVIDE ( [03.AnalysisActual], [04.AnalysisBudget] ),
    ALLEXCEPT ( 'Dim_Analysis', 'Dim_Analysis'[L1] ),
    ALL ( 'Dim_Type'[类别] )
)

结果如下:

计算组封装,屏蔽干扰因素

VAR Access =
    CALCULATE (
        MIN ('Config_Access'[ID_DepartmentLevel]),
'Config_Access'[LB_AdAccount]= USERNAME ()
)+0
VAR AccessCount=
    COUNTROWS (
        CALCULATETABLE (
            VALUES ('Config_Access'[LB_Accessible]),
'Config_Access'[LB_AdAccount]= USERNAME (),
'Config_Access'[ID_DepartmentLevel]=Access
)
)
VAR AccessLevel=
    IF (AccessCount>1&&Access<>0,Access-1,Access)
VAR Result=
    IF (
AccessLevel<>3,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-AccessLevel,
        VALUE ( MIN ('Dim_Analysis'[LB_LEVEL]))-2
)
RETURN
    IF (Result=1, SELECTEDMEASURE (), BLANK () )

结果如下:

补充

  • 若部门连接类别,类别连接事实表,则不会存在此问题

  • 上述问题的诱因,也存在笛卡尔积的原因,导致内部计值流发生了变化

特别鸣谢夕枫大佬



在这里插入图片描述

  • 19
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fabric丨白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值