将参数传递给 DAX 查询报表生成器

问题描述 投票:0回答:3

我需要一些帮助。 下面是我从 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-passing dax
3个回答
3
投票

我建议如下:

DEFINE
    VAR __DS0FilterTable =
        TREATAS ( { "2021" }, 'edw dimDate'[Year] )
    VAR __DS0FilterTable2 =
        TREATAS ( { "August" }, 'edw dimDate'[MonthName] )
    VAR __DS0FilterTable3 =
        TREATAS ( { @Location }, 'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc] )
    VAR __DS0Core =
        SUMMARIZECOLUMNS (
            'edw dimDate'[MonthYear],
            'edw dimDate'[Month],
            'edw dim_paycom_amcs_location_xref'[Paycom_Location_Desc],
            __DS0FilterTable,
            __DS0FilterTable2,
            __DS0FilterTable3,
            [... Remainder of query the same ...]

请务必将

@Location
映射到您的报告参数:

Dataset Properties screenshot


3
投票

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

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

接下来,无论您之前的答案如何,您都需要在数据集中定义参数。 Screenshot of Dataset Properties Window showing a parameter named MonthDS mapped to a value of [@Month] and a parameter named CustomerDS mapped to a value of [@Customer]. 如果您使用的是用户可选择的参数,请使用 [@User_Parameter_Name] 屏幕截图中显示的符号。 如果您点击函数编辑器,您将看到它对应于 VB.Net 表达式

=Parameters!User_Parameter_Name.Value

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

但是,如果您正在使用查询设计器(如果您不使用,我也不能责怪您),那么您需要按照您已经发现的方式进行操作,并在查询设计器中重新声明参数。 Screenshot of Query Designer Query Parameters window with a parameter declared named MonthQP 这里查询参数的问题在于,它们确实很难默认为空值...此外,当我有一个参数时,查询设计器似乎总是忘记我每次打开它时使用的是 DAX 而不是 MDX。

但无论如何,一旦你在这里声明它,那么你就可以在查询本身中引用它们。

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

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

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


1
投票

我使用的 DAX 模式示意图。 无需使用 RSCustomDaxFilter 函数,因此您可以使用 DaxStudio 来处理您的查询。 哈利路亚:}

/*  
History
    yyyymmdd  aa  build

Datasets
    abbrev = workspace.dataset.table

Notes    
    + etc
*/

EVALUATE

-- parse the parameter value lists ready for the main querys
VAR ParameterA = SUBSTITUTE (TRIM (SUBSTITUTE (@ParameterA, ",", "|")), "| ", "|" )


-- build the lists
VAR TableA =
    FILTER (
        SELECTCOLUMNS (
            'table',
            "column a", 'table '[column a],
            "column b", 'table '[column b],
            etc
        ),

        -- column a,  ParameterA
        SWITCH (
            TRUE (),
            LEN (ParameterA) = 0,             TRUE (),   -- ignore
            PATHCONTAINS (ParameterA, "All"), TRUE (),   -- ignore   

            IF ( PATHCONTAINS ( ParameterA, "NA" ),   -- NA parameter selection
                IF ( [column a] IN 
                         {"NA",
                          "0",
                          "Not Applicable",
                          "Select",
                          " ", 
                          "",  
                          BLANK()}, 
                     TRUE (),   -- NA value found
                     IF ( PATHCONTAINS ( ParameterA, [column a] ), 
                          TRUE (),   -- direct match found
                          FALSE ()   -- out of scope condition
                     ) 
                ),
                FALSE ()   
            ),
            TRUE (),

            PATHCONTAINS ( ParameterA, [column a] ), TRUE (),
            FALSE ()   
        )  && 

    etc
    )

VAR TableB =
    etc


-- join the lists
VAR Result =
    NATURALINNERJOIN (TableA, TableB)

RETURN 
    Result
    --ROW ( "ParameterA", """"& ParameterA &"""" )   -- parameter checker  

ORDER BY   
    [column a] ASC,
    [column b] ASC


/* testing framework daxstudio */
<Parameters etc
  <Parameter>
    <Name></Name>
    <Value xsi:type="xsd:string"></Value>   
  </Parameter>
etc
</Parameters>

参数dax查询示例(部门),上面的模式是你的主要dax查询。

DEFINE
    -- create summary table
    VAR SummaryTableUnique = 
        -- distinct list of values, excluding 'blank's
        FILTER (
            DISTINCT (
                VALUES ( 'Measure Benefit Master'[Dept ID] )
            ),
            NOT [Dept ID] IN {
                "NA",
                "0",
                "Not Applicable",
                "Select",
                " ", 
                "",  
                BLANK()
            }   
        )
    -- add sorting column
    VAR SummaryTable = 
        ADDCOLUMNS (
            SummaryTableUnique, 
            "Sort", 1
        )

    -- create All row
    VAR AllTable =
        DATATABLE (
            "Dept ID", STRING,
            "Sort", INTEGER,
            {
                { "All", 0 }
            }
        )

    -- create NA row
    VAR NATable =
        DATATABLE (
            "Dept ID", STRING,
            "Sort", INTEGER,
            {
                { "NA", 0 }
            }
        )

    -- sandwich together
    VAR UnionTable1 = UNION ( SummaryTable, AllTable )   -- keep data lineage by doing SummaryTable first 
    VAR UnionTable2 = UNION ( UnionTable1, NATable )    

EVALUATE
    UnionTable2

ORDER BY 
    [Sort] ASC,   -- sort All, NA first then all others
    [Dept ID] ASC

enter code here
© www.soinside.com 2019 - 2024. All rights reserved.