05 июля 2022
3 минуты

Как в MDX-запросе свернуть список в строку с разделителями

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

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

Как из элементов списка (столбца, набора) собрать длинную строку с разделителями?

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

Однако, не торопитесь задействовать StrToSet! Работая с этой функцией, вам каждый раз придётся решать четыре сопутствующих проблемы:

  1. StrToSet заключает результирующую строку в фигурные скобки, которые нам скорее всего не нужны. Надо не забыть от них избавиться.
  2. Вы скорее всего хотели получить список из названий или значений элементов множества. А StrToSet сконвертирует в строку не названия, а ключи. Придётся подумать, как заменить их на требуемые имена.
  3. Разделитель строки, возвращаемой StrToSet — всегда запятая. Если нужно что-то другое, потребуется дополнительная обработка.
  4. И, конечно, надо будет избавиться от обрамления в виде префиксов и квадратных скобок.

Есть другой способ решения этой задачи. Гораздо более удобный и управляемый. Один из режимов работы функции Generate как раз предназначен для формирования длинной строки с разделителями. При этом вы сами выбираете и значения и разделители.

Вот так:

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

Вот ещё пара примеров.

Давайте составим список не из названий, а из произвольных свойств:

И, разумеется, перебираемое множество можно собрать произвольным образом:


Бесплатный
Комментарии
avatar
Здесь будут комментарии к публикации