Condividi tramite


Funzione ForAll

Si applica a: App canvas Flussi desktop di Copilot Studio App basate su modello Funzioni power platform dell'interfaccia della riga di comando di Power Platform Power Pages

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

Descrizione

La ForAll funzione 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.

Usare la funzione Sequence con la ForAll funzione 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 singolo valore, la tabella risultante è 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 vuoto , non esiste alcun record nella tabella dei risultati per tale record di input. In questo caso, nella tabella dei risultati sono presenti meno record 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 la tabella oggetto della ForAll funzione.

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 ForAll funzione perché potrebbero essere usate facilmente per contenere variabili che potrebbero essere soggette a questo 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 di grandi dimensioni e utilizzare risorse significative se restituiti per ogni record della ForAll tabella. È anche possibile notare che questi valori restituiti non sono quello previsto perché ForAll possono operare in parallelo e possono separare gli effetti collaterali di queste funzioni dal ottenere il loro risultato. Se il valore restituito da ForAll non viene usato, che è spesso il caso delle funzioni di modifica dei dati, il valore restituito non verrà creato e non ci sono problemi di risorsa o ordine. Tuttavia, se si usa il risultato di e ForAll una delle funzioni che restituisce un'origine dati, valutare attentamente come strutturare il risultato e provare prima su piccoli set di dati.

Alternative

Molte funzioni in Power Apps possono elaborare più di un valore alla volta usando 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, che ForAll potrebbe. Ciò può eliminare la necessità di usare ForAll in molti casi, può essere più efficiente ed è più facile da leggere.

Un'altra considerazione è che ForAll non è delegabile, mentre altre funzioni possono essere, 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)

  • Tabella - 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( Quadrati, Sqrt( Valore ) )

Sqrt (Quadrati)
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 eseguire questo esempio senza usare ForAll. Esempio di radice quadrata.
ForAll( Quadrati, Power( Valore, 3 ) ) Per tutti i record della tabella di input, eleva al cubo i valori nella colonna Value. La funzione Power non supporta tabelle a colonna singola. Pertanto, ForAll deve essere usato 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 il flusso delle formule e l'utilizzo semplice.

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 fare quella copia, pensa attentamente 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 è possibile spostare.

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. Al momento, Non è possibile delegare ShowColumns e AddColumns , quindi il numero effettivo di prodotti da ordinare è limitato. Se si conosce la dimensione di questo risultato è sempre relativamente piccola, questo approccio è corretto.

E perché non abbiamo creato una copia, non c'è alcuna copia aggiuntiva delle informazioni da gestire o non essere aggiornate.

ForAll su richiesta

Un altro approccio consiste nell'usare la ForAll funzione per sostituire le funzioni di modellazione delle tabelle:

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 di è ForAll delegabile. Viene valutata solo la prima parte della tabella Products , che potrebbe essere un problema 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 le interazioni utente ad alta velocità, è possibile memorizzare nella cache una copia locale di una tabella in modo che non esista alcuna latenza del 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'
            }
        )
    )
)

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

Raccogli all'interno ForAll

Infine, è possibile eseguire Collect direttamente all'interno di 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 ForAll funzione non può essere delegata in questo momento. Se la tabella Products è grande, ForAll esamina solo il primo set di record e potremmo perdere alcuni prodotti che devono essere ordinati. Ma per le tabelle che sappiamo che rimangono piccole, questo approccio va bene.

Si noti che non viene acquisito il risultato di ForAll. Le chiamate di funzione Collect effettuate dall'interno restituiscono l'origine dati NewOrder per tutti i record, che potrebbero aggiungere fino a numerosi dati se vengono catturati.

Mappare la tabella in un componente

Vedi Mappare tabelle.