PowerApps의 ForAll 함수ForAll 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

수식에는 작업(예: PatchCollect 함수를 사용하여 데이터 원본의 레코드를 수정하는 작업)을 수행하는 함수가 포함될 수 있습니다.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. 이러한 이유로 인해, ForAll 함수 내에서 UpdateContext, Clear, ClearCollect 함수를 사용할 수 업습니다. 해당 함수는 이러한 효과에 영향을 받기 쉬운 변수를 보유하는 데 쉽게 사용될 수 있기 때문입니다.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.

또 다른 고려 사항은, ForAll은 위임이 불가능한 반면 Filter와 같은 다른 함수는 위임이 가능하다는 점입니다.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:

이 데이터 원본을 컬렉션으로 만들려면 Button 컨트롤의 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:

이 데이터 원본을 컬렉션으로 만들려면 Button 컨트롤의 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:

이 데이터 원본을 컬렉션으로 만들려면 Button 컨트롤의 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" )

각 레코드의 'Quantity Requested''Quantity Available' 필드를 각각 사용하여 비교 및 빼기 연산을 수행하기 위해 FilterAddColumns 함수를 사용하여 레코드 범위가 만들어집니다.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. 현재 ShowColumnsAddColumns는 위임이 불가능하므로 주문해야 하는 실제 제품 수는 제한됩니다.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.

주문형 ForAllForAll 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.

결과 CollectCollect 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' } ) ) )

ClearCollectCollect는 위임할 수 없습니다.ClearCollect and Collect can't be delegated. 따라서 이 방식으로 이동할 수 있는 데이터의 양은 제한됩니다.As a result the amount of data that can be moved in this manner is limited.

ForAll 내 CollectCollect within ForAll

마지막으로 ForAll 내에서 Collect를 직접 수행할 수 있습니다.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.