Array
Универсальное значение для работы с массивами/матрицами на форме
Last updated
Универсальное значение для работы с массивами/матрицами на форме
Last updated
Элемент <Array>
позволяет объединять матрицы, фильтровать, сортировать и группировать данные, а так же изменять структуру данных и многое другое.
О всех возможностях <Array> можно узнать в статье по .
Логика элемента <Array>
заключается в последовательном применении описанных операторов. Таким образом, результат выполнения предыдущей операции будет входным значением следующего оператора.
Рассмотрим пример фильтрации матрицы, сортировки значений и изменение структуры итоговой матрицы:
Исходная матрица (массив) всегда задается в тэге <Source>
. В нем можно указывать загружающее соединение с данными любого типа, результат выполнения команды либо значения любого объекта на форме.
В примере передаем PrimaryGetDataConnection со значениями:
На последовательном выполнении различных операторов строится работа с элементом <Array>
. Главное соблюдать соответствие разрядности результата одной операции и ожидаемой разрядности входных данных следующего оператора.
После получения нужных колонок, можно применять различные операторы для получения нужных значений. Например, фильтровать матрицу, упорядочивать значения и т.д.
<Array>
в текстОператор задает разделители между элементами одной строки матрицы (атрибут Separator
) и между строками матрицы (атрибут LineSeparator
). Для линейных массивов будет использоваться только разделитель из атрибута Separator
.
На форме есть ResultTextBox, его будем использовать для отображения результата применения операторов элемента <Array>
. Давайте выведем в текстовое поле содержимое OrderPositionPrimaryGetDataConnection, для этого в тэг <Text>
объекта ResultTextBox вставим код приведенный выше.
Откроем форму в приложении и проверим результат:
В тэге <OuterArray>
указываем внешнюю матрицу, которая будет соединяться с исходной матрицей по ключам, заданным в тэге <Keys>
.
Количество <Inner>
и <Outer>
индексов в тэге <Keys>
должно совпадать.
Если ключей (пар индексов) больше одного, то важен порядок их описания, так как <Inner>
и <Outer>
индексы сравниваются по парно в порядке описания.
В тэге <Result>
задаем структуру результирующей матрицы, указывая индексы колонок внутренней и внешней матрицы и их порядок.
Скопируйте код выше и замените значение тэга <Text>
у объекта ResultTextBox. Не забудьте добавить оператор <StringJoin>
.
Чтобы результат был понятнее, добавим пробелы в строки для выравнивания колонок.
В тэге <Index>
селектора Substitution указываем колонку исходной матрицы, по значениям которой будет происходить выборка значений из таблицы подстановки.
В качестве таблицы подстановки должна быть матрица, состоящая из двух столбцов. В первом столбце должен быть ключ, по которому будет идти подстановка, а во втором - значение, которое будет использоваться при подстановке. В нашем случае это CityPrimaryGetDataConnection.
Давайте с помощью селектора Expression подсчитаем стоимость для каждой позиции заказа:
Проверим результат на форме:
Так как в тэге <By>
в качестве условия группировки указали индекс колонки ClientId, то первая колонка результата содержит уникальные значения идентификаторов клиентов. Вторая колонка - вложенные таблицы с записями, соответствующими идентификатору группы. Вложенные таблицы имеют ту же структуру, что и входная матрица.
В выражении <Expression>
в квадратных скобках указаны индексы элементов исходного массива - Quantity и UnitPrice. Переменная {Result}
, используется для хранения значения, вычисленного для предыдущей строки. В тэге <Result>
задали начальное значение для переменной результата.
Когда оператор завершит вычисление, то вернет получившееся значение переменной {Result}
. Так как в нашем примере только один элемент <Item>
в тэге <Items>
, то вернется скалярное значение. Если бы их было несколько, то вернулся бы массив результатов агрегации.
В тэге <Index>
указали индекс колонки с вложенными массивами.
В тэге <Actions>
указали операцию над массивами. Этот тэг аналогичен тэгу <Array>
- мы можем в нем использовать любые операторы и их комбинации. Эти операции будут применяться к каждой строке отдельно. Исходным массивом для первой операции будет элемент массива с индексом из тэга <Index>
.
Таким образом, тэгом <Select>
мы задали структуру результирующей матрицы, которая будет хранить значения:
Добавьте в массив оператор <Join>
, чтобы в ответе были фамилии клиентов. Откройте форму и проверьте ответ:
Первым выполнится оператор с типом Equal (по умолчанию), который отфильтрует строки матрицы по значению False в колонке Archive. Данные после фильтрации:
Затем оператор отсортирует значения по колонке Title по возрастанию (по умолчанию).
Последним оператором идет , который задает набор селекторов для формирования структуры результирующей матрицы. Первой колонкой идет селектор , который задает порядковый номер строки. Для второй и третьей колонок используется самый простой и распространенный вариант селекторов - - индекс колонки входной матрицы. Порядок описания селекторов задает порядок столбцов результирующей матрицы.
Дальше рассмотрим несколько задач, в которых познакомимся с другими операторами и возможностью их комбинировать. Работать будем с формой и запросами из раздела .
В предыдущем примере рассмотрели вариант, когда в качестве источника данных для <Array>
используется загружающий . Матрицу можно получить и из таблицы через get-проперти . Но для получения данных из таблицы можно использовать get-проперти , чтобы получить массив словарей.
При работе со словарями используется селектор , который по имени колонки вернет значения всех ее ячеек. Так будет удобнее извлекать нужные колонки таблицы и не нужно следить за индексами колонок, которые могут сдвинутся, если добавится или удалится непоследняя колонка.
Чтобы значение тэга <Array>
преобразовать в строку и отобразить в текстовом поле, следует использовать оператор .
Один из самых простых примеров использования массивов является соединение двух матриц. У нас на форме есть список клиентов с идентификаторами городов и список самих городов. Давайте соединим оба списка с помощью оператора , так чтобы в новом списке для каждого клиента было название его города.
Задачу из предыдущего примера можно решить с помощью селектора , который по ключу выбирает значение из таблицы подстановки и добавляет его в строку результирующей матрицы.
Селектор вычисляет выражение на основе элементов исходного массива (указываются в квадратных скобках []
) и/или дополнительных значений (указываются в фигурных скобках {}
), перечисленные в тэге <Items>
вложенном в <Item Type="Expression">
.
В этом примере рассмотрим, как подсчитать стоимость всех товаров для каждого клиента. Для этого будем использовать операторы и , а так же селектор .
Результатом выполнения оператора будет матрица вида:
Чтобы подсчитать сумму значений всех строк матрицы используется оператор , который для каждой строки вычисляет выражение из тэга <Expression>
и суммирует полученное значение с суммой значений выражения для предыдущих строк.
Так как матрицы, для которых нужно подсчитать сумму, являются вложенными, то используем селектор , чтобы к матрице в каждой строке применить оператор <Aggregate>
.