При работе со списками в SharePoint не хочется сильно увлекаться представлением полей во множестве столбцах. С такими данными не очень удобно работать, а также это крайне расточительно в части операций записи/чтения для производительной работы. Всегда продумывайте структуру данных, и если это массив данных, который однозначно относится к одной сущности, то можно такой массив записать в одно поле, а не в несколько. Например, у вас есть серия испытаний в рамках одного теста, в котором вам надо записать 3 наблюдения. Каждое наблюдение содержит 3 характеристики.
Неправильно создавать 3 столбца под каждую характеристику наблюдения, т.к. другой тип теста может содержать уже 4 и более характеристик. Вы можете создать поля впрок, но анализировать такие данные будет неприятно. Давайте "схлопнем" данные в одно текстовое поле в структурированном виде и будем читать для визуализации в табличном виде каждую запись такого теста. Разберем на примере такой обработки/визуализации данных в приложении Power APPS.
Чтобы задача выглядела несколько поинтереснее, затронем следующие моменты:
- Заполним таблицу из
JSON
данных. - Запишем данные из коллекции в строку в
JSON
представлении. - Сделаем кнопку для очистки таблицы от данных.
- Создадим кнопку для удаления выделенной записи из таблицы.
Для записи данных я буду в качестве примера писать 3 характеристики: CRF, CRI, CRC
.
Давайте решать задачи логично и по порядку.
- Придумайте название для коллекции, которая будет отвечать за представление характеристик:
Поля1, Поля2, Поля3
, допустимcolConfig
. - Сейчас наша коллекция colConfig (массив) пустая, мы еще к ней вернемся. Поэтому хорошо бы разово инициировать коллекцию. Можно это сделать на событие вашей экранной формы OnVisible, прописав код создания структуры с пустой записью и следом удалить пустышку, оставив скелет коллекции для последующей работы.
ClearCollect(colConfig, {CRF:"",CRI:"",CRC:""}); Clear(colConfig);
- Можно прописать на свойство
Items
нашего визуального компонента "таблица" как раз только имя коллекцииcolConfig
.
Разберем следующий блок - добавление записи характеристик из поле в коллекцию. Для этого на кнопку добавления записи пропишем функцию Collect()
с составом значений, указанных в полях ввода выше. Функция RandBeetween()
используется исключительно для примера для придания уникальности записываемым данным.
Collect(colConfig,
{CRF:Trim(e1.Value)&RandBetween(10000,1000000),
CRI:Trim(e2.Value)&RandBetween(10000,1000000) ,
CRC:Trim(e3.Value)&RandBetween(10000,1000000)
});
Нажав на кнопку добавления записи пополняется коллекция, а значит автоматически обновляется визуальная часть таблицы, у которой Items
ассоциирован с коллекцией ColConfig
.
Но ваша таблица всё еще ничего не покажет, пока вы не укажите инициированные поля (DataField), это легко сделать в интерфейсе среды разработки как на картинке:
Давайте отработаем попутно две простые функции из списка наших задач: удаление выделенной записи и очистка всей таблицы от введенных данных. Чтобы удалить данные из таблицы, достаточно почистить коллекцию, используя функцию Clear()
.
Clear(colConfig)
А чтобы удалить выделенную запись из таблицы Table1
(визуального компонента), которая к тому же относится Modern Controls, то используем функцию удаления по условию RemoveIf()
. Не забываем, что мы работаем с коллекцией. поэтому от таблицы мы должны получить признак уникальности удаляемой строки. В нашем примере считаем, что любая запись фактически уникальна. Поэтому для корректного удаления записи из таблицы просто фильтруем коллекцию до результата с одной записью и удаляем ее из коллекции. Определение записи уникального значения для фильтра через свойство Table1.Selected.[Field]
- запишем значение ячейки в переменную ActiveCell
, которую объявим на событие OnSelect()
нашей таблицы Table1
:
Set(ActiveCell, Table1.Selected.CRC)
Удалим из коллекции строку со значением переменной ActiveCell
:
RemoveIf(colConfig,CRC=ActiveCell)
Теперь разберемся с записью в строковую переменную коллекции в JSON. Это можно сделать, используя штатную функцию JSON()
c параметрами. Достаточно важно преобразовать коллекцию в строку JSON, указав дополнительные параметры: JSONFormat.IgnoreUnsupportedTypes
- игнорировать неподдерживаемые типы данных и JSONFormat.IgnoreBinaryData
- исключить при преобразование бинарные данные. Запишем результат в строковую переменную colJstr
. Можете это сделать в любом месте вашего приложения: отдельно на кнопку, на OnSelect()
таблицы и т.п.
Set(colJstr, JSON(colConfig,JSONFormat.IgnoreUnsupportedTypes & JSONFormat.IgnoreBinaryData))
Когда у нас есть строка с массивом данных в JSON формате, которую можно записать, то как ее можно корректно прочесть для визуализации в табличном виде. Для этого достаточно использовать функцию разбора JSON данных - ParseJSON()
и прочесть данные в цикле обратно в коллекцию colConfig
. Опять же событие определите сами, в нашем примере это будет кнопка Создать коллекцию.
ClearCollect(
colConfig,
ForAll(
Table(ParseJSON(colJstr)),
{
CRI: Text(Value.CRI),
CRF: Text(Value.CRF),
CRC: Text(Value.CRC)
}
))
Вот так можно собрать из JSON коллекцию.
Таким образом, можно записывать/считывать массивы данных. Подобный способ не имеет ограничений на количество табличных записей (конечно упираясь в пределы типа переменной Power APPS или поля списка Sharepoint List), позволяя сэкономить на полях вашего списка.