Функция ForAll в PowerAppsForAll function in PowerApps

Вычисляет значения и выполняет действия для всех записей в таблице.Calculates values and performs actions for all records of a table.

ОписаниеDescription

Функция ForAll вычисляет формулы для всех записей таблицы.The ForAll function evaluates a formula for all records of a table. Формула может рассчитать значение и (или) выполнить действия, например изменить данные или работу с подключением.The formula can calculate a value and/or perform actions, such as modifying data or working with a connection.

Поля записи, обрабатываемой в настоящее время, доступны в формуле.Fields of the record currently being processed are available within the formula. Их можно указывать по имени, как и любое другое значение.You simply reference them by name as you would any other value. Кроме того, можно использовать ссылки на свойства элементов управления и другие значения из приложения.You can also reference control properties and other values from throughout your app. Чтобы узнать больше, можно изучить примеры ниже и ознакомиться с работой с областью записи.For more details, see the examples below and working with record scope.

Возвращаемое значениеReturn value

Результат каждого вычисления формулы возвращается в таблице в том же порядке, что и во входной таблице.The result of each formula evaluation is returned in a table, in the same order as the input table.

Если результат формулы — одиночное значение, результирующая таблица будет состоять из одного столбца.If the result of the formula is a single value, the resulting table will be a single column table. Если результат формулы — запись, результирующая таблица будет содержать записи с теми же столбцами, что и результирующая запись.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

Если результат формулы — пустое значение, в результирующей таблице не будет записи для такой входной записи.If the result of the formula is a blank value, then there will be no record in the result table for that input record. В этом случае в результирующей таблице будет меньше записей, чем в исходной.In this case, there will be fewer records in the result table than the source table.

Выполнение действияTaking action

Формула может содержать функции, выполняющие действия, например изменяющие записи из источника данных с помощью функций Patch и Collect.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. Формула также может вызывать методы при подключении.The formula can also call methods on connections. Воспользовавшись оператором ;, для каждой записи можно выполнить несколько действий.Multiple actions can be performed per record by using the ; operator. Таблицу, к которой применяется функция ForAll, изменить невозможно.You can't modify the table that is the subject of the ForAll function.

При создании формулы следует учитывать, что записи могут обрабатываться в любом порядке и (по возможности) параллельно.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. Первая запись таблицы может быть обработана после последней.The first record of the table may be processed after the last record. Поэтому следует избегать зависимостей от порядка расположения.Take care to avoid ordering dependencies. По этой причине функции UpdateContext, Clear и ClearCollect нельзя использовать с функцией ForAll, поскольку вполне может оказаться, что они применяются для хранения переменных, восприимчивых к такому эффекту.For this reason, you can't use the UpdateContext, Clear, and ClearCollect functions within a ForAll function because they could easily be used to hold variables that would be susceptible to this effect. Вы можете использовать функцию Collect, но порядок добавления записей должен быть неопределенным.You can use Collect, but the order in which records are added is undefined.

Некоторые функции, которые изменяют источники данных, в том числе Collect, Remove и Update, возвращают измененный источник данных в качестве значения.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Такие возвращаемые значения могут оказаться большими, так что, если они используются для каждой записи таблицы ForAll, при их обработке могут потребляться значительные ресурсы.These return values can be large and consume significant resources if returned for every record of the ForAll table. Также может оказаться, что эти возвращенные значения не такие, какими должны быть, поскольку ForAll может выполняться параллельно и отделять побочные эффекты этих функций от процесса получения их результатов.You may also find that these return values are not what you expect, because ForAll can operate in parallel and may separate the side effects of these functions from obtaining their result. К счастью, если возвращаемое значение ForAll фактически не используется, что бывает довольно часто в случае функций изменения данных, то возвращаемое значение не создается, а проблемы, связанные с ресурсами или упорядочением, не возникают.Fortunately, if the return value from ForAll is not actually used, which is often the case with data modification functions, then the return value will not be created and there are no resource or ordering concerns. Но если вы используете результат ForAll и одну из функций, возвращающих источник данных, тщательно продумайте структуру результата и сначала испытайте их на небольшом наборе данных.But if you are using the result of a ForAll and one of the functions that returns a data source, think carefully about how you structure the result and try it out first on small data sets.

Альтернативные вариантыAlternatives

Многие функции в PowerApps могут обрабатывать несколько значений одновременно, используя таблицу с одним столбцом.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. Например, функция Len, как и ForAll, может обработать таблицу текстовых значений и возвратить таблицу значений длины.For example, the Len function can process a table of text values, returning a table of lengths, in the same manner that ForAll could. Во многих случаях это избавляет от необходимости использовать функцию ForAll и может оказаться эффективнее и удобнее для чтения, чем при ее применении.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Важно также учитывать, что, в отличие от некоторых других функций, например Filter, ForAll не поддерживает делегирование.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

ДелегированиеDelegation

При использовании с источником данных эту функцию нельзя делегировать.When used with a data source, this function can't be delegated. Извлекается только первая часть источника данных, после чего применяется функция.Only the first portion of the data source will be retrieved and then the function applied. Результат может не отражать всей картины.The result may not represent the complete story. В этом случае на этапе создания появляется синяя точка, которая напоминает об этом ограничении и о возможности воспользоваться альтернативными вариантами, для которых допускается делегирование.A blue dot will appear at authoring time to remind you of this limitation and to suggest switching to delegable alternatives where possible. Дополнительные сведения см. в обзоре делегирования.For more information, see the delegation overview.

СинтаксисSyntax

ForAll( Table, Formula )ForAll( Table, Formula )

  • Table — обязательный аргумент.Table - Required. Это таблица, с которой нужно выполнить действия.Table to be acted upon.
  • Formula — обязательный аргумент.Formula - Required. Это формула, используемая для вычисления всех записей Table.The formula to evaluate for all records of the Table.

ПримерыExamples

ВычисленияCalculations

В приведенных ниже примерах используется источник данных Squares.The following examples use the Squares data source:

Для создания этого источника данных как коллекции установите в качестве значения свойства OnSelect элемента управления Кнопка следующую формулу, перейдите в режим предварительного просмотра и нажмите кнопку.To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Squares, [ "1", "4", "9" ] )ClearCollect( Squares, [ "1", "4", "9" ] )
ФормулаFormula ОписаниеDescription Возвращаемый результатResult
ForAll( Squares, Sqrt( Value ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
Для всех записей входной таблицы вычисляется квадратный корень из столбца Value.For all the records of the input table, calculates the square root of the Value column. Функцию Sqrt можно также использовать с таблицей, состоящей из одного столбца, благодаря чему в этом примере можно избежать использования ForAll.The Sqrt function can also be used with a single-column table, making it possible perform this example without using ForAll.
ForAll( Squares, Power( Value, 3 ) )ForAll( Squares, Power( Value, 3 ) ) Для всех записей входной таблицы значения столбца Value возводятся в куб.For all the records of the input table, raises the Value column to the third power. Функция Power не поддерживает таблицы из одного столбца.The Power function does not support single-column tables. Таким образом, в данном случае следует использовать функцию ForAll.Therefore, ForAll must be used in this case.

Использование подключенияUsing a connection

В приведенных ниже примерах используется источник данных Expressions.The following examples use the Expressions data source:

Для создания этого источника данных как коллекции установите в качестве значения свойства OnSelect элемента управления Кнопка следующую формулу, перейдите в режим предварительного просмотра и нажмите кнопку.To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the button:

  • ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

В этом примере используется также подключение к Microsoft Translator.This example also uses a Microsoft Translator connection. Сведения о том, как добавить это подключение в приложение, см. в разделе об управлении подключениями.To add this connection to your app, see the topic about how to manage connections.

ФормулаFormula ОписаниеDescription Возвращаемый результатResult
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Для всех записей в таблице Expressions содержимое столбца Value переводится на испанский язык (сокращение «es»).For all the records in the Expressions table, translate the contents of the Value column into Spanish (abbreviated "es").
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Для всех записей в таблице Expressions содержимое столбца Value переводится на французский язык (сокращение «fr»).For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Копирование таблицыCopying a table

Иногда требуется фильтровать и сортировать данные, а также формировать их и обрабатывать.Sometimes you need to filter, shape, sort, and manipulate data. В PowerApps для этого предусмотрен ряд функций, в том числе Filter, AddColumns и Sort.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. PowerApps интерпретирует каждую таблицу как значение, что обеспечивает быстрое прохождение формул и удобство использования.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

При этом иногда требуется создать копию такого результата для дальнейшего использованияAnd sometime you will want to make a copy of this result for later use. или переместить сведения из одного источника данных в другой.Or you will want to move information from one data source to another. В PowerApps предусмотрена функция Collect для копирования данных.PowerApps provides the Collect function to copy data.

Но прежде чем создавать эту копию, хорошо подумайте, действительно ли она необходима.But before you make that copy, think carefully if it is really needed. Многие задачи можно решить путем фильтрации и формирования базового источника данных по запросу с помощью формулы.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. У копий есть ряд недостатков, в том числе:Some of the downsides to making a copy include:

  • при наличии двух копий одних и тех же сведений одна из них может не синхронизироваться;Two copies of the same information means that one of them can fall out of sync.
  • для создания копии может потребоваться много памяти компьютера, значительная часть полосы пропускания и/или немало времени.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • Для большинства источников данных копирование нельзя делегировать, поэтому при его использовании количество перемещаемых данных ограничено.For most data sources, copying cannot be delegated, limiting how much data can be moved.

В приведенных ниже примерах используется источник данных Products.The following examples use the Products data source:

Для создания этого источника данных как коллекции установите в качестве значения свойства OnSelect элемента управления Кнопка следующую формулу, перейдите в режим предварительного просмотра и нажмите кнопку.To create this data source as a collection, set the OnSelect property of a Button control to this formula, open Preview mode, and then click or tap the 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 } ) )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 } ) )

Наша задача — обработать производную таблицу, содержащую только товары, для которых запрашиваемое количество превышает доступное и, как следствие, необходимо оформить заказ.Our goal is to work with a derivative table that includes only the items where more has been requested than is available, and for which we need to place an order:

Выполнить ее можно двумя различными способами. Оба они дают одинаковый результат, однако у каждого из них есть свои преимущества и недостатки.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Формирование таблицы по запросуTable shaping on demand

Не создавайте копию!Don't make that copy! В любом случае можно использовать следующую формулу:We can use the following formula anywhere we need:

  • ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" )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' каждой записи.A record scope is created by the Filter and AddColumns functions to perform the comparison and subtraction operations, respectively, with the 'Quantity Requested' and 'Quantity Available' fields of each record.

В этом примере функцию Filter можно делегировать.In this example, the Filter function can be delegated. Это важно, поскольку она может найти все соответствующие условиям товары, даже если это всего несколько записей таблицы, в которой их миллионы.This is important, as it can find all the products that meet the criteria, even if that is only a few records out of a table of millions. В настоящее время функции ShowColumns и AddColumns делегировать нельзя, поэтому фактическое число товаров, которые необходимо заказать, будет ограничено.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Если известно, что размер данного результата всегда будет относительно небольшим, этот способ прекрасно подходит.If you know the size of this result will always be relatively small, this approach is fine.

Кроме того, поскольку мы не создавали копию, у нас не будет лишних и устаревших копий данных, которыми необходимо управлять.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

ForAll по запросуForAll on demand

Другой способ — использовать функцию ForAll вместо функций формирования таблицы:Another approach is to use the ForAll function to replace the table-shaping functions:

  • ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) )ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) )

Некоторым людям будет проще прочесть и записать такую формулу.This formula may be simpler for some people to read and write.

Ни одна из частей ForAll не поддерживает делегирование.No part of the ForAll is delegable. Вычисления выполняются только для первой части таблицы Products, что может привести к определенным проблемам, если она очень большая.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Поскольку функцию Filter в предыдущем примере можно делегировать, возможно, она лучше подойдет для больших наборов данных.Because Filter could be delegated in the previous example, it could work better with large data sets.

Создание результата в виде коллекцииCollect the result

В некоторых ситуациях может потребоваться копия данных.In some situations, a copy of data may be required. Возможно, вам понадобится переместить сведения из одного источника данных в другой.You may need to move information from one data source to another. В этом примере заказы оформляются с помощью таблицы NewOrder в системе поставщика.In this example, orders are placed through a NewOrder table on a vendor's system. Для высокоскоростного взаимодействия с пользователем можно предусмотреть кэширование локальной копии таблицы, чтобы избежать задержек не сервере.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

Мы используем такой же способ формирования таблицы, как и в предыдущих двух примерах, но сохраним результат в виде коллекции:We use the same table shaping as the previous two examples, but we capture the result into a collection:

  • ClearCollect( NewOrder, ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" ) )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( NewOrder, ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

ClearCollect и Collect делегировать нельзя.ClearCollect and Collect can't be delegated. В результате количество данных, которые можно переместить таким образом, ограничено.As a result the amount of data that can be moved in this manner is limited.

Выполнение функции Collect в ForAllCollect within ForAll

Наконец, мы можем выполнить операцию Collect непосредственно в функции ForAll:Finally, we can perform the Collect directly within the ForAll:

  • Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )Clear( ProductsToOrder ); ForAll( Products, If( 'Quantity Requested' > 'Quantity Available', Collect( NewOrder, { Product: Product, 'Quantity To Order': 'Quantity Requested' - 'Quantity Available' } ) ) )

Опять же, на данный момент функцию ForAll делегировать нельзя.Again, the ForAll function can't be delegated at this time. Если таблица Products большая, функция ForAll обработает только первый набор записей, и мы можем пропустить некоторые товары, которые необходимо заказать.If our Products table is large, ForAll will look at the first set of records only and we may miss some products that need to be ordered. Однако если известно, что таблицы будут оставаться небольшими, этот метод прекрасно подходит.But for tables that we know will remain small, this approach is fine.

Обратите внимание, что мы не записываем результат функции ForAll.Note that we are not capturing the result of the ForAll. Выполненные из нее вызовы функции Collect возвращают источник данных NewOrder для всех записей, поэтому если записывать результат, данных может оказаться слишком много.The Collect function calls made from within it will return the NewOrder data source for all the records, which could add up to a lot of data if we were capturing it.