加入 PowerBI自己学 知识星球:下载源文件,边学边练;遇到问题,提问交流,有问必答。
在使用了行级别权限的报告中,会按照用户角色通过设定权限的表的实线关系筛选模型。如果这个设定权限的表上有实线关系也有虚线关系,在度量值中使用USERELATIONSHIP来切换调用虚线关系的时候,对于不受行级别权限影响的报告开发者和用户,不会遇到问题;发布报告给有角色权限的用户后,会出现如下报错:无法使用UseRelationship()和CrossFilter()函数,因为它受行级别安全性的约束。
举例
张三是销售人员,负责分部客户C,还负责总部客户总部一,报告中需要体现张三负责的分部客户的购进,也需要体现他负责的总部客户的购进,总部客户的购进等于总部对应的所有分部客户购进之和。
人员客户表
销量表
模型
角色权限
度量值
分部购进:
Sales_分部 = SUM('销售表'[销量])
总部购进,使用USERELATIONSHIP:
Sales_总部 = CALCULATE(SUM('销售表'[销量]), USERELATIONSHIP('人员客户表'[客户], '销售表'[总部客户]))
不使用行级别权限时,度量值显示正常。
以张三的角色查看,张三只能看到C客户的分部购进,总部购进的度量值会报错。
解决方案
行级别权限沿着实线关系去筛选数据,度量值使用USERELATIONSHIP调用虚线关系,两条关系筛选同一个表就会产生冲突。微软描述如下:
首先,需求是张三可以看到自己负责的分部客户的销售数据,同时也可以看到他负责的总部客户对应的销售数据,这是个并集的需求。所以,我们需要按照客户和客户总部同时给张三配置权限。
其次,在总部购进的度量值中,使用ALL清除实线关系,并使用TREATAS建立虚拟关系,替换USERELATIONSHIP。
操作步骤
STEP 1 在人员客户表中新建计算列,通过CALCULATE+VALUES+FILTER为客户总部找到其对应的人员。
总部人员 =
CALCULATE(
VALUES('人员客户表'[人员]),
FILTER('人员客户表','人员客户表'[客户]=EARLIER('人员客户表'[客户总部]))
)
STEP 2 设置行级别权限。点击菜单栏建模下的管理角色,角色名称改为张三,在人员客户表中做筛选,规则选任何取并集,人员等于张三或总部人员等于张三。
STEP 3 书写总部购进度量值。通过ALL清除人员客户表对销量表的实线关系,然后通过TREATAS建立虚拟关系,让人员客户表的客户筛选销量表的客户总部。
Sales_总部_TREATAS =
CALCULATE(SUM('销量表'[销量]),
ALL('人员客户表'),
TREATAS(VALUES('人员客户表'[客户]),'销量表'[客户总部])
)
点击菜单栏建模下的通过以下身份查看,选择张三,分部购进和总部购进的度量值正常显示。
拓展
复制一份销量表,作为总部客户的销量表,通过客户总部与人员客户表建立实线关系,也能达到目的,但是这种方案会带来冗余数据,尤其是事实表通常行数比较多,不推荐这样做,事实表小可以考虑。