Funzione ForAll

Si applica a: app canvas flussi desktop app basate su modello Power Platform CLI

Calcola i valori ed esegue azioni per tutti i record in 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. Utilizza la funzione With per valutare la formula per un singolo record.

Utilizza la funzione Sequence con la funzione ForAll per scorrere in base a un conteggio.

I campi di record attualmente in elaborazione sono disponibili nella formula. Utilizza l'operatore ThisRecord o fai semplicemente riferimento ai campi in base al nome come faresti con qualsiasi altro valore. L'operatore As può anche essere utilizzato per denominare il record in fase di elaborazione in modo da semplificare la comprensione della formula e rendere accessibili i record nidificati. Per altre informazioni, consulta gli esempi di seguito e la sezione sull'utilizzo nell'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 contiene i record con le stesse colonne del record restituito.

Se il risultato della formula è un valore blank, non c'è 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 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 Power Apps 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

Quando viene utilizzata con un'origine dati, questa funzione non può essere delegata. Solo la prima parte dell'origine dati verrà recuperata e la funzione applicata. Il risultato potrebbe non rappresentare la storia completa. Un avviso potrebbe apparire al momento della creazione per ricordarti questo limite e per suggerire di passare ad alternative delegabili quando possibile. Per ulteriori informazioni, consultare panoramica delega.

Sintassi

ForAll( Table, Formula )

  • Table: obbligatorio. Tabella su cui operare.
  • Formula: obbligatorio. Formula da valutare per ogni record di Table.

Esempi

Calcoli

Negli esempi seguenti viene usata l'origine datiSquares:

Esempio di quadrati.

Per creare questa origine dati come raccolta, imposta la proprietà OnSelect di un controllo Button con questa formula, apri la modalità di anteprima e quindi seleziona 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ò anche essere usata anche con una tabella a colonna singola, rendendo possibile l'esecuzione di questo esempio senza usare ForAll. Esempio di radice quadrata.
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. Esempio di potenza.

Uso di una connessione

Negli esempi seguenti viene usata l'origine dati Expressions:

Esempio di espressioni.

Per creare questa origine dati come raccolta, imposta la proprietà OnSelect di un controllo Button con questa formula, apri la modalità di anteprima e quindi seleziona 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, vedi l'articolo 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"). Esempio con valore
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Per tutti i record nella tabella Expressions, traduce il contenuto della colonna Value in francese (abbreviato "fr"). Esempio con valore

Copia di una tabella

A volte è necessario filtrare, trasformare, ordinare e manipolare i dati. Power Apps fornisce molte funzioni per eseguire queste operazioni, come Filter, AddColumns e Sort. Power Apps considera ogni tabella come valore, consentendo di propagarla tramite formule e usarla facilmente.

E a volte vuoi fare una copia di questo risultato per un uso successivo o vuoi spostare le informazioni da un'origine dati a un'altra. Power Apps offre la funzione Collect per copiare i dati.

Ma prima di eseguire la copia, decidi con attenzione se è 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:

Esempio di origine dati prodotti.

Per creare questa origine dati come raccolta, imposta la proprietà OnSelect di un controllo Button con questa formula, apri la modalità di anteprima e quindi seleziona 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:

Esempio di tabella derivata.

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

// Table shaping on demand, no need for a copy of the result
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 viene 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 viene valutata e questo potrebbe causare problemi se la tabella è 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 nella funzione ForAll

Infine, è possibile eseguire la funzione Collect direttamente nella funzione ForAll:

Clear( NewOrder );
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 numerosi dati se venisse acquisito il risultato.

Mappare la tabella in un componente

Vedi Mappare tabelle.