Funzione ForAll in PowerAppsForAll function in PowerApps

Calcola i valori ed esegue azioni per tutti i record di una tabella.Calculates values and performs actions for all records of a table.

DescrizioneDescription

La funzione ForAll valuta una formula per tutti i record di una tabella.The ForAll function evaluates a formula for all records of a table. La formula può calcolare un valore e/o eseguire azioni, ad esempio la modifica di dati o l'uso di una connessione.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.

Valore restituitoReturn value

Il risultato di ogni valutazione della formula viene restituito in una tabella, nello stesso ordine della tabella di input.The result of each formula evaluation is returned in a table, in the same order as the input table.

Se il risultato della formula è un valore unico, la tabella risultante sarà una tabella a colonna singola.If the result of the formula is a single value, the resulting table will be a single column table. Se il risultato della formula è un record, la tabella risultante conterrà i record con le stesse colonne del record restituito.If the result of the formula is a record, the resulting table will contain records with the same columns as the result record.

Se il risultato della formula è un valore blank, non ci sarà nessun record nella tabella dei risultati per tale record di input.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 questo caso, ci saranno meno record nella tabella dei risultati rispetto alla tabella di origine.In this case, there will be fewer records in the result table than the source table.

Esecuzione di azioniTaking action

La formula può includere funzioni che eseguono azioni, ad esempio la modifica dei record di un'origine dati con le funzioni Patch e Collect.The formula can include functions that take action, such as modifying the records of a data source with the Patch and Collect functions. La formula può anche chiamare metodi su connessioni.The formula can also call methods on connections. Per ciascun record possono essere eseguite più azioni usando l'operatore ;.Multiple actions can be performed per record by using the ; operator. Non è possibile modificare una tabella che è l'oggetto di una funzione ForAll.You can't modify the table that is the subject of the ForAll function.

Durante la scrittura di formule, tenere presente che i record possono essere elaborati in qualsiasi ordine e, se possibile, in parallelo.When writing your formula, keep in mind that records can be processed in any order and, when possible, in parallel. Il primo record della tabella può essere elaborato dopo l'ultimo record.The first record of the table may be processed after the last record. Cercare di evitare dipendenze dall'ordinamento.Take care to avoid ordering dependencies. Per questo motivo, non è possibile usare le funzioni UpdateContext, Clear e ClearCollect all'interno di una funzione ForAll perché potrebbero essere usate per contenere variabili soggette a tale effetto.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. È possibile usare la funzione Collect, ma l'ordine in cui vengono aggiunti i record non è definito.You can use Collect, but the order in which records are added is undefined.

Molte funzioni che modificano le origini dati, tra cui Collect, Remove e Update, restituiscono l'origine dati modificata come relativo valore restituito.Several functions that modify data sources, including Collect, Remove, and Update, return the changed data source as their return value. Questi valori restituiti possono essere tanti e usare risorse significative se restituiti per ogni record della tabella ForAll.These return values can be large and consume significant resources if returned for every record of the ForAll table. È anche possibile che questi valori non corrispondano ai risultati previsti perché ForAll può operare in parallelo e può separare gli effetti collaterali di queste funzioni dall'ottenere il loro risultato.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. Se tuttavia il valore restituito da ForAll non è usato, che è spesso il caso con le funzioni di modifica dati, il valore restituito non verrà creato e quindi non è necessario preoccuparsi per risorse o ordinamento.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. Se però si sta usando il risultato di una funzione ForAll e di una delle funzione che restituiscono un'origine dati, tenere presente il modo in cui strutturare il risultato e provarlo prima su piccoli set di dati.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.

AlternativeAlternatives

Molte funzioni in PowerApps possono elaborare più di un valore alla volta tramite l'uso di una tabella a colonna singola.Many functions in PowerApps can process more than one value at a time through the use of a single-column table. Ad esempio, la funzione Len può elaborare una tabella di valori di testo, restituendo una tabella di lunghezze, nello stesso modo della funzione 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. Questa operazione può in molti casi eliminare la necessità di usare la funzione ForAll, può essere più efficiente e facile da leggere.This can eliminate the need to use ForAll in many cases, can be more efficient, and is easier to read.

Un'altra considerazione da tener presente è che ForAll non può essere delegata, mentre altre funzioni possono essere delegate, ad esempio Filter.Another consideration is that ForAll is not delegable while other functions may be, such as Filter.

DelegaDelegation

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.

SintassiSyntax

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

  • Table - Obbligatorio.Table - Required. Tabella su cui operare.Table to be acted upon.
  • Formula - Obbligatorio.Formula - Required. Formula da valutare per ogni record di Tabella.The formula to evaluate for all records of the Table.

EsempiExamples

CalcoliCalculations

Negli esempi seguenti viene usata l'origine dati Squares:The following examples use the Squares data source:

Per creare questa origine dati come raccolta, impostare la proprietà OnSelect di un controllo Button con questa formula, aprire la modalità di anteprima e quindi fare clic su o toccare il pulsante: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" ] )
FormulaFormula DescrizioneDescription RisultatoResult
ForAll( Squares, Sqrt( Value ) )ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )Sqrt( Squares )
Per tutti i record della tabella di input, calcola la radice quadrata della colonna Value.For all the records of the input table, calculates the square root of the Value column. La funzione Sqrt può essere usata anche con una tabella a colonna singola, rendendo possibile l'esecuzione di questo esempio senza usare 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 ) ) Per tutti i record della tabella di input, eleva al cubo i valori nella colonna Value.For all the records of the input table, raises the Value column to the third power. La funzione Power non supporta le tabelle a colonna singola.The Power function does not support single-column tables. Di conseguenza, è necessario usare la funzione ForAll in questo caso.Therefore, ForAll must be used in this case.

Uso di una connessioneUsing a connection

Negli esempi seguenti viene usata l'origine dati Expressions:The following examples use the Expressions data source:

Per creare questa origine dati come raccolta, impostare la proprietà OnSelect di un controllo Button con questa formula, aprire la modalità di anteprima e quindi fare clic su o toccare il pulsante: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" ] )

Questo esempio usa anche una connessione a Microsoft Translator.This example also uses a Microsoft Translator connection. Per aggiungere la connessione all'app, vedere l'argomento su come gestire le connessioni.To add this connection to your app, see the topic about how to manage connections.

FormulaFormula DescrizioneDescription RisultatoResult
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) )ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Per tutti i record nella tabella Expressions, traduce il contenuto della colonna Value in spagnolo (abbreviato "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" ) ) Per tutti i record nella tabella Expressions, traduce il contenuto della colonna Value in francese (abbreviato "fr").For all the records in the Expressions table, translate the contents of the Value column into French (abbreviated "fr").

Copia di una tabellaCopying a table

A volte è necessario filtrare, trasformare, ordinare e manipolare i dati.Sometimes you need to filter, shape, sort, and manipulate data. PowerApps offre una serie di funzioni per queste operazioni, ad esempio Filter, AddColumns e Sort.PowerApps provides a number of functions for doing this, such as Filter, AddColumns, and Sort. PowerApps considera ogni tabella come valore, consentendo di propagarla tramite formule e usarla facilmente.PowerApps treats each table as a value, allowing it to flow through formulas and be consumed easily.

E a volte si potrebbe voler creare una copia dei risultati per un uso futuro.And sometime you will want to make a copy of this result for later use. O si vuole spostare le informazioni da un'origine dati a un'altra.Or you will want to move information from one data source to another. PowerApps offre la funzione Collect per copiare i dati.PowerApps provides the Collect function to copy data.

Ma prima di eseguire tale copia, decidere se è effettivamente necessario.But before you make that copy, think carefully if it is really needed. In molti casi è possibile eseguire questa operazione filtrando e trasformando l'origine dati sottostante su richiesta con una formula.Many situations can be addressed by filtering and shaping the underlying data source on demand with a formula. Alcuni svantaggi nel creare copie:Some of the downsides to making a copy include:

  • Due copie dello stesse informazioni potrebbe causare problemi di sincronizzazione.Two copies of the same information means that one of them can fall out of sync.
  • La creazione di una copia può usare molta memoria del computer, larghezza di banda e/o impiegare molto tempo.Making a copy can consume a lot of computer memory, network bandwidth, and/or time.
  • Per la maggior parte delle origini dati, la copia non può essere delegata, limitando la quantità di dati che possono essere spostati.For most data sources, copying cannot be delegated, limiting how much data can be moved.

Negli esempi seguenti viene usata l'origine dati Products:The following examples use the Products data source:

Per creare questa origine dati come raccolta, impostare la proprietà OnSelect di un controllo Button con questa formula, aprire la modalità di anteprima e quindi fare clic su o toccare il pulsante: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 } ) )

L'obiettivo è usare una tabella derivata che include solo gli elementi in cui è stata richiesta una quantità superiore rispetto a quella disponibile, e per cui è necessario effettuare un ordine: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:

È possibile eseguire questa attività in un paio di modi diversi, ognuno dei quali produce lo stesso risultato, con vari vantaggi e svantaggi.We can perform this task in a couple of different ways, all of which produce the same result, with various pros and cons.

Trasformazione della tabella su richiestaTable shaping on demand

Non eseguire una copia.Don't make that copy! È possibile usare la formula seguente in qualsiasi punto, quando necessario: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" )

Un ambito di record viene creato dalle funzioni Filter e AddColumns per eseguire operazioni di confronto e di sottrazione, rispettivamente con i campi 'Quantity Requested' e 'Quantity Available' di ogni record.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.

In questo esempio, la funzione Filter può essere delegata.In this example, the Filter function can be delegated. Ciò è importante, perché è possibile trovare tutti i prodotti che soddisfano i criteri, anche se sono pochi in una tabella che include milioni di record.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. A questo punto, le funzioni ShowColumns e AddColumns non possono essere delegate, pertanto il numero effettivo di prodotti che devono essere ordinati verrà limitato.At this time, ShowColumns and AddColumns cannot be delegated, so the actual number of products that needs to be ordered will be limited. Se si sa che la dimensione di questo risultato sarà sempre relativamente piccola, questo approccio è corretto.If you know the size of this result will always be relatively small, this approach is fine.

E poiché non è stata creata una copia, non esiste alcuna copia aggiuntiva delle informazioni da gestire o aggiornare.And because we didn't make a copy, there is no additional copy of the information to manage or fall out of date.

ForAll su richiestaForAll on demand

Un altro approccio consiste nell'usare la funzione ForAll per sostituire le funzioni di trasformazione della tabella: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' } ) )

Questa formula può risultare più semplice da leggere e scrivere per alcuni utenti.This formula may be simpler for some people to read and write.

Nessuna parte della funzione ForAll può essere delegata.No part of the ForAll is delegable. Solo la prima parte della tabella Products verrà valutata e questo potrebbe causare problemi se la tabella è molto grande.Only the first portion of the Products table will be evaluated, which could be a problem if this table is very large. Poiché la funzione Filter può essere delegata nell'esempio precedente, genera una migliore prestazione con set di dati grandi.Because Filter could be delegated in the previous example, it could work better with large data sets.

Raccogliere i risultatiCollect the result

In alcune situazioni, potrebbe essere necessaria una copia dei dati.In some situations, a copy of data may be required. Nel caso in cui è necessario spostare informazioni da un'origine dati a un'altra.You may need to move information from one data source to another. In questo esempio, gli ordini vengono effettuati tramite una tabella NewOrder nel sistema del fornitore.In this example, orders are placed through a NewOrder table on a vendor's system. Per interazioni utente ad alta velocità, si potrebbe voler memorizzare nella cache una copia locale di una tabella per evitare una latenza server.For high-speed user interactions, you may want to cache a local copy of a table so that there is no server latency.

Viene usata la stessa trasformazione della tabella dei due esempi precedenti, ma il risultato viene restituito in una raccolta: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' } ) ) )

Le funzioni ClearCollect e Collect non possono essere delegate.ClearCollect and Collect can't be delegated. Di conseguenza la quantità di dati che può essere spostata in questo modo è limitata.As a result the amount of data that can be moved in this manner is limited.

Funzione Collect all'interno della funzione ForAllCollect within ForAll

Infine, è possibile eseguire la funzione Collect direttamente all'interno della funzione 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' } ) ) )

Anche in questo caso la funzione ForAll non può essere delegata.Again, the ForAll function can't be delegated at this time. Se la tabella Products è grande, la funzione ForAll esaminerà solo il primo set di record ed è possibile che non verranno presi in considerazioni alcuni prodotti che devono essere ordinati.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. Ma per le tabelle piccole, questo approccio è appropriato.But for tables that we know will remain small, this approach is fine.

Si noti che non viene acquisito il risultato della funzione ForAll.Note that we are not capturing the result of the ForAll. Le chiamate della funzione Collect effettuate all'interno della funzione restituiranno l'origine dati NewOrder per tutti i record e questo potrebbe aggiungere molti dati se venisse acquisito il risultato.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.