Power BI中的默认过滤器 - 未通过LOOKUPVALUE

时间:2018-03-04 02:48:34

标签: powerbi dax ssas-tabular azure-analysis-services

TL; DR:对具有行级安全性的表使用LOOKUPVALUE()时,不应用RLS并且看到所有值

我要求根据用户在Power BI报告中选择“默认”值(位置)。

我正在报告Azure Analysis Services(表格模型1400)

在Power BI中实现默认值的方法似乎是将值动态重命名为静态值,并将该静态值选为过滤器。

所以

  • 用户 Bob 的默认位置 Location1 所以当他登录时应该会看到他的位置
  • 用户 Joe 拥有默认位置 Location2 ,因此应在此位置对其进行过滤

诀窍是,他们可以选择另一个位置,看看是否喜欢

我尝试的第一件事是直接在行级表达式上使用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。

2 个答案:

答案 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的值,否则会正常运行。