Calcola i valori ed esegue azioni per tutti i record di una tabella.

Descrizione

La funzione ForAll valuta una formula per tutti i record di una tabella. La formula può calcolare un valore e/o eseguire azioni, ad esempio la modifica di dati o l'uso di una connessione.

I campi del record attualmente in fase di elaborazione sono disponibili nella formula. È sufficiente farvi riferimento per nome, analogamente a qualsiasi altro valore. È anche possibile fare riferimento alle proprietà del controllo e ad altri valori in tutta l'app. Per informazioni dettagliate, vedere gli esempi seguenti e Utilizzo dell'ambito dei record.

Valore restituito

Il risultato di ogni valutazione della formula viene restituito in una tabella, nello stesso ordine della tabella di input.

Se il risultato della formula è un valore unico, la tabella risultante sarà una tabella a colonna singola. Se il risultato della formula è un record, la tabella risultante conterrà i record con le stesse colonne del record restituito.

Se il risultato della formula è un valore blank, non ci sarà nessun record nella tabella dei risultati per tale record di input. In questo caso, ci saranno meno record nella tabella dei risultati rispetto alla tabella di origine.

Esecuzione di azioni

La formula può includere funzioni che eseguono azioni, ad esempio la modifica dei record di un'origine dati con le funzioni Patch e Collect. La formula può anche chiamare metodi su connessioni. Per ciascun record possono essere eseguite più azioni usando l'operatore ;. Non è possibile modificare una tabella che è l'oggetto di una funzione ForAll.

Durante la scrittura di formule, tenere presente che i record possono essere elaborati in qualsiasi ordine e, se possibile, in parallelo. Il primo record della tabella può essere elaborato dopo l'ultimo record. Cercare di evitare dipendenze dall'ordinamento. 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. È possibile usare la funzione Collect, ma l'ordine in cui vengono aggiunti i record non è definito.

Molte funzioni che modificano le origini dati, tra cui Collect, Remove e Update, restituiscono l'origine dati modificata come relativo valore restituito. Questi valori restituiti possono essere tanti e usare risorse significative se restituiti per ogni record della tabella ForAll. È 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. 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. 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.

Alternative

Molte funzioni in PowerApps possono elaborare più di un valore alla volta tramite l'uso di una tabella a colonna singola. Ad esempio, la funzione Len può elaborare una tabella di valori di testo, restituendo una tabella di lunghezze, nello stesso modo della funzione ForAll. Questa operazione può in molti casi eliminare la necessità di usare la funzione ForAll, può essere più efficiente e facile da leggere.

Un'altra considerazione da tener presente è che ForAll non può essere delegata, mentre altre funzioni possono essere delegate, ad esempio Filter.

Delega

Questa funzione, quando viene usata con un'origine dati, non può essere delegata. Solo la prima parte dell'origine dati verrà recuperata e quindi verrà applicata la funzione. È possibile che il risultato non rappresenti il processo completo. Un punto blu verrà visualizzato in fase di creazione per ricordare questa limitazione e per suggerire il passaggio alle alternative delegabili, ove possibile. Per altre informazioni, vedere la panoramica della delega.

Sintassi

ForAll( Tabella, Formula )

  • Table - Obbligatorio. Tabella su cui operare.
  • Formula - Obbligatorio. Formula da valutare per ogni record di Tabella.

Esempi

Calcoli

Negli esempi seguenti viene usata l'origine dati Squares:

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:

  • ClearCollect( Squares, [ "1", "4", "9" ] )
Formula Descrizione Risultato
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
Per tutti i record della tabella di input, calcola la radice quadrata della colonna Value. La funzione Sqrt può essere usata anche con una tabella a colonna singola, rendendo possibile l'esecuzione di questo esempio senza usare ForAll.
ForAll( Squares, Power( Value, 3 ) ) Per tutti i record della tabella di input, eleva al cubo i valori nella colonna Value. La funzione Power non supporta le tabelle a colonna singola. Di conseguenza, è necessario usare la funzione ForAll in questo caso.

Uso di una connessione

Negli esempi seguenti viene usata l'origine dati Expressions:

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:

  • ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )

Questo esempio usa anche una connessione a Microsoft Translator. Per aggiungere la connessione all'app, vedere l'argomento su come gestire le connessioni.

Formula Descrizione Risultato
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Per tutti i record nella tabella Expressions, traduce il contenuto della colonna Value in spagnolo (abbreviato "es").
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Per tutti i record nella tabella Expressions, traduce il contenuto della colonna Value in francese (abbreviato "fr").

Copia di una tabella

A volte è necessario filtrare, trasformare, ordinare e manipolare i dati. PowerApps offre una serie di funzioni per queste operazioni, ad esempio Filter, AddColumns e Sort. PowerApps considera ogni tabella come valore, consentendo di propagarla tramite formule e usarla facilmente.

E a volte si potrebbe voler creare una copia dei risultati per un uso futuro. O si vuole spostare le informazioni da un'origine dati a un'altra. PowerApps offre la funzione Collect per copiare i dati.

Ma prima di eseguire tale copia, decidere se è effettivamente necessario. In molti casi è possibile eseguire questa operazione filtrando e trasformando l'origine dati sottostante su richiesta con una formula. Alcuni svantaggi nel creare copie:

  • Due copie dello stesse informazioni potrebbe causare problemi di sincronizzazione.
  • La creazione di una copia può usare molta memoria del computer, larghezza di banda e/o impiegare molto tempo.
  • Per la maggior parte delle origini dati, la copia non può essere delegata, limitando la quantità di dati che possono essere spostati.

Negli esempi seguenti viene usata l'origine dati Products:

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:

  • 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:

È possibile eseguire questa attività in un paio di modi diversi, ognuno dei quali produce lo stesso risultato, con vari vantaggi e svantaggi.

Trasformazione della tabella su richiesta

Non eseguire una copia. È possibile usare la formula seguente in qualsiasi punto, quando necessario:

  • 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.

In questo esempio, la funzione Filter può essere delegata. Ciò è importante, perché è possibile trovare tutti i prodotti che soddisfano i criteri, anche se sono pochi in una tabella che include milioni di record. A questo punto, le funzioni ShowColumns e AddColumns non possono essere delegate, pertanto il numero effettivo di prodotti che devono essere ordinati verrà limitato. Se si sa che la dimensione di questo risultato sarà sempre relativamente piccola, questo approccio è corretto.

E poiché non è stata creata una copia, non esiste alcuna copia aggiuntiva delle informazioni da gestire o aggiornare.

ForAll su richiesta

Un altro approccio consiste nell'usare la funzione ForAll per sostituire le funzioni di trasformazione della tabella:

  • 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.

Nessuna parte della funzione ForAll può essere delegata. Solo la prima parte della tabella Products verrà valutata e questo potrebbe causare problemi se la tabella è molto grande. Poiché la funzione Filter può essere delegata nell'esempio precedente, genera una migliore prestazione con set di dati grandi.

Raccogliere i risultati

In alcune situazioni, potrebbe essere necessaria una copia dei dati. Nel caso in cui è necessario spostare informazioni da un'origine dati a un'altra. In questo esempio, gli ordini vengono effettuati tramite una tabella NewOrder nel sistema del fornitore. Per interazioni utente ad alta velocità, si potrebbe voler memorizzare nella cache una copia locale di una tabella per evitare una latenza server.

Viene usata la stessa trasformazione della tabella dei due esempi precedenti, ma il risultato viene restituito in una raccolta:

  • 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' } ) ) )

Le funzioni ClearCollect e Collect non possono essere delegate. Di conseguenza la quantità di dati che può essere spostata in questo modo è limitata.

Funzione Collect all'interno della funzione ForAll

Infine, è possibile eseguire la funzione Collect direttamente all'interno della funzione ForAll:

  • 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. 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. Ma per le tabelle piccole, questo approccio è appropriato.

Si noti che non viene acquisito il risultato della funzione 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.