[知识体系] 规范化DAX代码

  [复制链接]
查看100518 | 回复114 | 2021-2-21 19:36:29 | 显示全部楼层 |阅读模式
无格式化 不 DAX

在继续介绍 DAX 语言之前, 有必要介绍一个 DAX 非常重要的知识:代码的格式化。DAX 是一门函数语言, 这意味着无论它多么复杂,表达式始终调用的是携带参数的单个函数。DAX 的复杂性体现在最外层函数使用的参数表达式的复杂性


因此,看到超过 10 行甚至更多的表达式是很正常的。看到 20 行的 DAX 表达也并不奇怪,你会慢慢熟悉这种代码量级的公式。然而,随着公式的长度和复杂度增加,学习如何格式化代码是非常重要的,只有这样代码才具有可读性。


DAX 的格式化没有“官方”标准,但是目前已经有一套约定速成的格式化规则。虽然它并非完美,甚至你可以按自己的习惯格式化。但需要记住的唯一一准则是:“格式化代码,不要把所有的东西都写在一行上,否则你会很快掉到坑里。”






为了理解格式化代码的重要性,这里展示一个使用时间智能函数的公式。这是一个有点复杂的公式,但还不是最复杂的。如果不对表达式做格式化,你会看到下面的样子:

  1. IF (COUNTX (BalanceDate, CALCULATE (COUNT(Balances[Balance]), ALLEXCEPT ( Balances, BalanceDate[Date] ))) > 0, SUMX (ALL ( Balances[Account] ), CALCULATE (SUM( Balances[Balance] ), LASTNONBLANK (DATESBETWEEN (BalanceDate[Date], BLANK(),LASTDATE(BalanceDate[Date] )), CALCULATE ( COUNT( Balances[Balance]))))), BLANK ())
复制代码


试图理解这个公式几乎是不可能的,因为你不知道哪个才是最外层的函数、也无法搞清除 DAX 是如何计算不同的参数来创建完整计值流的。我们已经见过太多这样的例子,客户把这种公式丢给我们询问为什么会返回不正确的结果。你猜怎么着?我们做的第一件事是格式化;然后才开始进入正题。


同样的表达式在适当格式化后是这样的:

  1. =
  2. IF (
  3.     COUNTX (
  4.         BalanceDate,
  5.         CALCULATE (
  6.             COUNT ( Balances[Balance] ),
  7.             ALLEXCEPT (
  8.                 Balances,
  9.                 BalanceDate[Date]
  10.             )
  11.         )
  12.     ) > 0,
  13.     SUMX (
  14.         ALL ( Balances[Account] ),
  15.         CALCULATE (
  16.             SUM ( Balances[Balance] ),
  17.             LASTNONBLANK (
  18.                 DATESBETWEEN (
  19.                     BalanceDate[Date],
  20.                     BLANK (),
  21.                     LASTDATE ( BalanceDate[Date] )
  22.                 ),
  23.                 CALCULATE (
  24.                     COUNT ( Balances[Balance] )
  25.                 )
  26.             )
  27.         )
  28.     ),
  29.     BLANK ()
  30. )
复制代码


还是相同的代码,但这一次更容易定位 IF 的三个参数,以及最重要的,遵循缩进自然产生的代码块,它们组成了完整的计值流。是的,代码仍然很难读懂,但是现在的问题是 DAX 的逻辑,而不再是格式。

DAXFormatter.com

Marco 和 Alberto 创建了一个专门用于格式化 DAX 代码的网站。该网站面向公众开放使用,以便用户能够格式化自己的 DAX 代码。因为格式化代码是一项耗时的操作,开发者不希望人们将时间花在格式化每个公式上。


格式化 DAX 代码的规则有以下这些,其中的第二条和第三条也是你在书写 DAX 的时候应当遵循的标准:

  • 像 IF, COUNTX, CALCULATE 这样的关键字总是用空格分隔,并保持大写。
  • 所有列引用都使用表名[列名]的形式,表名和方括号之间没有空格,表名是必须的
  • 所有度量值引用都以[度量值名称]的形式编写,不添加表名
  • 在逗号后面使用空格,并且空格不能出现在逗号之前。
  • 如果公式只有一行,那么就不需要应用其他规则。
  • 如果公式有多行,那么
  •        函数名单独位于一行,带有左括号。
  •        所有参数都在单独的行中,用四个空格缩进,表达式末尾用逗号分隔。
  •        右括号与函数调用对齐,单独一行。


查阅更详细的规则列表可以访问这里

格式化 DAX 的一些帮助

对 DAX 进行格式化并不容易,因为你需要在文本框中使用小字体来书写。根据版本的不同,Power BI、Excel 和 Visual Studio 为 DAX 提供了不同的文本编辑器。不过,下面的提示可能有助于你编写 DAX 代码:

  • 如果想要增加字体大小,可以按住 Ctrl 键,同时使用鼠标滚轮放大,使查看代码更容易。
  • 如果要在公式中添加新行,可以按 Shift+Enter 键。
  • 如果你感觉在文本框中进行编辑真的很痛苦,那么你可以复制代码到另一个编辑器,比如 Notepad,最后在文本框中再次粘贴公式。

适用于 Power BI Desktop 编辑器的快捷键


键盘命令结果
Ctrl+C复制行(空选)
Ctrl+G转到行…
Ctrl+I选择当前行
Ctrl+M切换 tab 键移动焦点
Ctrl+U撤消上一个光标操作
Ctrl+X剪切行(空选)
Ctrl+Shift+Enter在上方插入行
Alt+Enter在下方插入行(不缩进)
Shift+Enter在下方插入行(缩进)
Ctrl+Shift+\跳转到匹配的括号
Ctrl+Shift+K删除行
Ctrl+] / [向右缩进/向左缩进
Ctrl+Home转到文件开头
Ctrl+End转到文件结尾
Ctrl+↑ / ↓向上/向下滚动行
Ctrl+Shift+Alt+(箭头键)列(框)选择
Ctrl+Shift+Alt +PgUp/PgDn上翻/下翻列(框)选择页面
Ctrl+Shift+L为所选内容突出显示所有的匹配项,批量编辑
Ctrl+Alt+ ↑ / ↓在上方/下方插入光标,同时编辑多行
Ctrl+F2选择当前词语的所有匹配项
Shift+Alt+(拖动鼠标)列(框)选择
Shift+Alt + ↓ / ↑向上/向下复制行
Shift+Alt+→展开所选内容
Shift+Alt+←收缩选定内容
Shift+Alt+I将光标插入所选每行的末尾
Alt+ ↑ / ↓向上/向下移动选中的行
Alt+PgUp / PgDn向上/向下滚动页面
Alt+Click插入光标
Home / End 键转到行的开头/结尾


现在,Excel 和 Power BI Desktop 用户可以使用 DAX Studio 格式化代码,Visual Studio 用户可以安装 DAX Editior 工具格式化代码。工具使用及更多介绍可以访问这里

区分计算列和度量值



当你第一次看到一个 DAX 表达式时,你很难理解它是一个计算列还是一个度量值。因此,出于增强辨识度的目的,我们使用赋值运算符(:=)定义度量值,使用等号(=)定义计算列:
CalcCol = SUM ( Sales[SalesAmount] ) — 是计算列
Store[CalcCol] = SUM ( Sales[SalesAmount] ) — 是 Store 表中的计算列
CalcMsr := SUM ( Sales[SalesAmount]  ) — 是度量值
最后,也是非常重要的一点,在代码中引用列和度量时,强烈建议始终将表名放在列之前,比如 Table[Column Name],在度量值之前不添加任何表名,比如[Measure Name]。网站的所有文章都会贯彻这个规范

回复

使用道具 举报

qqboy | 2021-4-24 11:25:48 | 显示全部楼层
不错 支持下
回复

使用道具 举报

kevin | 2021-6-4 06:07:26 | 显示全部楼层
秀起来~
回复

使用道具 举报

kawana55 | 2021-8-8 07:14:59 来自手机 | 显示全部楼层
边撸边过
回复

使用道具 举报

zgfzgf | 2021-8-23 15:35:56 | 显示全部楼层
回个帖子,下班咯~
回复

使用道具 举报

johnnyplay | 2021-8-27 18:01:53 来自手机 | 显示全部楼层
确实不错,顶先
回复

使用道具 举报

amwaylee | 2021-10-15 17:44:13 | 显示全部楼层
前排顶,很好!
回复

使用道具 举报

owo | 2021-12-2 22:07:35 来自手机 | 显示全部楼层
前排支持下
回复

使用道具 举报

17cm | 2021-12-9 12:51:27 来自手机 | 显示全部楼层
我也来支持一下,这里的老师和其他机构不一样,其他就是让付费。
回复

使用道具 举报

zhouli31894 | 2021-12-12 21:33:56 来自手机 | 显示全部楼层
楼猪V5啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则