Comparteix a través de


Funció ForAll

S'aplica a: Aplicacions de llenç Fluxos d'escriptori Aplicacions Power Platform basades en models CLI

Calcula els valors i realitza accions per a tots els registres d'una taula.

Descripció

La funció ForAll avalua una fórmula per a tots els registres d'una taula. La fórmula pot calcular un valor i/o dur a terme accions, com ara modificar dades o treballar amb una connexió. Utilitzeu la funció With per avaluar la fórmula per a un únic registre.

Utilitzeu la funció Sequence amb la funció ForAll per iterar en funció d'un recompte.

Els camps del registre que s’està processant actualment estan disponibles dins de la fórmula. Utilitzeu l’operador ThisRecord o simplement els camps de referència per nom com si fos qualsevol altre valor. L’operador As també es pot utilitzar per nomenar el registre que s’està processant i que pot ajudar-vos a fer que la fórmula sigui més fàcil d’entendre i fer accessible els registres incrustats. Per obtenir més informació, vegeu els exemples següents i la secció Treballar amb l’àmbit de registre.

Valor de retorn

El resultat de cada avaluació de la fórmula es torna en una taula, en el mateix ordre que la taula d'entrada.

Si el resultat de la fórmula és un valor únic, la taula resultant serà una taula d'una única columna. Si el resultat de la fórmula és un registre, la taula resultant conté registres amb les mateixes columnes que el registre del resultat.

Si el resultat de la fórmula és un valor en blanc, no hi ha cap registre a la taula de resultats d'aquest registre d'entrada. En aquest cas, hi haurà menys registres al quadre de resultats que a la taula d'origen.

Prendre una acció

La fórmula pot incloure funcions que fan una acció, per exemple, la modificació dels registres d'una font de dades amb les funcions Patch i Collect. La fórmula també pot trucar els mètodes de les connexions. Es poden dur a terme diverses accions per registre mitjançant l'operador ;. No podeu modificar la taula subjecta a la funció ForAll.

Quan redacteu la fórmula, heu de tenir en compte que els registres es poden processar en qualsevol ordre i, sempre que sigui possible, en paral·lel. El primer registre de la taula es pot processar després de l'últim registre.

Aneu amb compte per evitar dependències d'ordre. Per aquesta raó, no podeu utilitzar les funcions UpdateContext, Clear i ClearCollect dins d'una funció ForAll, ja que podrien utilitzar-se fàcilment per mantenir variables susceptibles d'estar en aquest efecte. Podeu utilitzar Collect, però l'ordre en què s'afegeixen els registres no està definit.

Diverses funcions que modifiquen fonts de dades, com ara Collect, Remove i Update, us retornen la font de dades canviada com a valor retornat. Aquests valors de retorn poden ser grans i consumeixen recursos importants si es tornen per a tots els registres de la taula ForAll. També podeu trobar que aquests valors de retorn no siguin els que espereu, perquè ForAll pot operar en paral·lel i pot separar els efectes secundaris d'aquestes funcions des de l'obtenció del resultat. Si no s'utilitza el valor retornat de ForAll, que sol ser el cas amb les funcions de modificació de dades, el valor retornat no es crearà i no hi haurà cap recurs o ordre. Però si utilitzeu el resultat d'un ForAll i d'una de les funcions que torna una font de dades, penseu amb cura sobre la manera d'estructurar el resultat i proveu-ho en primer lloc en petits conjunts de dades.

Alternatives

.Moltes funcions al Power Apps poden processar més d'un valor cada vegada mitjançant l'ús d'una taula d'una sola columna. Per exemple, la funció Len pot processar una taula de valors de text, retornar una taula de longituds, de la mateixa manera que ForAll podria fer-ho. Això pot eliminar la necessitat d'utilitzar ForAll en molts casos, pot ser més eficient i és més fàcil de llegir.

Una altra consideració és que ForAll no es pot delegar mentre que altres funcions sí, com ara Filter.

Delegació

Quan s'utilitza amb una font de dades, aquesta funció no es pot delegar. Només es recuperarà la primera part de la font de dades i, a continuació, s'aplicarà la funció. És possible que el resultat no representi la història completa. És possible que aparegui un advertiment en el moment de la creació per recordar-vos aquesta limitació i suggerir-vos que canvieu a alternatives delegables sempre que sigui possible. Per obtenir més informació, vegeu la informació general sobre la delegació.

Sintaxi

ForAll( Taula, Fórmula )

  • Taula: obligatori. Taula sobre la qual actuar.
  • Fórmula: obligatori. La fórmula que s'avaluarà per a tots els registres de la Taula.

Exemples

Càlculs

Els exemples següents utilitzen la font de dadesQuadrats:

Exemple de quadrats

Per crear aquesta font de dades com una col·lecció, definiu la propietat OnSelect d'un control Botó en aquesta fórmula, obriu el mode de visualització prèvia i, a continuació, seleccioneu el botó:

ClearCollect( Squares, [ "1", "4", "9" ] )

Fórmula Descripció Resultat
ForAll(Quadrats, Sqrt( Valor ) )

Sqrt( Quadrats )
Per a tots els registres de la taula d'entrada, el calcula l'arrel quadrada de la columna Valor. La funció Sqrt també es pot utilitzar amb una taula d'una sola columna, fent possible realitzar aquest exemple sense utilitzar ForAll. Exemple de Sqrt
ForAll( Quadrats, Power( Valor, 3 ) ) Per a tots els registres de la taula d'entrada, eleva la columna Valor al cub. La funció Power no admet taules d'una sola columna. Per tant, ForAll s'ha d'utilitzar en aquest cas. Exemple de Power

Utilitzar una connexió

Els exemples següents utilitzen la font de dadesExpressions:

Exemple d'expressions

Per crear aquesta font de dades com una col·lecció, definiu la propietat OnSelect d'un control Botó en aquesta fórmula, obriu el mode de visualització prèvia i, a continuació, seleccioneu el botó:

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

Aquest exemple també utilitza una connexió del Microsoft Translator. Per afegir aquesta connexió a l'aplicació, vegeu l'article quant a com administrar connexions.

Fórmula Descripció Resultat
ForAll( Expressions, MicrosoftTranslator.Translate( Valor, "es" ) ) Per a tots els registres de la taula Expressions, traduïu el contingut de la columna Valor al castellà (abreujat "es"). Exemple amb valor
ForAll( Expressions, MicrosoftTranslator.Translate( Valor, "fr" ) ) Per a tots els registres de la taula Expressions, traduïu el contingut de la columna Valor al francès (abreujat "fr"). Exemple amb valor

Copiar una taula

De vegades necessitareu filtrar, configurar, ordenar i manipular dades. El Power Apps proporciona moltes funcions per fer-ho, com ara Filter, AddColumns i Sort. El Power Apps tracta cada taula com un valor, la qual cosa permet que flueixi per fórmules i es consumeixi fàcilment.

De vegades, pot ser que vulgueu fer una còpia d'aquest resultat per a utilitzar-lo més endavant o que vulgueu desplaçar la informació d'una font de dades a una altra. El Power Apps proporciona la funció Collect per copiar dades.

Però abans de fer la còpia, penseu amb cura si cal. Es poden abordar moltes situacions filtrant i configurant la font de dades subjacent a la demanda amb una fórmula. Alguns dels desavantatges de fer una còpia inclouen:

  • Dues còpies de la mateixa informació fan que potser una no se sincronitzi.
  • Fer una còpia pot consumir gran part de la memòria de l'ordinador, l'amplada de banda de la xarxa o temps.
  • Per a la majoria de les fonts de dades, la còpia no es pot delegar, la qual cosa limita la quantitat de dades que es poden moure.

Els exemples següents utilitzen la font de dadesProductes:

Exemple de font de dades de productes

Per crear aquesta font de dades com una col·lecció, definiu la propietat OnSelect d'un control Botó en aquesta fórmula, obriu el mode de visualització prèvia i, a continuació, seleccioneu el botó:

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

El nostre objectiu és treballar amb una taula derivada que inclogui només els elements on s'hagi sol·licitat més del que hi ha disponible i per als quals necessitem fer una comanda:

Exemple de taula derivada

Podem dur a terme aquesta tasca de dues maneres diferents, que produeixen el mateix resultat, amb diversos pros i contres.

Formació de taules a la demanda

No feu aquesta còpia! Podem utilitzar la següent fórmula en qualsevol part que necessitem:

// 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 àmbit de registre es crea mitjançant les funcions Filter i AddColumns per dur a terme les operacions de comparació i de resta, respectivament, amb els camps "Quantitat sol·licitada" i "Quantitat disponible" de cada registre.

En aquest exemple, pot delegar-se la funció Filter. Això és important, ja que pot trobar tots els productes que compleixen els criteris, fins i tot si això és només alguns registres d'una taula de milions de registres. En aquest moment, no es poden delegar ShowColumns i AddColumns, de manera que el nombre real de productes que s'han d'ordenar es limitarà. Si sabeu que la mida d'aquest resultat serà sempre relativament petit, aquest enfocament està molt bé.

A més, com que no heu fet cap còpia, no hi ha una còpia addicional de la informació per administrar ni que es pugui desactualitzar.

ForAll segons demanda

Un altre enfocament és utilitzar la funció ForAll per reemplaçar les funcions de configuració de la taula:

ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        {
            Product: Product,
            'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
        }
    )
)

Aquesta fórmula pot ser més senzilla perquè algunes persones llegeixin i escriguin.

Cap part de ForAll és delegable. Només s'avaluarà la primera part de la taula Productes, que podria tractar-se d'un problema si aquesta taula és gran. Com que Filter es podia delegar en l'exemple anterior, podia funcionar millor amb conjunts de dades grans.

Recollir el resultat

En algunes situacions, pot ser que es necessiti una còpia de dades. Pot ser que vulgueu desplaçar la informació d'una font de dades a una altra. En aquest exemple, les comandes es realitzen a través d'una taula NewOrder al sistema del proveïdor. Per a les interaccions d'usuari d'alta velocitat, potser voleu que la memòria cau sigui una còpia local d'una taula per tal que no hi hagi cap latència del servidor.

Utilitzem la mateixa taula en la qual es configuren els dos exemples anteriors, però captem el resultat en una col·lecció:

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 i Collect no es poden delegar. Com a resultat, la quantitat de dades que es poden moure d'aquesta manera és limitada.

Collect dins de ForAll

Finalment, podem fer Collect directament dins de ForAll:

Clear( NewOrder );
ForAll( Products,
    If( 'Quantity Requested' > 'Quantity Available',
        Collect( NewOrder,
            {
                Product: Product,
                'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
            }
        )
    )
)

Una vegada més, la funció ForAll no es pot delegar en aquest moment. Si la nostra taula Productes és gran, ForAll veurà el primer conjunt de registres i potser perdrem alguns productes que s'han d'ordenar. Però per a taules que sabem que romandran petites, aquest enfocament està bé.

Heu de tenir en compte que no estem capturant el resultat de ForAll. Les trucades de la funció Collect fetes des de dins retornaran la font de dades NewOrder per a tots els registres, que podrien afegir-se a nombroses dades si l'estàvem capturant.

Assignar una taula en un component

Vegeu Assignar taules.