Записки охотника

Нестандартная сортировка

Тематические статьи
Рвав-рвав, собака Смайл опять с вами!
Есть просто отличная новость: любопытный пес изыскал возможность вложенной сортировки данных, несмотря на то, что сортировка возможна как бы по одному столбцу…

Пример:

  • Таблица «Перечень оборудования» содержит необходимые сведения для сортировки данных по оборудованию и входящим в него устройствам, а именно, порядковый номер группы оборудования с порядковым номером входящего в него устройства:

Таблица
Распределение оборудования

Задача:

На основе представленных данных построить матрицу, в которой на 1-ом уровне расположено оборудование, а на 2-м — соответствующее устройства. При этом и список оборудования, и список устройств должны иметь строго определенный порядок, соответствующий указанному номеру.

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

Возможности сортировки «из коробки»:

  • Используя визуальный элемент «Матрица», не применяя при этом сортировку, мы можем получить следующий результат:

Таблица
Сортировка "по умолчанию"

При сборке матрицы, в качестве варианта «по умолчанию», значения в столбце «Оборудование» будут отсортированы по возрастанию (по алфавиту).

  • Используя возможности визуального элемента (см. Дополнительные параметры → Сортировка по убыванию), мы можем выстроить обратный порядок сортировки значений в столбце «Оборудование», то есть — по убыванию:

Таблица
Сортировка по убыванию

Правильный порядок сортировки для 1-го уровня уровня матрицы («Оборудование») все еще не установлен.

  • Используя дополнительные возможности сортировки по столбцу (см. Моделирование → Сортировать по столбцу), мы можем выстроить правильный порядок сортировки по 1-му уровню матрицы — «Оборудование»:

Таблица
Сортировка при помощи другого столбца

  • Несмотря на достигнутый результат, на этом возможности сортировки в стандартном функционале исчерпываются, и отсортировать 2-ой уровень матрицы — «Устройства» в правильном порядке не представляется возможным. При попытке применения сортировки по столбцу «Порядок внутри группы» для уровня «Устройства», система выдаст ошибку следующего вида:

Сообщение
Ошибка сортировки по другому столбцу

Ошибка связана с тем, что имена устройств, относящихся к разному оборудованию, дублируются.

Обходные пути:

  • Желаемой цели можно добиться, присвоив к имени устройства порядковый номер, тогда название по оборудованию «Главная турбина» изменится, например, на «1_Камера ГТ», а базовые возможности сортировки по возрастанию обеспечат правильный внутренний порядок элементов.

  • Также можно обеспечить отсутствие дублей в названии устройства, привязав его, например, к оборудованию, то есть изменив на «Датчик ААА_ГТ».

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

Кастомная сортировка:

  • Для построения подобной сортировки нам понадобятся функии REPT и UNICHAR, при этом символ, который нам нужен, имеет код «8203». Использование конструкции, приведенной ниже, позволит добавить так называемые «ведущие нули» перед необходимым значением, при этом нули невидимы, то есть визуальных отличий для глаза нет. Формула рассчетного столбца:

Сортировка =
SWITCH (
    TRUE (),
    'Перечень оборудования'[Порядок внутри группы] = 1
        && 'Перечень оборудования'[Оборудование] = "Главная турбина",
        REPT (
            UNICHAR 8203 ),
            5
        ) & "Камера ГТ",
    'Перечень оборудования'[Порядок внутри группы] = 2
        && 'Перечень оборудования'[Оборудование] = "Главная турбина",
        REPT (
            UNICHAR 8203 ),
            4
        ) & "Датчик ААА",
    'Перечень оборудования'[Порядок внутри группы] = 3
        && 'Перечень оборудования'[Оборудование] = "Главная турбина",
        REPT (
            UNICHAR 8203 ),
            3
        ) & "Датчик LLL",
    'Перечень оборудования'[Порядок внутри группы] = 4
        && 'Перечень оборудования'[Оборудование] = "Главная турбина",
        REPT (
            UNICHAR 8203 ),
            2
        ) & "Датчик МММ",
    'Перечень оборудования'[Порядок внутри группы] = 5
        && 'Перечень оборудования'[Оборудование] = "Главная турбина",
        REPT (
            UNICHAR 8203 ),
            1
        ) & "Датчик RRR",
    'Перечень оборудования'[Порядок внутри группы] = 1
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 1",
        REPT (
            UNICHAR 8203 ),
            5
        ) & "Датчик LLL",
    'Перечень оборудования'[Порядок внутри группы] = 2
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 1",
        REPT (
            UNICHAR 8203 ),
            4
        ) & "Датчик RRR",
    'Перечень оборудования'[Порядок внутри группы] = 3
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 1",
        REPT (
            UNICHAR 8203 ),
            3
        ) & "Датчик ААА",
    'Перечень оборудования'[Порядок внутри группы] = 4
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 1",
        REPT (
            UNICHAR 8203 ),
            2
        ) & "Датчик МММ",
    'Перечень оборудования'[Порядок внутри группы] = 5
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 1",
        REPT (
            UNICHAR 8203 ),
            1
        ) & "Камера ВТ1",
    'Перечень оборудования'[Порядок внутри группы] = 1
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 2",
        REPT (
            UNICHAR 8203 ),
            5
        ) & "Датчик ААА",
    'Перечень оборудования'[Порядок внутри группы] = 2
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 2",
        REPT (
            UNICHAR 8203 ),
            4
        ) & "Датчик МММ",
    'Перечень оборудования'[Порядок внутри группы] = 3
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 2",
        REPT (
            UNICHAR 8203 ),
            3
        ) & "Датчик LLL",
    'Перечень оборудования'[Порядок внутри группы] = 4
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 2",
        REPT (
            UNICHAR 8203 ),
            2
        ) & "Датчик RRR",
    'Перечень оборудования'[Порядок внутри группы] = 5
        && 'Перечень оборудования'[Оборудование] = "Вспомогательная турбина 2",
        REPT (
            UNICHAR 8203 ),
            1
        ) & "Камера ВТ2",
    BLANK ()
)

  • Для обеспечения правильного порядка элементов, столбец "Сортировка" необходимо отсортировать по столбцу "Порядок внутри группы". Если все сделано правильно, то вы добъетесь следующего результата:


В последней таблице мы имеем правильную сортировку по обоим уровням ("Оборудование" и "Устройства"), при этом порядок следования устройств соответствуют нашим требованиям.

Рвав-рвав, до новых встреч!
Ваш Смайл