02.6 规范化DAX代码
# 规范化DAX代码
无格式化 不DAX 在继续介绍DAX语言之前, 有必要介绍一个DAX非常重要的知识:代码的格式化。DAX 是一门函数语言, 这意味着无论它多么复杂,表达式始终调用的是携带参数的单个函数。DAX的复杂性体现在最外层函数使用的参数表达式的复杂性。因此,看到超过10行甚至更多的表达式是很正常的。看到20行的DAX表达也并不奇怪,你会慢慢熟悉这种代码量级的公式。然而,随着公式的长度和复杂度增加,学习如何格式化代码是非常重要的,只有这样代码才具有可读性。DAX的格式化没有“官方”标准,但是目前已经有一套约定速成的格式化规则。虽然它并非完美,甚至你可以按自己的习惯格式化。但需要记住的唯一一准则是:“格式化代码,不要把所有的东西都写在一行上,否则你会很快掉到坑里。”坑为了理解格式化代码的重要性,这里展示一个使用时间智能函数的公式。这是一个有点复杂的公式,但还不是最复杂的。如果不对表达式做格式化,你会看到下面的样子: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是如何计算不同的参数来创建完整计值流的。我们已经见过太多这样的例子,客户把这种公式丢给我们询问为什么会返回不正确的结果。你猜怎么着?我们做的第一件事是格式化;然后才开始进入正题。同样的表达式在适当格式化后是这样的:=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())还是相同的代码,但这一次更容易定位IF的三个参数,以及最重要的,遵循缩进自然产生的代码块,它们组成了完整的计值流。是的,代码仍然很难读懂,但是现在的问题是DAX的逻辑,而不再是格式。## DAXFormatter.com Marco和Alberto创建了一个专门用于格式化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+Enter | 在下方插入行 | | Ctrl+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]。网站的所有文章都会贯彻这个规范