Funktionen ForAll i PowerAppsForAll function in PowerApps

Beregner værdier og udfører handlinger for alle posterne i en tabel.Calculates values and performs actions for all records of a table.

BeskrivelseDescription

Funktionen ForAll evaluerer en formel for alle posterne i en tabel.The ForAll function evaluates a formula for all records of a table. Formlen kan beregne en værdi/udføre handlinger, f.eks. ændre data eller arbejde med en forbindelse.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.

ReturværdiReturn value

Resultatet af hver formelevaluering returneres i en tabel i samme rækkefølge som i inputtabellen.The result of each formula evaluation is returned in a table, in the same order as the input table.

Hvis resultatet af formlen er en enkelt værdi, vil den returnerede tabel indeholde én kolonne.If the result of the formula is a single value, the resulting table will be a single column table. Hvis resultatet af formlen er en post, vil den returnerede tabel indeholde poster med de samme kolonner som resultatposten.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

Hvis resultatet af formlen er værdien blank, er der ingen post i den returnerede tabel for den inputpost.If the result of the formula is a blank value, then there will be no record in the result table for that input record. I dette tilfælde vil der være færre poster i den returnerede tabel end i kildetabellen.In this case, there will be fewer records in the result table than the source table.

Udfør en handlingTaking action

Formlen kan indeholde funktioner, der udfører en handling, f.eks. ændre posterne i en datakilde ved hjælp af funktionerne Patch og Collect.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. Formlen kan også foretage kald til metoder på forbindelser.The formula can also call methods on connections. Der kan udføres flere handlinger pr. post ved hjælp af operatoren ;.Multiple actions can be performed per record by using the ; operator. Du kan ikke ændre den tabel, som funktionen ForAll køres mod.You can't modify the table that is the subject of the ForAll function.

Når du skriver formlen, skal du huske på, at poster kan behandles i enhver rækkefølge, og at de kan blive behandlet parallelt, når det er muligt.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. Den første post i tabellen kan derfor bliver behandlet efter den sidste post.The first record of the table may be processed after the last record. Derfor skal du være opmærksom på, at andre elementer ikke skal være afhængige af rækkefølgen.Take care to avoid ordering dependencies. Du kan derfor ikke bruge funktionerne UpdateContext, Clear og ClearCollect i funktionen ForAll, da de nemt kan bruges til at have variabler, der vil blive påvirket af dette.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. Du kan bruge Collect, men den rækkefølge, som posterne tilføjes i, kan ikke defineres.You can use Collect, but the order in which records are added is undefined.

Flere af de funktioner, der ændrer datakilder, herunder Collect, Remove og Update, returnerer den ændrede datakilde som returværdi.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Returværdierne kan være store og lægge beslag på mange ressourcer, hvis de returneres for alle poster i den tabel, som ForAll bruges mod.These return values can be large and consume significant resources if returned for every record of the ForAll table. Du kan også komme ud for, at du ikke får de forventede returværdier, da ForAll kan køre parallelt og derfor kan medføre, at disse funktioner ikke får noget resultat.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. Hvis returværdien fra ForAll ikke skal bruges, hvilke ofte er tilfældet med de funktioner, der ændrer data, oprettes der ikke nogen returværdi, og der vil derfor ikke være nogen problemer i forhold til ressourceforbrug og rækkefølge.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. Hvis du bruger resultatet af en ForAll og en af de funktioner, der returnerer en datakilde, skal du overveje, hvordan du strukturerer resultatet og først afprøve det på små datasæt.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.

AlternativerAlternatives

Mange funktioner i PowerApps kan behandle flere værdier på én gang ved hjælp af en tabel med én kolonne.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. Funktionen Len kan f.eks. behandle en tabel med tekstværdier og returnere en tabel med længdeværdier på samme måde som funktionen 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. Dette kan i mange tilfælde fjerne behovet for at bruge ForAll, det kan være mere effektivt, og det kan være nemmere at læse koden.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Husk også på, at ForAll ikke kan delegeres, selvom nogle andre funktioner kan, f.eks. Filter.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

DelegeringDelegation

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.

SyntaksSyntax

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

  • Table – påkrævet.Table - Required. Den tabel, funktionen skal køres på.Table to be acted upon.
  • Formula – påkrævet.Formula - Required. Den formel, der skal evalueres for alle posterne i Table.The formula to evaluate for all records of the Table.

EksemplerExamples

BeregningerCalculations

I de efterfølgende eksempler bruges datakilden Squares:The following examples use the Squares data source:

Hvis du vil oprette denne datakilde som en samling, skal du angive egenskaben OnSelect for et kontrolelement af typen Button til denne formel, åbne eksempeltilstand og derefter klikke eller trykke på knappen: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" ] )
FormelFormula BeskrivelseDescription ResultatResult
ForAll( Squares, Sqrt( Value ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
Kvadratroden af kolonnen Value beregnes for alle posterne i inputtabellen.For all the records of the input table, calculates the square root of the Value column. Funktionen Sqrt kan også bruges med en tabel med én kolonne, så eksemplet kan køres uden 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 ) ) Værdien i kolonnen Value opløftes til tredje potens for alle posterne i inputtabellen.For all the records of the input table, raises the Value column to the third power. Funktionen Power understøtter ikke tabeller med én kolonne.The Power function does not support single-column tables. Derfor skal du bruge ForAll i dette tilfælde.Therefore, ForAll must be used in this case.

Brug af en forbindelseUsing a connection

I de efterfølgende eksempler bruges datakilden Expressions:The following examples use the Expressions data source:

Hvis du vil oprette denne datakilde som en samling, skal du angive egenskaben OnSelect for et kontrolelement af typen Button til denne formel, åbne eksempeltilstand og derefter klikke eller trykke på knappen: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" ] )

Dette eksempel bruger også en forbindelse til Microsoft Translator.This example also uses a Microsoft Translator connection. Hvis du vil tilføje denne forbindelse i din app, skal du se emnet om at administrere forbindelser.To add this connection to your app, see the topic about how to manage connections.

FormelFormula BeskrivelseDescription ResultatResult
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) For alle posterne i tabellen Expressions oversættes indholdet af kolonnen Value til spansk (forkortet til "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" ) ) For alle posterne i tabellen Expressions oversættes indholdet af kolonnen Value til fransk (forkortet til "fr").For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Kopiér en tabelCopying a table

Nogle gange har du brug for at filtrere, forme, sortere og manipulere data.Sometimes you need to filter, shape, sort, and manipulate data. PowerApps indeholder en række funktioner til dette, f.eks. funktionerne Filter, AddColumns og Sort.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. PowerApps behandler hver tabel som en værdi, så det er nemt at beregne og bruge formler.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

Nogle gange vil du også have brug for en kopi af resultatet til senere brug.And sometime you will want to make a copy of this result for later use. Eller du vil flytte oplysningerne fra en datakilde til en anden.Or you will want to move information from one data source to another. I PowerApps kan du bruge funktionen Collect til at kopiere data.PowerApps provides the Collect function to copy data.

Inden du opretter kopien, skal du dog overveje, om du rent faktisk har brug for den.But before you make that copy, think carefully if it is really needed. Der er mange situationer, hvor du kan bruge en formel til at filtrere og forme den underliggende datakilde efter behov.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. Nogle af ulemperne ved at oprette en kopi omfatter:Some of the downsides to making a copy include:

  • Med to kopier af de samme oplysninger kan den ene af dem blive forældet.Two copies of the same information means that one of them can fall out of sync.
  • Hvis du opretter en kopi, kan det forbruge computerhukommelse, netværksbåndbredde og/eller tid.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • For de fleste datakilder kan kopiering ikke delegeres, og det begrænser, hvor mange data der kan flyttes.For most data sources, copying cannot be delegated, limiting how much data can be moved.

I de efterfølgende eksempler bruges datakilden Products:The following examples use the Products data source:

Hvis du vil oprette denne datakilde som en samling, skal du angive egenskaben OnSelect for et kontrolelement af typen Button til denne formel, åbne eksempeltilstand og derefter klikke eller trykke på knappen: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 } ) )

Vores mål er at arbejde med en afledt tabel, der kun indeholder de varer, hvor der er anmodet om flere, end der er tilgængelige, og som vi skal oprette en ordre for: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:

Opgaven kan udføres på forskellige måder, som alle giver det samme resultat, og som har hver deres fordele og ulemper.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Tabelformning efter behovTable shaping on demand

Opret ikke en kopi!Don't make that copy! Du kan i stedet bruge denne formel, når der er brug for det: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" )

Der oprettes et postområde ved hjælp af funktionerne Filter og AddColumns for at udføre sammenligning og subtrahering med felterne 'Quantity Requested' og 'Quantity Available' for hver post.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.

I dette eksempel kan funktionen Filter delegeres.In this example, the Filter function can be delegated. Dette er vigtigt, da det kan finde alle de produkter, der opfylder kriterierne, også selv der kun er nogle få poster i en tabel med millioner af poster.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. På nuværende tidspunkt kan ShowColumns og AddColumns ikke delegeres, så det faktiske antal produkter, der skal bestilles, vil være begrænset.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Denne fremgangsmåde kan bruges, hvis du ved, at størrelsen af resultatet altid vil være relativt lille.If you know the size of this result will always be relatively small, this approach is fine.

Da vi ikke har oprettet en kopi, er der ikke nogen ekstra kopi af oplysninger, som skal administreres eller bliver forældede.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

ForAll efter behovForAll on demand

En anden fremgangsmåde er at bruge funktionen ForAll for at erstatte funktioner til tabelformning: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' } ) )

Denne formel kan være lettere at læse og skrive for visse brugere.This formula may be simpler for some people to read and write.

Ingen del af funktionen ForAll kan delegeres.No part of the ForAll is delegable. Det er kun den første del af tabellen Products, der evalueres, og det kan være et problem, hvis tabellen er meget stor.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Da Filter kunne delegeres i det tidligere eksempel, vil den virke bedre med store datasæt.Because Filter could be delegated in the previous example, it could work better with large data sets.

Indsaml resultatetCollect the result

I nogle situationer kan det være nødvendigt med en kopi af dataene.In some situations, a copy of data may be required. Du skal måse flytte oplysninger fra en datakilde til en anden.You may need to move information from one data source to another. I dette eksempel placeres ordrerne via tabellen NewOrder i en leverandørs system.In this example, orders are placed through a NewOrder table on a vendor's system. Du kan give brugerne hurtigere interaktioner ved at cachelagre en lokal kopi af tabellen, så du undgår serverforsinkelser.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

Vi bruger den samme tabelformning som i de to foregående eksempler, men resultatet gemmes i en samling: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 og Collect kan ikke delegeres.ClearCollect and Collect can't be delegated. Det er derfor begrænset, hvor mange data der kan flyttes på denne måde.As a result the amount of data that can be moved in this manner is limited.

Collect i ForAllCollect within ForAll

Det er også muligt at udføre en Collect direkte i 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' } ) ) )

Igen kan funktionen ForAll ikke delegeres på nuværende tidspunkt.Again, the ForAll function can't be delegated at this time. Hvis tabellen Products er stor, vil ForAll kun søge efter de første sæt af poster, og vi kan overse nogle af de produkter, der skal bestilles.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. Men for de tabeller, der forbliver små, er denne fremgangsmåde fin.But for tables that we know will remain small, this approach is fine.

Bemærk, at vi ikke registrerer resultatet af ForAll.Note that we are not capturing the result of the ForAll. Funktionskaldene til Collect vil returnere datakilden NewOrder for alle posterne, hvilket kan blive til rigtig mange data, hvis resultatet af hvert kald registreres.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.