美文网首页
2.5 格式化DAX代码

2.5 格式化DAX代码

作者: jweishan | 来源:发表于2020-02-26 01:00 被阅读0次

    第2章 DAX简介

    2.1 理解DAX计算
    2.2了解计算列和度量值
    2.3 变量入门
    2.4 表达式中的错误处理
    2.5 格式化DAX代码
    2.6 聚合函数和迭代函数
    2.7 使用常见的DAX函数

    格式化DAX代码

    在继续解释DAX语言之前,我们要介绍DAX的一个重要方面,即格式化代码。DAX是一种函数语言,这意味着无论它多么复杂,DAX表达式其实都像一个函数调用。代码的复杂性转化为用作最外层函数的参数的表达式的复杂性。

    因此,通常会看到超过10行或更多行的表达式,看到20行的DAX表达式也是家常便饭,对此您将不会陌生。但是,随着公式的长度和复杂性的增加,对代码进行格式化以使其易于阅读就显得非常重要。

    没有格式化DAX代码的"官方"标准,但是我们认为标准对格式化代码很重要。以下介绍的可能不是完美的标准,您可能会喜欢一些不同的东西,对此没有任何问题:找到最佳标准并使用它。您唯一需要记住的是:格式化代码,永远不要在一行上编写所有内容;否则,您将比预期更早陷入麻烦。

    为了理解格式化为何如此重要的原因,来看一个时间智能计算的公式,这个公式有点复杂,但远不是最复杂的公式。如果不以某种方式设置表达式的格式,则它的样子如下:

    IF(CALCULATE(NOT ISEMPTY(Balances), ALLEXCEPT
    (Balances, BalanceDate)),SUMX (ALL(Balances
    [Account]), CALCULATE(SUM
    (Balances[Balance]),LASTNONBLANK(DATESBETWEEN(BalanceDate[Date],
    BLANK(),MAX(BalanceDate[Date])),CALCULATE(COUNTROWS(Balances))))),BLANK())
    

    现在这个样子,要试图了解该公式计算的内容几乎是不可能的。没有最外层函数的线索,以及DAX如何评估不同的参数,创建完整的执行流程。我们已经看到了太多学生编写出这样的公式,他们有时会寻求我们的帮助,以了解为什么公式返回错误的结果,你猜怎么了?我们要做的第一件事,就是格式化表达式,完成以后我们才开始研究它。同一表达式正确格式化后如下所示:

    IF (
        CALCULATE (
            NOT ISEMPTY ( Balances ),
            ALLEXCEPT (
                Balances,
                BalanceDate
            )
        ),
        SUMX (
            ALL ( Balances[Account] ),
            CALCULATE (
                SUM ( Balances[Balance] ),
                LASTNONBLANK (
                    DATESBETWEEN (
                        BalanceDate[Date],
                        BLANK (),
                        MAX ( BalanceDate[Date] )
                    ),
                    CALCULATE (
                        COUNTROWS ( Balances )
                    )
                )
            )
        ),
        BLANK ()
    )
    

    代码是相同的,但是这次更容易看到IF的三个参数。最重要的是,缩进线自然形成了功能块,更容易弄清完整的执行流程。该代码仍然很难阅读,但是现在的问题是DAX本身,而不是格式化做得差。更详细的使用变量的语法可以帮助您阅读代码,即使这样,格式化对于正确理解每个变量的范围也很重要:

    IF (
        CALCULATE (
            NOT ISEMPTY ( Balances ),
            ALLEXCEPT (
                Balances,
                BalanceDate
            )
        ),
        SUMX (
            ALL ( Balances[Account] ),
            VAR PreviousDates =
                DATESBETWEEN (
                    BalanceDate[Date],
                    BLANK (),
                    MAX ( BalanceDate[Date] )
                )
            VAR LastDateWithBalance =
                LASTNONBLANK (
                    PreviousDates,
                    CALCULATE (
                        COUNTROWS ( Balances )
                    )
                )
            RETURN
                CALCULATE (
                    SUM ( Balances[Balance] ),
                    LastDateWithBalance
                )
        ),
        BLANK ()
    )
    

    DAXFormatter.com
    我们创建了一个专门用于格式化DAX代码的网站。我们为自己创建此站点是因为格式化代码是一项耗时的操作,我们把时间花在了格式化自己写的每个公式上。当该工具可用时,我们决定将其捐赠给公共领域,以便用户可以格式化自己的DAX代码(顺便说一下,我们已经能够以此来推广我们的格式化规则)。

    您可以在以下网站找到:
    http://www.daxformatter.com/) [www.daxformatter.com](www.daxformatter.com

    用户界面很简单:只需复制DAX代码,单击FORMAT,页面就会刷新,显示格式良好的代码版本,然后可以将其复制并粘贴到原始窗口中。

    这是我们用来格式化DAX的一组规则:

    • 始终使用空格将函数名称(例如IFSUMXCALCULATE)与任何其他术语分开,并始终以大写形式书写。
    • 将所有列引用以TableName [ColumnName]的形式编写,表名和方括号之间没有空格。始终包含表名。
    • 将所有度量值引用以[MeasureName]的形式编写,没有任何表名。
    • 始终在逗号后使用空格,并且切勿在逗号前加空格。
    • 如果公式适合一行,请不要应用任何其他规则。
    • 如果公式不适合一行,则:
    • 将函数名称连同左括号单独放在一行上,
    • 将所有参数放在单独的行上,缩进四个空格,除了最后一个参数外,以逗号结尾。
    • 将右括号与调用的函数对齐,单独一行。

    这些是我们使用的基本规则。有关这些规则的详细列表,请访问:
    http://sql.bi/daxrules

    如果您找到一种最适合您的阅读方式的公式表达方法,请使用它。格式化的目的是使公式更易于阅读,因此请使用最适合您的技术。定义个人格式规则时要记住的最重要一点是,您始终需要能够尽快看到错误。象如前所述的未格式化代码中,如果缺少右括号,是很难发现错误所在的。在格式化的公式中,更容易看到每个右括号如何与调用函数的左括号匹配。

    格式化DAX提示:
    格式化DAX并非易事,因为通常我们在文本框中使用小字体编写DAX。Power BI,Excel和Visual Studio不同的版本为DAX提供不同的文本编辑器。以下这些提示有助于编写DAX代码。
    要增加字体大小,请在按住Ctrl的同时旋转鼠标上的滚轮按钮,以便更轻松地查看代码。
    要在公式中添加新行,请按Shift + Enter。
    如果您不适合在文本框中进行编辑,请将代码复制到另一个编辑器(如记事本或DAX Studio)中,然后将公式复制并粘贴回文本框中。
    当您查看DAX表达式时,乍一看可能很难理解它是计算列还是度量。因此,在我们的书和文章中,每当定义计算列时都使用等号(=),并使用赋值运算符(:=)定义度量值。

    CalcCol = SUM  ( Sales[SalesAmount] )        -- is a calculated  column
    Store[CalcCol] = SUM ( Sales[SalesAmount] )  -- is a calculated column in Store table
    CalcMsr := SUM  ( Sales[SalesAmount]  )      -- is a measure
    

    最后,就像我们在每个示例中一样,在代码中使用列和度量值时,我们建议总是将表名放在列之前,永远不要将表名放在度量值之前。

    相关文章

      网友评论

          本文标题:2.5 格式化DAX代码

          本文链接:https://www.haomeiwen.com/subject/lrmzqhtx.html