M365Con 2027 – бесплатная онлайн-конференция · 11–22 Jan 2027 · 120 sessions→ m365con.net

Блог · Mirko Peters

Разбираем DAX UDF: VAL против EXPR

By ·

С возвращением в блог-компаньон к нашему подкасту! В последнем выпуске мы глубоко погрузились в мощный мир пользовательских функций (UDF) в DAX. Если вы были…

Automatically translated with AI from the original post. Read the English original

▶ BLOGDemystifying DAX UDFs:VAL vs. EXPR ExplainedM365.FM
Titelbild: Demystifying DAX UDFs: VAL vs. EXPR Explained

С возвращением в сопроводительный блог к подкасту! В последнем выпуске мы подробно разобрали возможности пользовательских функций DAX (UDF). Если вы экспериментировали с UDF в Power BI или Analysis Services, то наверняка знаете, что они меняют правила игры: помогают избавиться от дублирования кода и централизовать бизнес-логику. Однако без понимания тонкостей режимов параметров сложные модели быстро приводят к скрытым ошибкам, неожиданным итогам и мучительным тайм-аутам запросов. Чтобы послушать полный разбор и увидеть реальные примеры этих концепций, обязательно прослушайте сопроводительный эпизод: «DAX UDF VAL vs EXPR: Prevent Timeouts and Wrong Totals».

В этой статье мы подробнее разберём ключевые различия между режимами параметров VAL и EXPR. К концу чтения вы будете точно понимать, когда стоит передать статическое значение, а когда использовать динамическое выражение, учитывающее контекст, чтобы ваши семантические модели работали быстро и давали точные результаты.

Обзор DAX UDF

Что такое DAX UDF?

Пользовательские функции DAX (UDF) позволяют создавать собственные вычисления, которые можно повторно использовать в моделях данных. Вместо того чтобы многократно писать одну и ту же формулу, вы определяете её один раз как функцию, а затем вызываете её там, где она нужна. Такой подход помогает сохранять порядок и согласованность в работе.

Думайте о DAX UDF как о строительных блоках для ваших отчётов. Они инкапсулируют логику, поэтому не нужно повторяться. Это экономит время и снижает количество ошибок. Кроме того, такими функциями можно делиться с командой, что упрощает совместную работу.

Вот краткий обзор того, что выделяет DAX UDF на фоне других пользовательских функций в аналитике данных:

ВозможностьОписание
Централизованная логикаDAX UDF позволяют централизованно определять и повторно использовать вычисления DAX, что упрощает управление моделями и их изменение.
Повторное использованиеОни обеспечивают инкапсуляцию и повторное использование логики в разных выражениях DAX и семантических моделях.
Экономия времениDAX UDF экономят время, когда DAX повторно используется в разных моделях и проектах.
Повышение производительностиОни могут повысить производительность в сценариях с многоуровневыми вычисляемыми мерами, снижая нагрузку на механизм формул.
Лучшая организацияDAX UDF помогают упорядочить модели и улучшить их использование в последующих вычислениях и отчётах.

Важность DAX UDF

Использование пользовательских функций DAX во многих отношениях улучшает разработку отчётов. Во-первых, они делают модели чище и проще в сопровождении. Когда вы обновляете функцию, все меры, которые её используют, обновляются автоматически. Это снижает вероятность ошибок и сохраняет согласованность отчётов.

DAX UDF также повышают масштабируемость. Они помогают отчётам расти, не становясь громоздкими и медленными. Сложные вычисления можно строить пошагово, а затем повторно использовать эти шаги в других частях модели. Такой модульный дизайн делает работу эффективнее.

Вот несколько ключевых преимуществ, которые дают DAX UDF:

  • Они уменьшают дублирование логики, что снижает количество ошибок и экономит время.
  • Они позволяют обновлять бизнес-правила в одном месте, а изменения применяются везде.
  • Они улучшают совместную работу, предоставляя команде общую библиотеку функций.
  • Они упрощают разработку отчётов, сокращая необходимое на это время до 70–80%.

По сравнению с традиционными формулами DAX, DAX UDF могут также существенно повысить производительность. Например, некоторые тесты показывают, что UDF сокращают время вычислений с более чем 6 000 миллисекунд до чуть более 160 миллисекунд — улучшение на 97%.

Освоив пользовательские функции DAX, вы получаете больший контроль над моделями данных. Вы создаёте отчёты, которые работают быстрее, легче сопровождаются и надёжнее. Этот навык помогает создавать качественную аналитику, отвечающую потребностям бизнеса.

Неправильное использование DAX UDF: типичные ошибки

Неверное понимание типов данных

Многие пользователи испытывают трудности с типами данных при работе с DAX UDF. Часто они недооценивают важность использования правильного типа для параметров. Такое недопонимание может привести к неожиданным результатам. Например, если передать текстовое значение в функцию, ожидающую число, вычисление может завершиться ошибкой или вернуть некорректный результат.

Вот некоторые типичные ошибки, связанные с типами данных:

  • Пользователи часто путают числовые и текстовые форматы.
  • Они могут не понимать, что DAX обрабатывает даты как числа, что может усложнить вычисления.
  • Неправильное использование типов данных может снизить производительность модели и привести к медленной работе отчётов.

Неправильное использование синтаксиса

Синтаксические ошибки — ещё одна распространённая проблема при работе с пользовательскими функциями DAX (UDF). Небольшая ошибка в коде может прервать выполнение вычислений. Если вы допустили синтаксическую ошибку, DAX отображает жёлтый предупреждающий значок в редакторе выражений. Этот значок сигнализирует, что что-то не так, но не всегда уточняет, в чём именно проблема.

Вот некоторые типичные синтаксические ошибки, которых стоит избегать:

  • Незакрытые круглые или квадратные скобки.
  • Неправильные имена функций или опечатки в них.
  • Отсутствие запятых между аргументами.

Такие ошибки могут стать причиной разочарования и потери времени. Всегда перепроверяйте синтаксис перед выполнением выражений DAX.

Игнорирование обработки ошибок

Эффективная обработка ошибок имеет решающее значение для надёжности ваших пользовательских функций DAX (UDF). Многие пользователи пренебрегают этим аспектом, что может привести к сбоям вычислений. Например, если функция получает входные данные неожиданного типа, она может вернуть ошибку вместо полезного результата.

Чтобы предотвратить эти проблемы, рассмотрите следующие стратегии:

  • Используйте функцию IFERROR(), чтобы задать резервное значение. Это не даст ошибкам нарушить работу визуальных элементов.
  • Применяйте ISBLANK(), чтобы проверять по-настоящему пустые значения и отличать их от нуля или пустых строк.
  • Используйте COALESCE(), чтобы вернуть первое непустое значение из списка выражений.

Также можно определять функции, которые проверяют типы входных данных. Например, используйте ISSTRING(), чтобы убедиться, что входные данные являются строкой. Если это не так, верните BLANK(). Такой подход делает ваши вычисления надёжными и устойчивыми.

Избегая этих распространённых ошибок, вы можете улучшить свои пользовательские функции DAX и повысить общую производительность модели данных. Помните: понимание того, как правильно использовать VAL и EXPR, — ключ к полному раскрытию возможностей пользовательских функций DAX.

Понимание VAL в DAX

Назначение VAL

Функция VAL в DAX решает конкретную задачу: она преобразует текстовое представление числа в настоящее числовое значение. Эта функция необходима, когда вы работаете с данными, которые могут поступать в разных форматах. Например, если из источника данных вы получаете число в виде текста, с помощью VAL можно преобразовать его в пригодный для использования числовой формат. Такое преобразование позволяет выполнять вычисления корректно.

Используйте VAL, когда:

  • Нужно убедиться, что вычисления работают с числовыми значениями.
  • Хотите избежать ошибок, возникающих из-за использования текста вместо чисел.
  • Работаете с пользовательским вводом, который может не всегда соответствовать нужному формату.

Синтаксис VAL

Синтаксис функции VAL довольно простой:

VAL(<text>)
  • <text>: этот параметр представляет текстовую строку, которую нужно преобразовать в число. Это может быть непосредственно введённый текст или ссылка на столбец с текстовыми значениями.

Вот простой пример использования функции VAL:

SalesAmount = VAL('Sales'[SalesText])

В этом примере функция преобразует текст в столбце 'SalesText' в числовое значение, что позволяет выполнять с ним вычисления.

Примеры использования VAL

Рассмотрим несколько практических примеров использования функции VAL в DAX.

  1. Базовое преобразование: допустим, у вас есть столбец 'RevenueText', который содержит данные о выручке в текстовом виде. Вы можете создать меру, чтобы преобразовать эти значения в числа:

    TotalRevenue = SUMX('Sales', VAL('Sales'[RevenueText]))

    Эта мера вычисляет общую выручку, преобразуя каждое текстовое значение в число.

  2. Обработка пользовательского ввода: если пользователи вводят числа в виде текста, с помощью VAL можно сохранить точность вычислений. Например, если пользователь вводит целевой показатель продаж как текст, его можно преобразовать:

    SalesTarget = VAL(UserInput[TargetText])

    Это гарантирует корректность вычислений, основанных на целевом показателе продаж.

  3. Предотвращение ошибок: использование VAL помогает избежать ошибок в отчётах. Если вы пытаетесь выполнять вычисления с текстовыми значениями без преобразования, могут возникнуть проблемы. Применяя VAL, вы защищаете расчёты от этих ошибок:

    AdjustedSales = IF(ISERROR(VAL('Sales'[SalesText])), 0, VAL('Sales'[SalesText]))

    В этом примере, если преобразование не удаётся, мера возвращает 0 вместо ошибки.

Понимая назначение и правильное использование функции VAL, вы можете улучшить свои пользовательские функции DAX. Эти знания помогают эффективнее работать с данными и обеспечивают точность результатов.

Понимание EXPR в DAX

Назначение EXPR

Режим параметра EXPR в DAX играет важную роль, когда вы хотите, чтобы ваши пользовательские функции динамически реагировали на изменения в модели данных. В отличие от VAL, который фиксирует значение на момент вызова функции, EXPR позволяет передать выражение, которое вычисляется при каждом запуске функции. Это значит, что ваши вычисления могут автоматически адаптироваться к разным контекстам фильтров или контекстам строк.

Используйте EXPR, когда функция должна реагировать на меняющиеся условия данных. Например, если вы хотите вычислить меру, которая зависит от текущего фильтра или выбора в срезе, EXPR позволяет передать эту логику в виде выражения. Такая гибкость делает ваши пользовательские функции более мощными и лучше учитывающими контекст.

Совет: используйте EXPR для создания динамических вычислений, которые обновляются в зависимости от действий пользователей или фильтров данных. Это помогает строить отчёты, отражающие аналитику в реальном времени.

Синтаксис EXPR

Синтаксис использования EXPR в пользовательских функциях DAX требует объявить параметр как выражение. Общая форма такая:

DEFINE FUNCTION MyFunction(EXPR paramName AS EXPRESSION)
RETURNS <return_type>
AS
BEGIN
    RETURN <calculation_using paramName>
END
  • paramName: имя параметра, который получит выражение.
  • EXPRESSION: указывает, что параметр ожидает выражение, а не фиксированное значение.

При вызове функции вы передаёте выражение DAX вместо простого значения. Функция вычисляет это выражение каждый раз при запуске с учётом текущего контекста фильтра или строки.

Примеры использования EXPR

Рассмотрим несколько практических примеров, чтобы понять, как работает EXPR в пользовательских функциях DAX.

  1. Пример динамической фильтрации

Допустим, вы хотите создать функцию, которая вычисляет общую сумму продаж, но позволяет динамически передавать выражение фильтра:

DEFINE FUNCTION TotalSalesWithFilter(EXPR FilterExpression AS EXPRESSION)
RETURNS DECIMAL
AS
BEGIN
    RETURN CALCULATE(SUM(Sales[Amount]), FilterExpression)
END

При вызове этой функции можно передавать разные выражения фильтра:

TotalSalesWithFilter(FILTER(Sales, Sales[Region] = "West"))

Этот вызов вычисляет продажи только для региона West. Функция вычисляет выражение фильтра при каждом запуске, адаптируясь к контексту, который вы задаёте.

  1. Расчёт, зависящий от контекста

EXPR также можно использовать, чтобы передать меру или вычисление, которые зависят от текущего контекста строки или фильтра:

DEFINE FUNCTION CalculateMargin(EXPR SalesExpr AS EXPRESSION, EXPR CostExpr AS EXPRESSION)
RETURNS DECIMAL
AS
BEGIN
    RETURN SalesExpr - CostExpr
END

Вызов этой функции с выражениями вроде SUM(Sales[Amount]) и SUM(Sales[Cost]) позволяет динамически вычислять маржу с учётом текущих фильтров.

  1. Использование EXPR с CALCULATE

Всегда заключайте параметры EXPR в CALCULATE, когда нужно обеспечить переход контекста. Это гарантирует, что выражение будет вычислено в нужном контексте фильтра.

Примечание: неправильное использование EXPR, например передача статических значений или отсутствие обёртки выражений в CALCULATE, может привести к неожиданным результатам.

Освоив EXPR в пользовательских функциях DAX, вы сможете писать гибкие вычисления, учитывающие контекст. Этот навык помогает создавать отчёты, которые точно реагируют на выбор пользователей и изменения данных.

Лучшие практики для пользовательских функций DAX

Советы по эффективному использованию

Чтобы оптимизировать пользовательские функции DAX, следуйте этим рекомендациям:

  • Будьте осторожны с проблемами перехода контекста при использовании параметров EXPR. Переход контекста может привести к неожиданным результатам, если им не управлять должным образом.
  • Используйте CALCULATE для сложных сценариев. Эта функция помогает эффективно управлять контекстами таблиц и гарантирует, что вычисления отражают задуманную логику.
  • Делайте упор на модульную разработку. Разбивайте сложную логику на управляемые части. Такой подход упрощает сопровождение и повышает производительность.
  • Стандартизируйте бизнес-логику между командами. Единообразие в определении и использовании функций повышает качество совместной работы и снижает дублирование.
  • Оптимизируйте вычисления в одном месте. Это позволяет улучшать производительность и сопровождаемость, обновляя логику без долгого поиска по всей модели.

Типичные сценарии и решения

Понимание того, когда использовать VAL и EXPR, может существенно улучшить ваши пользовательские функции DAX. Вот некоторые типичные сценарии:

  • Используйте параметры VAL, когда значение параметра статично или не зависит от контекста строки. Например, если нужен фиксированный порог, VAL — правильный выбор.
  • Выбирайте параметры EXPR, когда параметр должен вычисляться в разных контекстах строк. Эта гибкость позволяет выполнять динамические расчёты, например итерировать по таблицам или фильтровать по вычисляемым метрикам.

Вот конкретные примеры, иллюстрирующие эти положения:

  1. В функции BestCustomers использование параметров EXPR позволяет вычислять метрику для каждого клиента и получать точные результаты.
  2. При использовании параметров VAL функция вычисляет метрику только один раз. Это может привести к некорректным или пустым результатам, если контекст изменится.
  3. Переходы контекста здесь имеют решающее значение. Параметры EXPR можно явно управлять с помощью CALCULATE, чтобы обеспечить корректное вычисление.

Применяя эти рекомендации, вы упростите сопровождение и повысите производительность в ваших пользовательских функциях DAX. Такой подход не только улучшает ваши расчёты, но и способствует долгосрочной эффективности ваших моделей данных.


В этом блоге вы узнали о значении VAL и EXPR в пользовательских функциях DAX. Понимание этих концепций помогает избежать распространённых ошибок и улучшает ваши модели данных.

  • VAL захватывает фиксированные значения, тогда как EXPR позволяет выполнять динамические вычисления.
  • Правильное использование этих функций повышает точность и производительность.

Применяя эти знания, вы сможете создавать более эффективные пользовательские функции DAX. Начните внедрять эти практики уже сегодня, чтобы повысить свой уровень в аналитике данных! 🚀 Не забудьте посмотреть связанный эпизод, где есть полное аудиопояснение и обсуждение темы: DAX UDF VAL vs EXPR: Prevent Timeouts and Wrong Totals.

Часто задаваемые вопросы

В чём разница между VAL и EXPR в DAX?

VAL фиксирует значение на момент вызова функции. EXPR вычисляет выражение динамически, адаптируясь к изменениям контекста фильтров или строк.

Когда следует использовать VAL?

Используйте VAL, когда нужно константное числовое значение. Это идеальный вариант для сценариев, где входные данные не зависят от контекста, например для пороговых значений.

Когда лучше выбрать EXPR?

Выбирайте EXPR, когда вычисления должны реагировать на изменение данных. Это позволяет выполнять динамические вычисления на основе действий пользователей или фильтров.

Можно ли использовать VAL и EXPR в одной функции?

Да, VAL и EXPR можно комбинировать в одной функции. Главное — использовать их уместно, в зависимости от того, нужны ли вам фиксированные значения или динамические выражения.

Как повысить производительность моих пользовательских функций DAX?

Для повышения производительности минимизируйте сложные вычисления внутри функций. Используйте VAL для статических значений и оборачивайте вычисления EXPR в CALCULATE, чтобы эффективно управлять переходами контекста.

Каких распространённых ошибок стоит избегать в пользовательских функциях DAX?

Избегайте неправильного использования типов данных, некорректного синтаксиса и игнорирования обработки ошибок. Эти ошибки могут привести к неточным результатам и снизить производительность модели данных.

Можно ли протестировать мои пользовательские функции DAX?

Да, их можно проверить, создав тестовые отчёты или используя DAX Studio. Это позволяет оценить производительность и убедиться в точности вычислений.

Где найти дополнительные материалы о пользовательских функциях DAX?

Дополнительные материалы можно найти в официальной документации Microsoft, на онлайн-курсах и в сообществах на форумах. Эти ресурсы содержат полезные разъяснения и примеры.

Entities in this article

Azure Functions DAX user-defined functions (UDFs) Power BI Data analyst Filter context

Related articles

RSS