Post-Image

Собакенские будни - конструкция Userelationship

Рвав-рвав, сегодня я – собака-вспоминака!

Перед вами – 3-я заметка из нашего цикла “Собакенские будни”, и ниже мы рассмотрим использование такой конструкции, как Userelationship. При помощи данной функции можно переопределить активную связь на время выполнение запроса. Синтаксис указанной функции из серии “проще практически не бывает”, однако, покопавшись в памяти, собака-вспоминака вспомнил, что встречал в одном сообществе такую вот задачку: “Так и так, хочу в одну таблицу подтянуть столбец из другой таблицы (по принципу работы RELATED), но при этом активную связь надо переопределить, не перестраивая связи в модели…”

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

Пример:

  • Таблица “Данные по сотрудникам” содержит необходимые сведения о сотрудниках, а именно, ID сотрудника (например, менеджера по закупкам), некое значение (например, количество заказов), ID ответственного лица (пусть это будет куратор соответствующего менеджера):

    blog_013_screen_1

  • Таблица “Справочник сотрудников” содержит ID сотрудника, и его фамилию:

    blog_013_screen_2

    Задача:

    Подтянуть в таблицу “Данные по сотрудникам” фамилии как сотрудников, так и ответственных лиц.

    Рвав-рвав, конечно, есть много неспортивных способов выполнения поступившего запроса (например, с использованием функции Switch, условного столбца в Power Query и пр.), но поскольку это не интересно и не универсально, мы это, естественно, не рассматриваем.

    Получение значения “Фамилия сотрудника”:

  • Тут все просто, необходимо настроить нужную связь на уровне модели по полю “ID_Сотрудника”:

    blog_013_screen_3

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

    Фамилия_Cотрудника =
    RELATED ( 'Справочник сотрудников'[Фамилия] )

  • Затем можно проверить получившийся результат:

    blog_013_screen_4

    Получение значения “Фамилия ответственного”:

  • Необходимо настроить вторую связь на уровне модели по полю “ID_Ответственного”, при этом то, что она будет неактивной – это нормально:

    blog_013_screen_5

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

    Фамилия_Ответственного =
    CALCULATE (
        MINX ( 'Данные по сотрудникам', RELATED ( 'Справочник сотрудников'[Фамилия] ) ),
        ALL ( 'Справочник сотрудников' ),
        USERELATIONSHIP ( 'Данные по сотрудникам'[ID_Ответственного], 'Справочник сотрудников'[ID_Сотрудника] )
    )

  • Затем можно проверить получившийся результат:

    blog_013_screen_6

    Рвав-рвав, товарищи, намешали, что могли, получили, что хотели…

    Всем хорошей погоды и горячей воды!

    Ваш Смайл