当 RLS 打开时,DAX 度量不起作用 - 连接路径应形成树
DAX measure not working when RLS is turned on - Join paths are expected to form a tree
在 Power BI 中,当 RLS 开启时,我的测量出现以下错误(当 RLS 关闭时,此错误不显示):
Join paths are expected to form a tree but the table has two join paths
这些是模型中的相关关系:
我有一段不活跃的关系。这种不活跃的关系被用在有问题的措施中。但由于它处于非活动状态,我认为这不会成为问题?措施是:
TTipsInvs =
VAR SalesValue =
CALCULATE (
SUM ( ANSAPBICustomerTransDetailed[Outstanding] ),
USERELATIONSHIP ( 'ANSAPBICustomerTransDetailed'[SiteID], ANSAPBISites[Site ID] )
)
RETURN
IF ( ISBLANK ( SalesValue ), 0, ( SalesValue ) )
打开 RLS 时有什么方法可以避免这个问题?
为大家的帮助干杯
做了一个快速测试:
这看起来不需要启用或禁用关系就可以工作。
RLS 之前:
RLS 之后:
TTipsInvs =
VAR SiteID =
CALCULATETABLE (
VALUES ( ANSAPBISites[Site ID] ) )
VAR SalesValue =
CALCULATE (
SUM ( ANSAPBICustomerTransDetailed[Outstanding] ),
TREATAS ( SiteID, 'ANSAPBICustomerTransDetailed'[SiteID] ) )
RETURN
IF ( ISBLANK ( SalesValue ), 0, ( SalesValue ) )
我想补充 @user9824134 的回答,不幸的是没有太多解释(无法编辑)。
为什么 TREATAS
:
- docs 说明此函数将第一个参数 (
clientID
) 的结果应用于第二个参数 ('ANSAPBICustomerTransDetailed'[SiteID]
) 中的列
为什么这有效:
- 不太确定 RLS 如何强制执行联合路径,但 @asp8811 解释的“永远在线”的想法对我来说很有意义。
- 在这种情况下,
TREATAS
基本上可以替代 CROSSFILTER
。通过在 ANSAPBICustomerTransDetailed
table 的 SiteID
列上应用 clientID
过滤器,它正在模拟 CROSSFILTER
.
- 我必须测试效率,但我怀疑性能应该与
VALUES
相似,已经只有 returns 一个不同的列表。
下面的方法也有效,而且更短。如果未向 CALCULATETABLE
表达式传递过滤器,则表达式不执行任何操作,因此只需使用 VALUES
就足够了。
TTipsInvs =
VAR clientID = VALUES ( ANSAPBISites[Site ID] )
VAR SalesValue =
CALCULATE (
SUM ( ANSAPBICustomerTransDetailed[Outstanding] ),
TREATAS ( clientID, 'ANSAPBICustomerTransDetailed'[SiteID] ) )
RETURN
IF ( ISBLANK ( SalesValue ), 0, ( SalesValue ) )
在 Power BI 中,当 RLS 开启时,我的测量出现以下错误(当 RLS 关闭时,此错误不显示):
Join paths are expected to form a tree but the table has two join paths
这些是模型中的相关关系:
我有一段不活跃的关系。这种不活跃的关系被用在有问题的措施中。但由于它处于非活动状态,我认为这不会成为问题?措施是:
TTipsInvs =
VAR SalesValue =
CALCULATE (
SUM ( ANSAPBICustomerTransDetailed[Outstanding] ),
USERELATIONSHIP ( 'ANSAPBICustomerTransDetailed'[SiteID], ANSAPBISites[Site ID] )
)
RETURN
IF ( ISBLANK ( SalesValue ), 0, ( SalesValue ) )
打开 RLS 时有什么方法可以避免这个问题?
为大家的帮助干杯
做了一个快速测试: 这看起来不需要启用或禁用关系就可以工作。
RLS 之前:
RLS 之后:
TTipsInvs =
VAR SiteID =
CALCULATETABLE (
VALUES ( ANSAPBISites[Site ID] ) )
VAR SalesValue =
CALCULATE (
SUM ( ANSAPBICustomerTransDetailed[Outstanding] ),
TREATAS ( SiteID, 'ANSAPBICustomerTransDetailed'[SiteID] ) )
RETURN
IF ( ISBLANK ( SalesValue ), 0, ( SalesValue ) )
我想补充 @user9824134 的回答,不幸的是没有太多解释(无法编辑)。
为什么 TREATAS
:
- docs 说明此函数将第一个参数 (
clientID
) 的结果应用于第二个参数 ('ANSAPBICustomerTransDetailed'[SiteID]
) 中的列
为什么这有效:
- 不太确定 RLS 如何强制执行联合路径,但 @asp8811 解释的“永远在线”的想法对我来说很有意义。
- 在这种情况下,
TREATAS
基本上可以替代CROSSFILTER
。通过在ANSAPBICustomerTransDetailed
table 的SiteID
列上应用clientID
过滤器,它正在模拟CROSSFILTER
. - 我必须测试效率,但我怀疑性能应该与
VALUES
相似,已经只有 returns 一个不同的列表。
下面的方法也有效,而且更短。如果未向 CALCULATETABLE
表达式传递过滤器,则表达式不执行任何操作,因此只需使用 VALUES
就足够了。
TTipsInvs =
VAR clientID = VALUES ( ANSAPBISites[Site ID] )
VAR SalesValue =
CALCULATE (
SUM ( ANSAPBICustomerTransDetailed[Outstanding] ),
TREATAS ( clientID, 'ANSAPBICustomerTransDetailed'[SiteID] ) )
RETURN
IF ( ISBLANK ( SalesValue ), 0, ( SalesValue ) )