LOOKUPVALUE()
时,不应用RLS并且看到所有值我要求根据用户在Power BI报告中选择“默认”值(位置)。
我正在报告Azure Analysis Services(表格模型1400)
在Power BI中实现默认值的方法似乎是将值动态重命名为静态值,并将该静态值选为过滤器。
所以
诀窍是,他们可以选择另一个位置,看看是否喜欢
我尝试的第一件事是直接在行级表达式上使用USERPRINCIPALNAME()
,但我得到了
...计算的表/列不支持USERNAME和USERPRINCIPALNAME函数。这些函数只能用于度量或AllowedRowsExpression
接下来我想我会将RLS应用到另一个表中,然后查看,如下所示:
我从数据库加载了一个名为Location
的表,列出了所有位置。
我有一个名为MyLocation
的独立表,它是Location
的副本。使用此DAX生成MyLocation
:
=SUMMARIZE(Location,Location[LocationKey],Location[Location Name])
(注意我还尝试了一个基于数据的表,而不是基于DAX的表)
MyLocation
还具有动态行级安全性,如下所示:
=(
[LocationKey]
=
LOOKUPVALUE(
'Employee[LocationKey],
'Employee'[UserPrincipalName],
USERPRINCIPALNAME())
)
当我在Power BI中查看MyLocation
时,我可以看到应用了RLS - 只能看到一个位置。这与Location
形成对比,在Location
,我可以看到所有位置(没有定义RLS)
接下来,我在=LOOKUPVALUE(
'MyLocation'[Location Name],
'MyLocation'[LocationKey],
'Location'[LocationKey]
)
中添加了一个列(行级表达式),然后选择使用行级安全性评估的“单个”位置:
Location
==========================
Location 3 Location 3
它在LocationKey上匹配,但对于已通过RLS删除的记录,应该没有匹配。
但是,当我测试最后一列时,会忽略RLS,并且所有位置都会通过。
我可以在Power BI中看到我面前的两张桌子:
MyLocation 如下所示: (已应用RLS)
Location LookupValue
==========================
Location 1 Location 1
Location 2 Location 2
Location 3 Location 3
Location 4 Location 4
Location 5 Location 5
...........
....
位置如下所示: (没有应用RLS,但为什么其他位置不是空白?)
Location LookupValue
==========================
Location 1 blank
Location 2 blank
Location 3 Location 3
Location 4 blank
Location 5 blank
...........
....
我希望位置看起来像这样:
USERPRINCIPALNAME()
所以看来无论你使用什么技巧,你都不能在一行上使用USERPRINCIPALNAME()。
我也尝试将SELECTEDVALUE
定义为度量并使用它但也失败了(现在不记得错误,但我也会重试)
我还尝试使用'独立参数'表来使用ISFILTERED
打开和关闭RLS,但是参数表中的过滤值永远不会出现。尽管该表已被过滤,但# load dataframe to df
df = pd.Dataframe()
# set threshold for the price
limit_price = x
# collect difference of prices as a list
diff_prices = []
# loop through dataframe df
for index, row in df.iterrows():
# row is pd.Series now, check if it pass certain point here
if row.prices > limit_price:
# if pass find the diff of this row and 30 row ahead of it
# and then add to a list
diff_prices.append(row.prices - df.iloc[index+30].prices)
else:
# if not pass add 0 to a list instead
diff_prices.append(0)
始终返回false。
答案 0 :(得分:1)
根据我的理解,Lookup [LookupValue]是一个列(不是一个度量),使用你的第三个代码片段:“= LOOKUPVALUE(...”
刷新模型时,实现了计算列的结果。它们不受RLS的影响,RLS在查询时应用,就在计算度量之前。
这不是特定于LOOKUPVALUE函数。
答案 1 :(得分:0)
我明白你的意思了。 LOOKUPVALUE
似乎已绕过RLS对您的表进行了未经过滤的访问。我建议将此报告给Microsoft作为错误。
在你的报告中,我建议使用这种形式的措施:
Measure =
VAR EmployeeLocation =
LOOKUPVALUE(Employee[LocationKey],
Employee[UserPrincipalName],
USERPRINCIPALNAME())
RETURN IF(ISFILTERED(Location[Location]),
<expression>,
CALCULATE(<expression>,
FILTER(Location, Location[LocationKey] = EmployeeLocation)))
这样,当EmployeeLocation
未经过滤时,它应该默认计算Location
的值,否则会正常运行。