Funkcja ForAll w usłudze PowerAppsForAll function in PowerApps

Oblicza wartości i wykonuje akcje dla wszystkich rekordów tabeli.Calculates values and performs actions for all records of a table.

OpisDescription

Funkcja ForAll ocenia formułę dla wszystkich rekordów tabeli.The ForAll function evaluates a formula for all records of a table. Formuła może obliczać wartość i/lub wykonywać akcje, takie jak modyfikowanie danych lub współdziałanie z połączeniem.The formula can calculate a value and/or perform actions, such as modifying data or working with a connection.

Pola aktualnie przetwarzanego rekordu są dostępne w formule.Fields of the record currently being processed are available within the formula. Do odwoływania się do nich służy nazwa — tak jak w przypadku każdej innej wartości.You simply reference them by name as you would any other value. Do właściwości kontrolki i innych wartości można się też odwoływać z całej aplikacji.You can also reference control properties and other values from throughout your app. Aby uzyskać więcej informacji, zobacz przykłady poniżej i pracę z zakresami rekordów.For more details, see the examples below and working with record scope.

Wartość zwracanaReturn value

Wynik każdej oceny formuły jest zwracany w tabeli, w takiej samej kolejności, jak w tabeli wejściowej.The result of each formula evaluation is returned in a table, in the same order as the input table.

Jeśli wynik formuły jest pojedynczą wartością, tabela wynikowa będzie tabelą jednokolumnową.If the result of the formula is a single value, the resulting table will be a single column table. Jeśli wynik formuły jest rekordem, tabela wynikowa będzie zawierała rekordy z takimi samymi kolumnami, jak rekord wyniku.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

Jeśli wynikiem formuły jest wartość pusta, tabela wynikowa nie będzie zawierała żadnego rekordu dla tego rekordu wejściowego.If the result of the formula is a blank value, then there will be no record in the result table for that input record. W takim przypadku w tabeli wynikowej będzie mniej rekordów niż w tabeli źródłowej.In this case, there will be fewer records in the result table than the source table.

Podejmowanie akcjiTaking action

Formuła może zawierać funkcje podejmujące akcje, takie jak modyfikowanie rekordów źródła danych przy użyciu funkcji Patch i Collect.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. Formuła może również wywoływać metody dla połączeń.The formula can also call methods on connections. W celu wykonania wielu akcji na rekordzie można użyć operatora ;.Multiple actions can be performed per record by using the ; operator. Nie można zmodyfikować tabeli, która jest obiektem funkcji ForAll.You can't modify the table that is the subject of the ForAll function.

Podczas zapisywania formuły należy pamiętać, że rekordy mogą być przetwarzane w dowolnej kolejności i, jeśli to możliwe, równolegle.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. Pierwszy rekord tabeli może być przetwarzany po ostatnim rekordzie.The first record of the table may be processed after the last record. Należy uważać, aby uniknąć zależności kolejności.Take care to avoid ordering dependencies. Z tego powodu nie można używać funkcji UpdateContext, Clear i ClearCollect w obrębie funkcji ForAll, ponieważ mogą one być łatwo używane do przechowywania zmiennych, które byłyby podatne na ten efekt.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. Można użyć funkcji Collect, ale kolejność, w której dodawane są rekordy, jest niezdefiniowana.You can use Collect, but the order in which records are added is undefined.

Kilka funkcji, które modyfikują źródeł danych, takich jak Collect, Remove i Update, zwraca zmienione źródło danych jako wartość zwracaną.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Te wartości zwracane mogą być duże i wykorzystywać istotne zasoby, jeśli są zwracane dla każdego rekordu tabeli ForAll.These return values can be large and consume significant resources if returned for every record of the ForAll table. Możesz również stwierdzić, że te wartości zwracane są nie zgodne z oczekiwaniami, ponieważ funkcja ForAll może działać równolegle i może oddzielić efekty uboczne tych funkcji od uzyskiwania ich wyników.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 szczęście jeśli wartość zwracana funkcji ForAll nie jest w rzeczywistości używana, co jest częste w przypadku funkcji modyfikacji danych, wówczas wartość zwracana nie zostanie utworzona i nie będzie żadnych problemów z zasobami czy porządkowaniem.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. Ale w przypadku używania wyniku funkcji ForAll i jednej z funkcji, które zwracają źródło danych, należy dobrze przemyśleć strukturę wyniku i wypróbować go najpierw na małych zestawach danych.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.

AlternatywyAlternatives

Wiele funkcji w usłudze PowerApps może przetwarzać więcej niż jedną wartość jednocześnie przy użyciu jednokolumnowej tabeli.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. Na przykład funkcja Len może przetworzyć tabelę wartości tekstowych, zwracając tabelę długości, w taki sam sposób, jak funkcja 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. Może ona wyeliminować konieczność użycia funkcji ForAll w wielu przypadkach, może być bardziej efektywna i jest łatwiejsza w odczycie.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Kolejna kwestia jest związana z tym, że funkcja ForAll nie jest możliwa do delegowania, podczas gdy inne funkcje, takie jak Filter, mogą być delegowane.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

DelegowanieDelegation

Tej funkcji nie można delegować w przypadku używania jej ze źródłem danych.When used with a data source, this function can't be delegated. Ze źródła zostanie pobrana tylko pierwsza część danych, na których zostanie zastosowana funkcja.Only the first portion of the data source will be retrieved and then the function applied. Wynik może nie być reprezentacyjny dla całości.The result may not represent the complete story. Podczas tworzenia zostanie wyświetlona niebieska kropka przypominająca o tym ograniczeniu i sugerująca przejście na opcję obsługującą delegowanie, jeśli jest to możliwe.A blue dot will appear at authoring time to remind you of this limitation and to suggest switching to delegable alternatives where possible. Aby uzyskać więcej informacji, zobacz omówienie delegowania.For more information, see the delegation overview.

SkładniaSyntax

ForAll( Tabela, Formuła )ForAll( Table, Formula )

  • Tabela — wymagane.Table - Required. Tabela, dla której mają zostać podjęte działania.Table to be acted upon.
  • Formuła — wymagane.Formula - Required. Formuła oceniana dla wszystkich rekordów Tabeli.The formula to evaluate for all records of the Table.

PrzykładyExamples

ObliczeniaCalculations

W poniższych przykładach używane jest źródło danych Squares:The following examples use the Squares data source:

Aby utworzyć to źródło danych, ustaw właściwość OnSelect kontrolki Przycisk na poniższą formułę, otwórz tryb podglądu, a następnie kliknij lub naciśnij przycisk: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" ] )
FormułaFormula OpisDescription WynikResult
ForAll( Squares, Sqrt( Value ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
Dla wszystkich rekordów tabeli wejściowej oblicza pierwiastek kwadratowy wartości w kolumnie Value.For all the records of the input table, calculates the square root of the Value column. Funkcji Sqrt można również używać w tabeli jednokolumnowej, co umożliwia wykonanie tego przykładu bez użycia funkcji 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 ) ) Dla wszystkich rekordów tabeli wejściowej podnosi wartość kolumny Value do potęgi trzeciej.For all the records of the input table, raises the Value column to the third power. Funkcja Power nie obsługuje tabel jednokolumnowych.The Power function does not support single-column tables. W związku z tym w tym przypadku konieczne jest użycie funkcji ForAll.Therefore, ForAll must be used in this case.

Korzystanie z połączeniaUsing a connection

W poniższych przykładach używane jest źródło danych Expressions:The following examples use the Expressions data source:

Aby utworzyć to źródło danych, ustaw właściwość OnSelect kontrolki Przycisk na poniższą formułę, otwórz tryb podglądu, a następnie kliknij lub naciśnij przycisk: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" ] )

W tym przykładzie używane jest również połączenie z usługą Microsoft Translator.This example also uses a Microsoft Translator connection. Aby dodać to połączenie do swojej aplikacji, zobacz temat dotyczący sposobu zarządzania połączeniami.To add this connection to your app, see the topic about how to manage connections.

FormułaFormula OpisDescription WynikResult
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Dla wszystkich rekordów w tabeli Expressions tłumaczy zawartość kolumny Value na język hiszpański („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" ) ) Dla wszystkich rekordów w tabeli Expressions tłumaczy zawartość kolumny Value na język francuski („fr”).For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Kopiowanie tabeliCopying a table

Czasami trzeba filtrować dane, kształtować je, sortować i manipulować nimi.Sometimes you need to filter, shape, sort, and manipulate data. Usługa PowerApps oferuje szereg funkcji, za pomocą których można to zrobić, na przykład funkcje Filter, AddColumns i Sort.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. Usługa PowerApps traktuje każdą tabelę jako wartość, umożliwiając jej przepływ przez formuły i łatwe wykorzystywanie.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

Czasami zechcesz utworzyć kopię tego wyniku do użycia w przyszłościAnd sometime you will want to make a copy of this result for later use. lub przenieść informacje z jednego źródła danych do innego.Or you will want to move information from one data source to another. Usługa PowerApps udostępnia funkcję Collect umożliwiającą skopiowanie danych.PowerApps provides the Collect function to copy data.

Jednak przed wykonaniem tej kopii zastanów się, czy jest to naprawdę potrzebne.But before you make that copy, think carefully if it is really needed. W wielu sytuacjach może wystarczyć filtrowanie i kształtowanie podstawowego źródła danych na żądanie przy użyciu formuły.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. Oto niektóre z wad tworzenia kopii:Some of the downsides to making a copy include:

  • Istnienie dwóch kopii tych samych informacji oznacza, że jedna z nich może nie być zsynchronizowana.Two copies of the same information means that one of them can fall out of sync.
  • Wykonywanie kopii może pochłaniać dużą ilość pamięci komputera, przepustowości sieci i/lub czasu.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • W przypadku większości źródeł danych kopiowanie nie może być delegowane, co ogranicza ilość danych, które mogą zostać przeniesione.For most data sources, copying cannot be delegated, limiting how much data can be moved.

W poniższych przykładach używane jest źródło danych Products:The following examples use the Products data source:

Aby utworzyć to źródło danych, ustaw właściwość OnSelect kontrolki Przycisk na poniższą formułę, otwórz tryb podglądu, a następnie kliknij lub naciśnij przycisk: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 } ) )

Naszym celem jest praca z tabelą pochodną, która zawiera tylko elementy, w przypadku których ilość żądana jest większa niż dostępna i na które należy złożyć zamówienie: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:

To zadanie można wykonać na kilka różnych sposobów, które dają taki sam wynik i mają różne wady i zalety.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Kształtowanie tabeli na żądanieTable shaping on demand

Nie należy tworzyć kopii!Don't make that copy! Możemy użyć następującej formuły w dowolnym miejscu: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" )

Zakres rekordów jest tworzony przez funkcje Filter i AddColumns w celu wykonania operacji porównania i odejmowania za pomocą pól 'Quantity Requested' i 'Quantity Available' każdego rekordu.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.

W tym przykładzie funkcja Filter może być delegowana.In this example, the Filter function can be delegated. Jest to ważne, ponieważ może ona znaleźć wszystkie produkty spełniające kryteria, nawet jeśli to tylko kilka rekordów z tabeli zawierającej ich miliony.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. W tej chwili funkcje ShowColumns i AddColumns nie mogą być delegowane, więc rzeczywista liczba produktów, które muszą zostać zamówione, zostanie ograniczona.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Jeśli wiesz, że rozmiar tego wyniku zawsze będzie stosunkowo mały, to podejście jest właściwe.If you know the size of this result will always be relatively small, this approach is fine.

I ponieważ nie utworzyliśmy kopii, nie ma żadnej dodatkowej kopii informacji, która wymaga zarządzania lub może stać się nieaktualna.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

Funkcja ForAll na żądanieForAll on demand

Innym podejściem jest użycie funkcji ForAll w celu zastąpienia funkcji kształtowania tabeli: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' } ) )

Ta formuła może być dla niektórych osób łatwiejsza do odczytania i zapisania.This formula may be simpler for some people to read and write.

Żadna część formuły ForAll nie może być delegowana.No part of the ForAll is delegable. Tylko pierwsza część tabeli Products zostanie oceniona, co może być problemem, jeśli ta tabela jest bardzo duża.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Ponieważ funkcja Filter w poprzednim przykładzie mogła być delegowana, może działać lepiej w dużych zestawach danych.Because Filter could be delegated in the previous example, it could work better with large data sets.

Zbieranie wynikówCollect the result

W pewnych sytuacjach może być wymagana kopia danych.In some situations, a copy of data may be required. Może zaistnieć potrzeba przeniesienia informacji z jednego źródła danych do innego.You may need to move information from one data source to another. W tym przykładzie zamówienia składane są za pomocą tabeli NewOrder w systemie dostawcy.In this example, orders are placed through a NewOrder table on a vendor's system. Aby zapewnić dużą szybkość interakcji z użytkownikami, można buforować w pamięci podręcznej kopię lokalną tabeli, co pozwala uniknąć opóźnień serwera.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

Używamy tego samego kształtowania tabeli, co w poprzednich dwóch przykładach, ale przechwytujemy wynik w kolekcji: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' } ) ) )

Funkcje ClearCollect i Collect nie mogą być delegowane.ClearCollect and Collect can't be delegated. W związku z tym ilość danych, które mogą zostać przeniesione w ten sposób, jest ograniczona.As a result the amount of data that can be moved in this manner is limited.

Funkcja Collect wewnątrz funkcji ForAllCollect within ForAll

Na koniec można wykonać funkcję Collect bezpośrednio w funkcji 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' } ) ) )

Funkcja ForAll nie może być delegowana w tej chwili.Again, the ForAll function can't be delegated at this time. Jeśli tabela Products jest duża, funkcja ForAll będzie sprawdzać tylko pierwszy zestaw rekordów i niektóre produkty, które należy zamówić, mogą zostać pominięte.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. Jednak w przypadku tabel, o których wiemy, że pozostaną małe, to podejście jest odpowiednie.But for tables that we know will remain small, this approach is fine.

Należy pamiętać, że wynik funkcji ForAll nie jest przechwytywany.Note that we are not capturing the result of the ForAll. Wywołania funkcji Collect wykonywane w ramach tej funkcji będą zwracały źródło danych NewOrder dla wszystkich rekordów, co mogłoby spowodować dodanie bardzo dużej ilości danych, gdyby były one przechwytywane.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.