首页 > 解决方案 > 将参数传递给 DAX 查询报表生成器

问题描述

我需要一些帮助。下面是我从 Power BI 复制到 Power BI Report Builder 的 DAX 查询。我希望将参数传递到此查询中以获取“edw dim_paycom_amcs_location_xref”[Paycom_Location_Desc]。但是,我不确定将其放在查询中的哪个位置。我已经对此进行了研究,无论我尝试将它放在哪里,我都会收到错误。有人能帮忙吗?非常感谢。

      // DAX Query
DEFINE
  VAR __DS0FilterTable = 
    TREATAS({"2021"}, 'edw dimDate'[Year])

  VAR __DS0FilterTable2 = 
    TREATAS({"August"}, 'edw dimDate'[MonthName])

  VAR __DS0Core = 
    SUMMARIZECOLUMNS(
      'edw dimDate'[MonthYear],
      'edw dimDate'[Month],
      'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc],
      __DS0FilterTable,
      __DS0FilterTable2,
      "SumOvertime_Hours_by_Day", CALCULATE(SUM('PaycomHours'[Overtime_Hours_by_Day])),
      "SumReg_Hours_by_Day", CALCULATE(SUM('PaycomHours'[Reg_Hours_by_Day])),
      "Transportation", 'PaycomHours'[Transportation],
      "Total_Inbound_Tons", 'PaycomHours'[Total Inbound Tons],
      "Total_Inbound_Tons__excl_Yakima_", 'PaycomHours'[Total Inbound Tons (excl Yakima)],
      "No_Operating_Days", 'edw dimDate'[No.Operating Days],
      "Tonnage_Inbound__3rd_Party", 'PaycomHours'[Tonnage Inbound- 3rd Party],
      "Tonnage_Inbound__Intercompany", 'PaycomHours'[Tonnage Inbound- Intercompany],
      "Tonnage_Inbound___3rd_Party_Metal", 'PaycomHours'[Tonnage Inbound - 3rd Party Metal],
      "Tonnage___Intercompany_Metal", 'PaycomHours'[Tonnage - Intercompany Metal],
      "Tonnage___Intercompany_Hog_Fuel", 'PaycomHours'[Tonnage - Intercompany Hog Fuel],
      "Tonnage___3rd_Party_Hog_Fuel", 'PaycomHours'[Tonnage - 3rd Party Hog Fuel],
      "Total_Commodities_Volume_Sold", 'PaycomHours'[Total Commodities Volume Sold],
      "Tonnage___Intercompany_Cardboard", 'PaycomHours'[Tonnage - Intercompany Cardboard],
      "Tonnage___Intercompany_ALL", 'PaycomHours'[Tonnage - Intercompany ALL],
      "Tonnage___3rd_Party_ALL", 'PaycomHours'[Tonnage - 3rd Party ALL]
    )

  VAR __DS0PrimaryWindowed = 
    TOPN(
      501,
      __DS0Core,
      'edw dimDate'[Month],
      1,
      'edw dimDate'[MonthYear],
      1,
      'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc],
      1
    )

EVALUATE
  __DS0PrimaryWindowed

ORDER BY
  'edw dimDate'[Month],
  'edw dimDate'[MonthYear],
  'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc]

标签: parameter-passingdax

解决方案


我在报表生成器中使用 DAX 的参数时遇到了很多困难。根据您的需求,有几种不同的方法。

第一个问题,你需要用户能够改变参数的值吗?如果是这样,您需要在报告数据的“参数”下定义它。

接下来,无论您之前的答案如何,您都需要在数据集中定义参数。数据集属性窗口的屏幕截图显示名为 MonthDS 的参数映射到值 [@Month] 和名为 CustomerDS 的参数映射到值 [@Customer]。 如果您使用的是用户可选择的参数,请使用 [@User_Parameter_Name] 的屏幕截图中显示的符号。如果你点击进入函数编辑器,你会看到这对应于 VB.Net 表达式=Parameters!User_Parameter_Name.Value

第二个问题是您是否将查询直接输入到数据集属性的查询框中。如果您只是将 PBI 中的 DAX 粘贴到该框中,那么您应该很高兴。

但是,如果您使用的是查询设计器(如果您不使用,我不能怪您),那么您需要按照您已经发现的那样做,并在查询设计器中重新声明参数。 查询设计器查询参数窗口的屏幕截图,其中声明了一个名为 MonthQP 的参数 这里的查询参数的问题是,他们真的很难默认为空值......此外,当我有一个参数时,查询设计器似乎总是忘记我每次打开它时使用的是 DAX 而不是 MDX。

但无论如何,一旦您在此处声明它,您就可以在查询本身中引用它们。

最后,如果您需要传递一个值列表而不是单个值,我让它工作的唯一方法是使用这个奇怪的、文档很少的函数 RSCustomDaxFilter 来创建一个过滤表:

 VAR MonthFilter= 
    SUMMARIZECOLUMNS (
        'Month'[Month],
        RSCustomDaxFilter(@MonthQP,EqualToCondition, [Month].[Month], String
        )

我可以对这个函数的工作原理做出一些推断;Table.Field 语法和指定对象类型让我认为至少是在 VB.Net 之后建模的,但是除了在几乎只有这种确切情况下如何使用它的示例之外,我还没有找到任何关于它如何工作的官方文档,最好的解释来自Chris Webb 的博客,早在 2019 年。此外,如果您不使用查询设计器,它喜欢在执行查询准备时冻结!


推荐阅读