设计者思维丨权限轴

应用背景

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

规则描述

  • 组织架构分为多级,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 () )

结果如下:

补充

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

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

特别鸣谢夕枫大佬



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/758641.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思MindSpore学习入门-函数式自动微分

函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#…

论文解读:【CVPR2024】DUSt3R: Geometric 3D Vision Made Easy

论文“”https://openaccess.thecvf.com/content/CVPR2024/papers/Wang_DUSt3R_Geometric_3D_Vision_Made_Easy_CVPR_2024_paper.pdf 代码&#xff1a;GitHub - naver/dust3r: DUSt3R: Geometric 3D Vision Made Easy DUSt3R是一种旨在简化几何3D视觉任务的新框架。作者着重于…

Java高级重点知识点-17-异常

文章目录 异常异常处理自定义异常 异常 指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。Java处 理异常的方式是中断处理。 异常体系 异常的根类是 java.lang.Throwable&#xff0c;&#xff0c;其下有两个子类&#xff1a;ja…

实验4 图像空间滤波

1. 实验目的 ①掌握图像空间滤波的主要原理与方法&#xff1b; ②掌握图像边缘提取的主要原理和方法&#xff1b; ③了解空间滤波在图像处理和机器学习中的应用。 2. 实验内容 ①调用 Matlab / Python OpenCV中的函数&#xff0c;实现均值滤波、高斯滤波、中值滤波等。 ②调…

java基于ssm+jsp 多用户博客个人网站

1管理员功能模块 管理员登录&#xff0c;管理员通过输入用户名、密码等信息进行系统登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入个人网站可以查看&#xff1b;个人中心、博文类型管理、学生博客管理、学生管理、论坛信息、管理员管理、我的收藏管理、留…

Linux多进程和多线程(一)-进程的概念和创建

进程 进程的概念进程的特点如下进程和程序的区别LINUX进程管理 getpid()getppid() 进程的地址空间虚拟地址和物理地址进程状态管理进程相关命令 ps toppstreekill 进程的创建 并发和并行fork() 父子进程执行不同的任务创建多个进程 进程的退出 exit()和_exit() exit()函数让当…

微短剧市场还能火多久?短剧小程序是否有必要搭建?,现在入场到底晚不晚?

我公司在2019年开始都是做软件开发的&#xff0c;从2022到现在&#xff08;2024&#xff09;特别深有体会&#xff0c;在2022年的时候我公司还是在全部做外包项目&#xff0c;一年大概遇到了10多个咨询短剧领域的软件定制&#xff0c;但是当时我只是以为是一个影视播放的程序&a…

7.优化算法之分治-快排归并

0.分治 分而治之 1.颜色分类 75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数…

推动多模态智能模型发展:大型视觉语言模型综合多模态评测基准

随着人工智能技术的飞速发展&#xff0c;大型视觉语言模型&#xff08;LVLMs&#xff09;在多模态应用领域取得了显著进展。然而&#xff0c;现有的多模态评估基准测试在跟踪LVLMs发展方面存在不足。为了填补这一空白&#xff0c;本文介绍了MMT-Bench&#xff0c;这是一个全面的…

Django 模版继承

1&#xff0c;设计母版页 Test/templates/6/base.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><!-- 修正了模板标签的全角字符问题 -->{% block title %}<title>这个是母版页</title>{…

leetCode.93. 复原 IP 地址

leetCode.93. 复原 IP 地址 题目思路&#xff1a; 代码 // 前导零的判断方法&#xff1a;如果第一个数是0&#xff0c;且第二个数还有数据&#xff0c;那就是前导0&#xff0c;要排除的 // 注意跟单个 0 区分开 class Solution { public:vector<string> res;vector<…

Opencv+python模板匹配

我们经常玩匹配图像或者找相似&#xff0c;opencv可以很好实现这个简单的小功能。 模板是被查找目标的图像&#xff0c;查找模板在原始图像中的哪个位置的过程就叫模板匹配。OpenCV提供的matchTemplate()方法就是模板匹配方法&#xff0c;其语法如下&#xff1a; result cv2.…

【活动感想】筑梦之旅·AI共创工坊 workshop 会议回顾

目录 &#x1f30a;1. 会议详情 &#x1f30a;2. 会议回顾 &#x1f30d;2.1 主持人开场 &#x1f30d;2.2 元甲-小当家 AI 驱动的创意儿童营养早餐料理机&今天吃什么App &#x1f30d;2.3 Steven- A l 心理疗愈认知 &#x1f30d;2.4 伯棠-诸子百家(xExperts)-多智能…

私有部署Twikoo评论系统

原文&#xff1a;https://blog.c12th.cn/archives/12.html 前言 以前用 MongoDB Vercel 搭建 Twikoo 老是有点小问题&#xff0c;所以就放弃了。无意中看到可以用 docker 来搭建&#xff0c;正好有台服务器可以尝试下。 私有部署 Twikoo 版本要求 1.6.0 或以上 &#xff0c; …

AMD Anti-Lag 2抗延迟技术落地 CS2首发、延迟缩短95%

AMD发布了全新重磅驱动程序Adrenalin 24.6.1版本&#xff0c;包括首发落地Anti-Lag 2抗延迟技术、优化支持新游戏、升级支持HYPR-Tune、支持新操作系统、优化AI加速与开发、扩展支持Agility SDK、修复已知Bug&#xff0c;等等。 一、Anti-Lag 2 今年5月份刚宣布&#xff0c;重…

【计算机毕业设计】基于Springboot的智能物流管理系统【源码+lw+部署文档】

包含论文源码的压缩包较大&#xff0c;请私信或者加我的绿色小软件获取 免责声明&#xff1a;资料部分来源于合法的互联网渠道收集和整理&#xff0c;部分自己学习积累成果&#xff0c;供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

信号与系统-实验6-离散时间系统的 Z 域分析

一、实验目的 1、掌握 z 变换及其性质&#xff1b;了解常用序列的 z 变换、逆 z 变换&#xff1b; 2、掌握利用 MATLAB 的符号运算实现 z 变换&#xff1b; 3、掌握利用 MATLAB 绘制离散系统零、极点图的方法&#xff1b; 4、掌握利用 MATLAB 分析离散系统零、极点的方法&a…

kicad第三方插件安装问题

在使用KICAD时想安装扩展内容&#xff0c;但是遇到下载失败&#xff0c;因为SSL connect error。 因为是公司网络&#xff0c;我也不是很懂&#xff0c;只能另寻他法。找到如下方法可以曲线救国。 第三方插件包目录 打开存放第三方插件存放目录&#xff0c;用于存放下载插件包…

vue3+vite+nodejs,通过接口的形式请求后端打包(可打包全部或指定打包组件)

项目地址https://gitee.com/sybb011016/test_build 打包通过按钮的形式请求接口&#xff0c;让后端进行打包&#xff0c;后端使用express-generator搭建模版。前端项目就在npm init vuelatest基础上添加了路由 如果只想打包AboutView组件&#xff0c;首先修改后端接口。 //打…

Linux如何安装openjdk1.8

文章目录 Centosyum安装jdk和JRE配置全局环境变量验证ubuntu使用APT(适用于Ubuntu 16.04及以上版本)使用PPA(可选,适用于需要特定版本或旧版Ubuntu)Centos yum安装jdk和JRE yum install java-1.8.0-openjdk-devel.x86_64 安装后的目录 配置全局环境变量 vim /etc/pr…