Funkce ForAll v PowerAppsForAll function in PowerApps

Vypočítá hodnoty a provede akce u všech záznamů v tabulce.Calculates values and performs actions for all records of a table.

PopisDescription

Funkce ForAll vyhodnocuje vzorec pro všechny záznamy v tabulce.The ForAll function evaluates a formula for all records of a table. Vzorec může vypočítat hodnotu nebo provést akce, jako jsou třeba úpravy dat nebo práce s připojením.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.

Návratová hodnotaReturn value

Výsledek vyhodnocení jednotlivých vzorců se vrátí v tabulce ve stejném pořadí jako ve vstupní tabulce.The result of each formula evaluation is returned in a table, in the same order as the input table.

Pokud je výsledkem vzorce jedna hodnota, výslednou tabulku bude tvořit jeden sloupec.If the result of the formula is a single value, the resulting table will be a single column table. Pokud je výsledkem vzorce záznam, bude výsledná tabulka obsahovat záznamy se stejnými sloupci, jako má výsledný záznam.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

Pokud je výsledkem vzorce prázdná hodnota, nebude ve výsledné tabulce existovat pro danou vstupní tabulku žádný záznam.If the result of the formula is a blank value, then there will be no record in the result table for that input record. V takovém případě bude výsledná tabulka obsahovat méně záznamů než zdrojová tabulka.In this case, there will be fewer records in the result table than the source table.

Provedení akceTaking action

Vzorec může obsahovat funkce, které provádějí akci, jako je třeba změna záznamů zdroje dat pomocí funkcí Patch a Collect.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. Vzorec může také volat metody u připojení.The formula can also call methods on connections. Pomocí operátoru ; je také možné u záznamu provést více akcí.Multiple actions can be performed per record by using the ; operator. Tabulku, která je předmětem funkce ForAll, změnit nelze.You can't modify the table that is the subject of the ForAll function.

Když píšete vzorec, nezapomeňte, že záznamy je možné zpracovávat v libovolném pořadí a tam, kde je to možné, i paralelně.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. První záznam tabulky může být zpracován až po posledním záznamu.The first record of the table may be processed after the last record. Snažte se vyhnout závislostem řazení.Take care to avoid ordering dependencies. Z tohoto důvodu nemůžete ve funkci ForAll použít funkce UpdateContext, Clear a ClearCollect, protože mohou snadno uchovávat proměnné, které mohou být náchylné k tomuto chování.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. Můžete použít funkci Collect, ale pořadí, ve kterém se záznamy přidávají, není definováno.You can use Collect, but the order in which records are added is undefined.

Několik funkcí, které mění zdroje dat, včetně funkcí Collect, Remove, a Update, vrací jako svoji návratovou hodnotu změněný zdroj dat.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Tyto návratové hodnoty mohou být velké a mohou spotřebovávat výrazné množství prostředků, pokud se vrací pro každý záznam tabulky ForAll.These return values can be large and consume significant resources if returned for every record of the ForAll table. Můžete také zjistit, že tyto návratové hodnoty nejsou těmi, které jste očekávali, protože ForAll může fungovat paralelně a může izolovat vedlejší efekty těchto funkcí od získání jejich výsledku.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. Naštěstí pokud se návratová hodnota z funkce ForAll doopravdy nepoužije, k čemuž často dochází u funkcí změny dat, nevytvoří se návratová hodnota a není třeba si dělat starosti s prostředky nebo řazením.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. Pokud ale používáte výsledek funkce ForAll a některou z funkcí, které vrací zdroj dat, promyslete důkladně způsob strukturování daného výsledku a vyzkoušejte si to nejprve na malých sadách dat.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.

AlternativyAlternatives

Mnoho funkcí v Power Apps může zpracovat více hodnot současně pomocí tabulky s jedním sloupcem.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. Funkce Len například může zpracovat tabulku s textovými hodnotami a vrátit tabulku délek stejným způsobem jako funkce 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. V mnoha případech se tím můžete vyhnout použití funkce ForAll a dosáhnout tak efektivnějších a čitelnějších výsledků.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Dále je potřeba vzít v úvahu, že funkci ForAll není možné delegovat, ale jiné funkce ano, například funkci Filter.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

Delegování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.

SyntaxeSyntax

ForAll( Tabulka; vzorec )ForAll( Table, Formula )

  • Tabulka – povinné.Table - Required. Tabulka, u které se má akce provést.Table to be acted upon.
  • Vzorec – povinné.Formula - Required. Vzorec pro vyhodnocení všech záznamů tabulky.The formula to evaluate for all records of the Table.

PříkladyExamples

VýpočtyCalculations

Následující příklady používají zdroj dat Squares:The following examples use the Squares data source:

Pokud chcete vytvořit tento zdroj dat jako kolekci, nastavte vlastnost OnSelect ovládacího prvku Tlačítko na tento vzorec, otevřete režim náhledu a pak klikněte nebo klepněte na tlačítko: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" ] )
VzorecFormula PopisDescription VýsledekResult
ForAll( Squares; Sqrt( Value ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
U všech záznamů ve vstupní tabulce vypočítá druhou odmocninu sloupce Value.For all the records of the input table, calculates the square root of the Value column. Funkci Sqrt můžete také použít u tabulky s jedním sloupcem a tím provést tuto akci, aniž byste použili funkci 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 ) ) U všech záznamů ve vstupní tabulce umocní sloupec Value na třetí.For all the records of the input table, raises the Value column to the third power. Funkce Power nepodporuje tabulky s jedním sloupcem.The Power function does not support single-column tables. Z tohoto důvodu je v tomto případě třeba použít funkci ForAll.Therefore, ForAll must be used in this case.

Použití připojeníUsing a connection

Následující příklady používají zdroj dat Expressions:The following examples use the Expressions data source:

Pokud chcete vytvořit tento zdroj dat jako kolekci, nastavte vlastnost OnSelect ovládacího prvku Tlačítko na tento vzorec, otevřete režim náhledu a pak klikněte nebo klepněte na tlačítko: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" ] )

V tomto příkladu se také používá připojení Microsoft Translator.This example also uses a Microsoft Translator connection. Pokud chcete přidat toto připojení do své aplikace, najdete potřebné informace v tématu věnovanému správě připojení.To add this connection to your app, see the topic about how to manage connections.

VzorecFormula PopisDescription VýsledekResult
ForAll( Expressions; MicrosoftTranslator.Translate( Value; "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) U všech záznamů v tabulce Expressions přeloží obsah sloupce Value do španělštiny (zkráceně „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" ) ) U všech záznamů v tabulce Expressions přeloží obsah sloupce Value do francouzštiny (zkráceně „fr“).For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Kopírování tabulkyCopying a table

Někdy potřebujete filtrovat, strukturovat a řadit data nebo s nimi jinak pracovat.Sometimes you need to filter, shape, sort, and manipulate data. PowerApps poskytuje pro tyto účely řadu funkcí, jako jsou třeba Filter, AddColumns nebo Sort.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. PowerApps nakládá s každou tabulkou jako s hodnotou a umožňuje ji snadno používat ve vzorcích a dále využívat.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

Může se také stát, že bude chtít vytvořit kopii tohoto výsledku, abyste ho mohli později použít.And sometime you will want to make a copy of this result for later use. Nebo budete chtít přesunout informace z jednoho zdroje dat do jiného.Or you will want to move information from one data source to another. Pro kopírování dat poskytuje PowerApps funkci Collect.PowerApps provides the Collect function to copy data.

Než vytvoříte kopii, důkladně zvažte, zda ji opravdu potřebujete.But before you make that copy, think carefully if it is really needed. V mnoha situacích postačí filtrování a strukturování základního zdroje dat na vyžádání pomocí vzorce.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. Mezi nevýhody vytváření kopií patří:Some of the downsides to making a copy include:

  • Dvě kopie stejných informací způsobí, že jedna z nich nebude synchronizovaná.Two copies of the same information means that one of them can fall out of sync.
  • Vytvoření kopie může spotřebovat spoustu počítačové paměti, šířky pásma sítě a času.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • U většiny zdrojů dat není možné kopírování delegovat, což omezuje množství dat, které lze přesunout.For most data sources, copying cannot be delegated, limiting how much data can be moved.

Následující příklady používají zdroj dat Products:The following examples use the Products data source:

Pokud chcete vytvořit tento zdroj dat jako kolekci, nastavte vlastnost OnSelect ovládacího prvku Tlačítko na tento vzorec, otevřete režim náhledu a pak klikněte nebo klepněte na tlačítko: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 } ) )

Naším cílem je pracovat s odvozenou tabulkou obsahující jenom položky, u kterých se požaduje více, než je dostupné, a pro které potřebujeme zadat objednávku: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:

Tento úkol můžeme provést několika různými způsoby, které přinesou stejný výsledek s různými výhodami a nevýhodami.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Strukturování tabulky na vyžádáníTable shaping on demand

Nevytvářejte kopii.Don't make that copy! Následující vzorec můžeme použít všude, kde potřebujeme: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" )

Funkce Filter a AddColumns vytvoří obor záznamů, aby pomocí polí Quantity Requested a Quantity Available jednotlivých záznamů mohly provést operace porovnání a odečítání.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.

V tomto příkladu je možné funkci Filter delegovat.In this example, the Filter function can be delegated. To je důležité, protože tak můžete vyhledat všechny produkty, které splňují daná kritéria, i když se jedná jenom o pár záznamů z tabulky obsahující milióny položek.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. V tuto chvíli není možné funkce ShowColumns a AddColumns delegovat, takže skutečný počet produktů, které je třeba seřadit, bude omezen.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Pokud víte, že velikost tohoto výsledku bude vždycky relativně malá, je tento přístup v pořádku.If you know the size of this result will always be relatively small, this approach is fine.

A vzhledem k tomu, že jsme nevytvořili kopii, neexistuje žádná kopie informací, kterou byste museli spravovat nebo která by mohla zastarat.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

Funkce ForAll na vyžádáníForAll on demand

Další možností je použít funkci ForAll k nahrazení funkcí strukturování tabulky: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' } ) )

Čtení a vytvoření tohoto vzorce může být pro některé uživatele jednodušší.This formula may be simpler for some people to read and write.

Žádnou část funkce ForAll není možné delegovat.No part of the ForAll is delegable. Vyhodnotí se jenom první část tabulky Products, což může představovat problém v případě, že je tabulka velmi velká.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Protože funkci Filter v předchozím příkladu je možné delegovat, mohla by fungovat lépe u velkých sad dat.Because Filter could be delegated in the previous example, it could work better with large data sets.

Shromáždění výsledkuCollect the result

V některých situacích budete potřebovat kopii dat.In some situations, a copy of data may be required. Možná budete potřebovat přesunout informace z jednoho zdroje dat do jiného.You may need to move information from one data source to another. V tomto příkladu se objednávky zadávají prostřednictvím tabulky NewOrder v systému dodavatele.In this example, orders are placed through a NewOrder table on a vendor's system. U vysokorychlostních uživatelských interakcí můžete chtít uložit místní kopii tabulky do mezipaměti, aby nedocházelo k latenci serveru.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

Použijeme strukturování tabulky jako v předchozích dvou příkladech, ale výsledek zaznamenáme v kolekci: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' } ) ) )

Funkce ClearCollect a Collect není možné delegovat.ClearCollect and Collect can't be delegated. V důsledku toho je množství dat, které lze tímto způsobem přesunout, omezeno.As a result the amount of data that can be moved in this manner is limited.

Shromažďování v rámci funkce ForAllCollect within ForAll

Nakonec provedeme akci Collect přímo v rámci funkce 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' } ) ) )

Ani v tomto případě nelze funkci ForAll delegovat.Again, the ForAll function can't be delegated at this time. Pokud je naše tabulka Products velká, funkce ForAll se podívá jenom na první sadu záznamů, a je tedy možné, že nám uniknou některé produkty, které je třeba seřadit.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. Ale u tabulek, u kterých víme, že zůstanou malé, je tento přístup v pořádku.But for tables that we know will remain small, this approach is fine.

Všimněte si, že zaznamenáváme výsledek funkce ForAll.Note that we are not capturing the result of the ForAll. Volání funkce Collect přímo z této funkce vrátí zdroj dat NewOrder pro všechny záznamy, což by mohlo vést k nárůstu objemu dat, pokud bychom je zaznamenávali.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.