Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: Приложения
На основе холста Copilot Studio
Desktop поддерживают функции
Power Platform CLI
Dataverse
, управляемые
моделью
Вычисляет значения и выполняет действия для всех записей в таблице.
Описание
Функция ForAll вычисляет формулу для всех записей в таблице. Формула может рассчитать значение и (или) выполнить действия, например изменить данные или работу с подключением. Используйте функцию With, чтобы оценить формулу для отдельной записи.
Используйте функцию Sequence сForAll функцией для итерации на основе количества.
Поля обрабатываемой в настоящее время записи доступны в формуле. Используйте оператор ThisRecord или просто укажите поля по имени, как указываются любые другие значения. Оператор As также можно использовать для присвоения имени обрабатываемой записи, что упростит понимание формулы и обеспечивает доступность вложенных записей. Дополнительные сведения см. в приведенных ниже примерах и в описании работы с областью записи.
Возвращаемое значение
Результат каждого вычисления формулы возвращается в таблице в том же порядке, что и во входной таблице.
Если результат формулы является одним значением, результирующая таблица — это таблица с одним столбцом. Если результат формулы — запись, результирующая таблица содержит записи с теми же столбцами, что и результирующая запись.
Если результат формулы является пустым значением, запись в таблице результатов для этой входной записи отсутствует. В этом случае в результирующих таблицах меньше записей, чем в исходной таблице.
Выполнение действия
Формула может содержать функции, выполняющие действия, например изменяющие записи из источника данных с помощью функций Patch и Collect. Формула также может вызывать методы при подключении. Воспользовавшись оператором ;, для каждой записи можно выполнить несколько действий. Нельзя изменить таблицу, которая является предметом ForAll функции.
При создании формулы следует учитывать, что записи могут обрабатываться в любом порядке и (по возможности) параллельно. Первая запись таблицы может быть обработана после последней.
Поэтому следует избегать зависимостей от порядка расположения. По этой причине нельзя использовать функции UpdateContext, Clear иClearCollect в ForAll функции, так как их можно легко использовать для хранения переменных, которые будут подвержены этому эффекту. Вы можете использовать функцию Collect, но порядок добавления записей должен быть неопределенным.
Некоторые функции, которые изменяют источники данных, в том числе Collect, Remove и Update, возвращают измененный источник данных в качестве значения. Эти возвращаемые значения могут быть большими и использовать значительные ресурсы, если они возвращаются для каждой ForAll записи таблицы. Вы также можете обнаружить, что эти возвращаемые значения не являются ожидаемыми, так как ForAll могут работать параллельно и могут отделять побочные эффекты этих функций от получения их результата. Если возвращаемое значение из ForAll не используется, что часто относится к функциям изменения данных, то возвращаемое значение не будет создано и нет проблем с ресурсом или порядком. Но если вы используете результат ForAll и одну из функций, возвращающих источник данных, внимательно подумайте о том, как структурировать результат и попробовать его сначала на небольших наборах данных.
Альтернативные варианты
Многие функции в Power Apps могут обрабатывать несколько значений одновременно с помощью таблицы с одним столбцом. Например, функция Len может обрабатывать таблицу текстовых значений, возвращая таблицу длин таким же образом.ForAll Это может устранить необходимость использования ForAll во многих случаях, может быть более эффективным и проще читать.
Другое соображение заключается в том, что ForAll не является делегированным, а другие функции могут быть такими, как фильтр.
Делегирование
При использовании с источником данных эту функцию невозможно делегировать. Будет извлечена только первая часть источника данных, затем будет применена функция. Результат может не отражать ситуацию в целом. Во время разработки может отобразиться предупреждение, чтобы напомнить об этом ограничении и предложить по возможности переключиться на подлежащие делегированию альтернативы. Дополнительные сведения см. в обзоре делегирования.
Синтаксис
ForAll(Таблица, формула)
- Таблица - Обязательно. Это таблица, с которой нужно выполнить действия.
- Формула - Обязательно. Это формула, используемая для вычисления всех записей Table.
Примеры
Вычисления
В приведенных ниже примерах используется источник данныхSquares.
Для создания этого источника данных как коллекции установите в качестве значения свойства OnSelect элемента управления Button следующую формулу, перейдите в режим предварительного просмотра и выберите кнопку:
ClearCollect( Squares, [ "1", "4", "9" ] )
| Формула | Описание | Результат |
|---|---|---|
|
ForAll( Квадраты, Sqrt( Значение ) ) Sqrt(Квадраты) |
Для всех записей входной таблицы вычисляется квадратный корень из столбца Value. Функцию Sqrt можно также использовать с таблицей с одним столбцом, что позволяет выполнять этот пример без использования ForAll. |
|
| ForAll( квадраты, power( значение, 3 ) ) | Для всех записей входной таблицы значения столбца Value возводятся в куб. Функция Power не поддерживает таблицы с одним столбцом. ForAll Поэтому в этом случае необходимо использовать. |
|
Использование подключения
В приведенных ниже примерах используется источник данныхExpressions:
Для создания этого источника данных как коллекции установите в качестве значения свойства OnSelect элемента управления Button следующую формулу, перейдите в режим предварительного просмотра и выберите кнопку:
ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )
В этом примере используется также подключение к Microsoft Translator. Сведения о том, как добавить это подключение в приложение, см. в статье об управлении подключениями.
| Формула | Описание | Результат |
|---|---|---|
| ForAll(Expressions, MicrosoftTranslator.Translate(Value, es)) | Для всех записей в таблице Expressions содержимое столбца Value переводится на испанский язык (сокращение «es»). |
|
| ForAll(Expressions, MicrosoftTranslator.Translate(Value, fr)) | Для всех записей в таблице Expressions содержимое столбца Value переводится на французский язык (сокращение «fr»). |
|
Копирование таблицы
Иногда требуется фильтровать и сортировать данные, а также формировать их и обрабатывать. Power Apps предоставляет много функций для этого, таких как Filter, AddColumns и Sort. Power Apps обрабатывает каждую таблицу как значение, что позволяет легко проходить через формулы и использовать их.
И иногда вы хотите сделать копию этого результата для последующего использования, или вы хотите переместить информацию из одного источника данных в другой. В Power Apps предусмотрена функция Collect для копирования данных.
Но прежде чем сделать эту копию, тщательно подумайте, если это необходимо. Многие задачи можно решить путем фильтрации и формирования базового источника данных по запросу с помощью формулы. У копий есть ряд недостатков, в том числе:
- при наличии двух копий одних и тех же сведений одна из них может не синхронизироваться;
- для создания копии может потребоваться много памяти компьютера, значительная часть полосы пропускания и/или немало времени.
- Для большинства источников данных копирование не может быть делегировано, ограничивая объем перемещаемого объема данных.
В приведенных ниже примерах используется источник данныхProducts.
Для создания этого источника данных как коллекции установите в качестве значения свойства OnSelect элемента управления Button следующую формулу, перейдите в режим предварительного просмотра и выберите кнопку:
ClearCollect( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
)
)
Наша задача — обработать производную таблицу, содержащую только товары, для которых запрашиваемое количество превышает доступное и, как следствие, необходимо оформить заказ.
Выполнить ее можно двумя различными способами. Оба они дают одинаковый результат, однако у каждого из них есть свои преимущества и недостатки.
Формирование таблицы по запросу
Не создавайте копию! В любом случае можно использовать следующую формулу:
// Table shaping on demand, no need for a copy of the result
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Область записи создается с помощью функций Filter и AddColumns, которые выполняют сравнение и вычитание, соответственно, для полей 'Quantity Requested' и 'Quantity Available' каждой записи.
В этом примере функцию Filter можно делегировать. Это важно, поскольку она может найти все соответствующие условиям товары, даже если это всего несколько записей таблицы, в которой их миллионы. В настоящее время ShowColumns и AddColumns нельзя делегировать, поэтому фактическое количество продуктов, которые необходимо упорядочение, ограничено. Если вы знаете, что размер этого результата всегда будет относительно небольшим, такой подход хорошо.
И потому что мы не сделали копию, нет дополнительной копии информации для управления или падения даты.
ForAll по требованию
Другой подход заключается в том, чтобы использовать ForAll функцию для замены функций формирования таблиц:
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
Некоторым людям будет проще прочесть и записать такую формулу.
Ни одной из частей делигируемых ForAll . Вычисляется только первая часть таблицы Products , которая может быть проблемой, если эта таблица большая. Поскольку функцию Filter в предыдущем примере можно делегировать, возможно, она лучше подойдет для больших наборов данных.
Создание результата в виде коллекции
В некоторых ситуациях может потребоваться копия данных. Возможно, вам понадобится переместить сведения из одного источника данных в другой. В этом примере заказы оформляются с помощью таблицы NewOrder в системе поставщика. Для высокоскоростных взаимодействий с пользователем может потребоваться кэшировать локальную копию таблицы, чтобы не было задержки сервера.
Мы используем такой же способ формирования таблицы, как и в предыдущих двух примерах, но сохраним результат в виде коллекции:
ClearCollect( NewOrder,
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
)
ClearCollect( NewOrder,
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
ClearCollect и Collect не могут быть делегированы. В результате количество данных, которые можно переместить таким образом, ограничено.
Сбор в пределах ForAll
Наконец, мы можем выполнить сбор непосредственно в :ForAll
Clear( NewOrder );
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Collect( NewOrder,
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
Опять же, ForAll функция не может быть делегирована в настоящее время. Если наша таблица "Продукты " большая, посмотрите только на первый набор записей, ForAll и мы можем пропустить некоторые продукты, которые должны быть упорядочены. Но для таблиц, которые мы знаем, остаются небольшими, этот подход хорошо.
Обратите внимание, что мы не захватываем результат ForAll. Вызовы функции Collect , сделанные из него, возвращают источник данных NewOrder для всех записей, которые могут добавить к многочисленным данным, если мы записывали его.
Сопоставить таблицу в компоненте
См. Сопоставить таблицы.