Общие сведения о делегировании в приложении на основе холста

Power Apps поддерживает целый ряд эффективных и полезных функций для фильтрации, сортировки и форматирования таблиц с данными в приложении на основе холста, например Filter, Sort, AddColumns и многие другие. Эти функции помогают обеспечить пользователям доступ именно к той информации, которая им необходима. Для тех, у кого есть опыт работы с базами данных, использование этих функций можно сравнить с составлением запросов к базе.

Залогом создания эффективных приложений является минимизация объема данных, которые необходимо загружать на устройства. Иногда необходимы лишь несколько из миллионов записей или одно обобщенное (статистическое) значение, которое характеризует тысячи элементов в базе. Кроме того, возможно, достаточно будет извлечь лишь первый набор записей, а остальные можно загружать по требованию пользователя. Учитывая эти моменты, можно существенно сократить потребность в процессорной мощности, памяти и полосе пропускания, необходимых приложению, что в свою очередь ускорит его реагирование на действия пользователей, причем даже на телефонах, подключенных к Интернету через сотовый канал связи.

Делегирование позволяет минимизировать объемы данных, передаваемые через сеть, не жертвуя при этом функциональными возможностями формул Power Apps. Вкратце Power Apps делегирует обработку данных источнику вместо переноса данных в приложение для локальной обработки.

Такая возможность существует не всегда, и, как объясняется в этой статье, не все функции и возможности формул Power Apps можно делегировать каждому источнику данных. Язык Power Apps аналогичен языку формул Excel и предполагает полный и мгновенный доступ ко всему содержимому книги в памяти, включая широкий набор функций для работы с числами и текстом. Благодаря этому возможности языка Power Apps намного шире, чем те, что поддерживаются большинством источников данных, включая такие мощные и функциональные СУБД, как SQL Server.

Для работы с большими наборами данных необходимо использовать источники и формулы, которые можно делегировать. Только так можно сохранить работоспособность приложения на высоком уровне и обеспечить пользователям доступ ко всей необходимой им информации. Обращайте внимание на предупреждения о делегировании, которые указывают на места, где делегирование невозможно. Если вы работаете с небольшими наборами данных (до 500 записей), можно использовать любые источники данных и формулы, так как приложение может обрабатывать данные локально даже в случае, если формулу нельзя делегировать.

Примечание

Предупреждения о делегировании раньше помечались в Power Apps как рекомендации с синими точками, но теперь они считаются не рекомендациями, а предупреждениями. Если в источнике данных более 500 записей и невозможно делегировать функцию, Power Apps не сможет получить все данные и приложение получит неверные результаты. Предупреждения о делегировании помогают управлять приложением и получать правильные результаты.

Делегирование источников данных

Делегирование поддерживается только для определенных табличных источников данных. Если источник данных поддерживает делегирование, его документация по соединителю описывает эту поддержку. Например, эти табличные источники данных являются наиболее популярными и поддерживают делегирование:

Импортированные книги Excel (для которых используется источник Добавить статические данные для приложения), коллекции и таблицы, хранимые в переменных контекста, не требуют делегирования. Все эти данные уже находятся в памяти и поддерживают все функциональные возможности языка Power Apps.

Делегируемые функции

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

Этот список со временем будет меняться. Мы расширяем поддержку делегирования и на другие функции и операторы.

Функции фильтрации

Функции Filter, Search и LookUp можно делегировать.

В функциях Filter и LookUp для выбора соответствующих записей в столбцах таблицы можно использовать следующие операторы и функции:

Также можно использовать части формул, которые возвращают константные значения для всех записей. Например, результат выполнения формул Left( Language(), 2 ), Date( 2019, 3, 31 ) и Today() не зависит от содержимого столбцов записи и возвращает одинаковое значение для всех записей. Эти значения могут быть отправлены в источник данных как константа и не будут блокировать делегирование.

Предыдущий список не содержит следующие важные элементы:

Функции сортировки

Функции Sort и SortByColumns можно делегировать.

В функции Sort формулой может быть только имя одного столбца, и она не может содержать другие операторы или функции.

Агрегатные функции

Sum, Average, Min и Max можно делегировать. Сейчас делегирование поддерживает ограниченное число источников данных. Дополнительные сведения см. в списке делегирования.

Функции подсчета, такие как CountRows, CountA и Count, невозможно делегировать.

Другие агрегатные функции, такие как StdevP и VarP, также невозможно делегировать.

Функции формирования таблиц

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

Как в этом примере, создатели часто используют функции AddColumns и LookUp для объединения данных из двух таблиц в одну (в контексте баз данных это называется операцией соединения):

AddColumns( Products, 
    "Supplier Name", 
    LookUp( Suppliers, Suppliers.ID = Product.SupplierID ).Name 
)

В то время как источники данных Products и Suppliers могут поддерживать делегирование, а функция LookUp является делегируемой, выходные данные функции AddColumns делегировать нельзя. Результаты выполнения всей формулы ограничены первой частью источника данных Products. Поскольку функция LookUp и ее источник данных являются делегируемыми, совпадение со значением Suppliers может быть найдено в любом месте источника данных (каким бы большим он ни был).

Если вы используете AddColumns таким образом, LookUp должен делать отдельные вызовы источника данных для каждой из этих первых записей в Products, что приводит к передаче большого объема данных по сети. Если источник данных Suppliers достаточно мал и не часто меняется, вы можете вызвать функцию Collect в свойстве OnStart, чтобы кэшировать источник данных в вашем приложении при запуске. В качестве альтернативы вы могли бы изменить структуру своего приложения так, чтобы вы извлекали связанные записи только тогда, когда пользователь запрашивает их.

Неделегируемые функции

Все остальные функции не поддерживают делегирование. Ниже перечислены некоторые из них.

Ограничения для неделегируемых функций

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

Чтобы избежать этого, в Power Apps установлено ограничение на объем данных, обрабатываемых локально: по умолчанию не более 500 записей. Мы выбрали именно это число, чтобы обеспечить полный доступ к небольшим наборам данных и в то же время дать возможность оптимизировать обработку больших наборов на основе частичных результатов.

Очевидно, этот фактор необходимо учитывать, чтобы не вводить пользователей в заблуждение. Представим ситуацию, в которой функция Filter используется в формуле выборки, которую нельзя делегировать, для фильтрации источника данных, содержащего более миллиона записей. Поскольку фильтрация выполняется локально, проверяются только первые 500 записей. Если нужная запись находится под номером 501 (или 500 001), она не будет обработана, а функция Filter ее не вернет.

Агрегатные функции также могут привести к путанице. Представим функцию Average, примененную к тому же самому источнику данных с миллионом записей. Поскольку делегирование функции Average пока не поддерживается, усреднение будет выполнено только по первым 500 записям. Этот фактор необходимо учитывать: в противном случае пользователь приложения ошибочно посчитает полным результат обработки лишь части набора.

Изменение ограничения

По умолчанию количество записей равно 500, но можно изменить это число для всего приложения:

  1. На вкладке Файл выберите Параметры приложения.
  2. В разделе Дополнительные параметры измените параметр Предельное число строк данных для неделегируемых запросов с 1 до 2000.

В некоторых случаях вам может быть известно, что оптимальным значением для вашего сценария является 2000 (или 1000, или 1500). Это число можно осторожно увеличивать в соответствии с потребностями сценария. Увеличение этого параметра может привести к снижению производительности приложения, особенно для таблиц с большим количеством столбцов. Но лучший вариант — делегировать все, что только можно делегировать.

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

Предупреждения о делегировании

Чтобы вы всегда знали, что можно, а что нельзя делегировать, Power Apps предоставляет предупреждение (желтый треугольник) при создании формулы с неделегируемыми элементами.

Предупреждения о делегировании отображаются только для формул, которые работают с делегируемыми источниками данных. Если вы не видите подобного предупреждения и считаете, что формула не делегируется надлежащим образом, проверьте, есть ли ваш источник в списке делегируемых источников данных выше.

Примеры

Например, вы автоматически создаете приложение с тремя экранами на основе таблицы SQL Server с именем [dbo].[Fruit]. Чтобы создать такое приложение, смотрите раздел о Dataverse для приложений и примените те же принципы для SQL Server.

Приложение с тремя экранами

Для свойства Items коллекции установлена формула, которая содержит функции SortByColumns и Search. Обе функции можно делегировать.

В поле поиска введите Apple.

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

Элемент управления "Ввод текста" для поиска

Результаты поиска включают "Apples", "Crab apples" и "Pineapple", поскольку функция Search ищет по всему текстовому столбцу. Если вы хотите найти только те записи, которые содержат поисковой запрос в начале названия фрукта, используйте другую делегируемую функцию Фильтр для более сложных критериев поиска. (Для простоты удалите вызов SortByColumns.)

Удаление вызова SortByColumns

Новые результаты включают "Apples", но не "Crab apples" или "Pineapple". Однако рядом с коллекцией (и в эскизе экрана, если в левой панели навигации отображаются эскизы) отображается желтый треугольник, и часть формулы подчеркивается синей волнистой линией. Каждый из этих элементов указывает на предупреждение. Если навести курсор на желтый треугольник рядом с коллекцией, вы увидите следующее сообщение:

Наведение указателя мыши на предупреждение о делегировании

SQL Server является делегируемым источником данных, а Filter является делегируемой функцией, однако Mid и Len невозможно делегировать источнику данных.

Но мы ведь получили нужные результаты? В некотором смысле — да. Поэтому это предупреждение, а не красная волнистая линия.

  • Если таблица содержит не более 500 записей, формула дала правильный результат. Все эти записи были загружены на устройство, и функция Filter была применена локально.
  • Если таблица содержит более 500 записей, формула не возвращает запись 501 и далее, даже если она соответствует критериям.

См. также

Влияние использования неделегируемых функций и недопустимых лимитов строк данных на производительность
Советы по производительности и лучшие методики использования делегирования