Funcția ForAll

Se aplică pentru: Aplicații Canvas Fluxuri desktop Aplicații bazate pe model Power Platform CLI

Calculează valorile și execută acțiuni pentru toate înregistrări într-un tabel.

Descriere

Funcția ForAll evaluează o formulă pentru toate înregistrările dintr-un tabel. Formula poate să calculeze o valoare și/sau să efectueze acțiuni, cum ar fi modificarea datelor sau lucrul cu o conexiune. Utilizați funcția With pentru a evalua formula pentru o singură unică.

Utilizați funcția Sequence cu funcția ForAll de a itera pe baza unui număr.

Câmpurile înregistrării procesate în prezent sunt disponibile în cadrul formulei. Utilizați operatorul ThisRecord sau pur și simplu faceți referire la câmpuri după nume, așa cum ați face cu orice altă valoare. Operatorul Ca poate fi, de asemenea, utilizat pentru a denumi înregistrarea care este procesată, ceea ce poate face formula dvs. să fie mai ușor de înțeles și înregistrările imbricate să fie accesibile. Pentru informații suplimentare, consultați exemplele de mai jos și lucrul cu domeniul de aplicare al înregistrărilor.

Valoare returnată

Rezultatul fiecărei formule de evaluare este returnat într-un tabel în aceeași ordine cu tabelul de intrare.

Dacă rezultatul formulei este o valoare unică, tabelul rezultat va fi un tabel cu o singură coloană. Dacă rezultatul formulei este o înregistrare, tabelul rezultat conține înregistrări cu aceleași coloane ca înregistrarea rezultatelor.

Dacă rezultatul formulei este o valoare goală, atunci nu există nicio înregistrare în tabelul de rezultate pentru înregistrarea respectivă. În acest caz, tabelul de rezultate va conține mai puține înregistrări decât tabelul sursă.

Acțiuni de luat

Formula poate include funcții care acționează, cum ar fi modificarea înregistrărilor unei surse de date cu funcțiile Patch și Collect. Formula poate apela, de asemenea, metode la conexiuni. Se pot efectua mai multe acțiuni pentru fiecare înregistrare folosind operator;. Nu puteți modifica tabelul care face obiectul funcției ForAll.

Când scrieți formula dvs., rețineți că înregistrările pot fi procesate în orice ordine și, atunci când este posibil, în paralel. Prima înregistrare a tabelului poate fi procesată după ultima înregistrare.

Aveți grijă să evitați comandarea dependențelor. Din acest motiv, nu puteți utiliza funcția UpdateContext, Clear și ClearCollect în cadrul unei funcții ForAll, deoarece ar putea fi ușor de utilizat pentru a reține variabile care ar putea fi susceptibile la acest efect. Puteți să folosiți Collect, dar ordinea în care se adaugă înregistrările nu este definită.

Mai multe funcții care modifică sursele de date, inclusiv Collect, Remove și Update returnează sursă de date modificată ca valoare returnată. Aceste valori returnate pot fi mari și pot consuma resurse semnificative dacă sunt returnate pentru fiecare înregistrare a tabelului ForAll. De asemenea, este posibil să constatați că aceste valori returnate nu sunt ceea ce vă așteptați pentru că ForAll poate funcționa în paralel și poate separa efectele secundare ale acestor funcții de obținerea rezultatului lor. Dacă valoarea returnată de la ForAll nu este utilizată, ceea ce se întâmplă adesea cu funcțiile de modificare a datelor, atunci valoarea returnată nu va fi creată și nu există probleme de resurse sau de ordine. Dar dacă utilizați rezultatul unei funcții ForAll și una dintre funcțiile care returnează o sursă de date, gândiți-vă cu atenție la modul în care structurați rezultatul și încercați-l mai întâi pe seturi de date mici.

Alternative

Multe funcții în Power Apps pot procesa mai multe valori la un moment dat prin utilizarea unui tabel cu o singură coloană. De exemplu, funcția Len poate prelucra un tabel cu valorile textului, returnând un tabel de lungimi, în același mod în care ar putea ForAll. Acest lucru poate elimina nevoia de utilizare ForAll în multe cazuri, poate fi mai eficient și este mai ușor de citit.

O altă stare este că ForAll nu se poate delega în timp ce alte funcții pot fi, cum ar fi Filter.

Delegare

Atunci când se folosește cu o sursă de date, această funcție nu poate fi delegată. Doar prima porțiune a sursei de date va fi regăsită, apoi se va aplica funcția. Este posibil ca rezultatul să nu reprezinte întreaga situație. Poate apărea un avertisment la momentul creării, pentru a vă aminti de această limitare și pentru a sugera comutarea la alternative ce se pot delega, atunci când este posibil. Pentru mai multe informații, consultați prezentarea generală a delegării.

Sintaxă

ForAll( Tabel, Formulă )

  • Table – Obligatoriu. Tabelul în care trebuie acționat.
  • Formula – Obligatoriu. Formula de evaluat pentru toate înregistrările Tabel.

Exemple

Calcule

Următoarele exemple utilizează Pătratesursă de date:

Exemplu de pătrate.

Pentru a crea această sursă de date ca o colecție, setați proprietatea OnSelect a unui Buton pentru a controla această formulă, deschideți modul Previzualizare, apoi selectați butonul:

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

Formulă Descriere Rezultat
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
Pentru toate înregistrările tabelului de intrare, se calculează rădăcina pătrată a coloanei Valoare. Funcția Sqrt poate fi utilizată și cu un tabel cu o singură coloană, făcând posibilă efectuarea acestui exemplu fără a utiliza ForAll. Exemplu de Sqrt.
ForAll( Squares, Power( Value, 3 ) ) Pentru toate înregistrările tabelului de intrare, se ridică la puterea a treia coloana Valoare. Funcția Power nu acceptă tabele cu o singură coloană. Prin urmare, în acest caz trebuie utilizat ForAll. Exemplu de putere.

Utilizarea unei conexiuni

Următoarele exemple utilizează Expresiisursă de date:

Exemplu de expresii.

Pentru a crea această sursă de date ca o colecție, setați proprietatea OnSelect a unui Buton pentru a controla această formulă, deschideți modul Previzualizare, apoi selectați butonul:

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

Acest exemplu folosește și o conexiune Microsoft Translator. Pentru a adăuga această conexiune la aplicația dvs., consultați articolul despre cum să gestionați conexiunile.

Formulă Descriere Rezultat
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Pentru toate înregistrările din tabelul Expresii, traduceți conținutul coloanei Valoare în spaniolă (prescurtat "es"). Exemplu cu valoarea „es.”
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Pentru toate înregistrările din tabelul Expresii, traduceți conținutul coloanei Valoare în franceză (prescurtat "fr"). Exemplu cu valoarea „fr.”

Copierea unui tabel

Uneori, trebuie să filtrați, să modelați, să sortați și să manipulați datele. Power Apps furnizează multe funcții pentru a face acest lucru, cum ar fi Filter, AddColumns și Sort. Power Apps tratează fiecare tabel ca valoare, permițându-i să treacă prin formule și să fie consumate ușor.

Și uneori doriți să faceți o copie a acestui rezultat pentru o utilizare ulterioară sau doriți să mutați informațiile de la o sursă de date la alta. Power Apps furnizează funcția Collect pentru copierea datelor.

Dar înainte de a face acea copie, gândiți-vă cu atenție dacă este nevoie. Multe situații pot fi rezolvate filtrând și modelând sursa de date subiacentă la cerere cu o formulă. Între dezavantajele realizării unei copii se numără:

  • Două copii ale acelorași informații înseamnă că una dintre ele poate fi nesincronizată.
  • Realizarea unei copii poate consuma o mare parte din memoria computerului, lățimea de bandă a rețelei și/sau timp.
  • Pentru majoritatea surselor de date, copierea nu poate fi delegată, limitând volumul de date care pot fi mutate.

Următoarele exemple utilizează Produsesursă de date:

Exemplu de produse sursă de date.

Pentru a crea această sursă de date ca o colecție, setați proprietatea OnSelect a unui Buton pentru a controla această formulă, deschideți modul Previzualizare, apoi selectați butonul:

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

Scopul nostru este să lucrăm cu un tabel derivat care să includă numai elementele în care s-a solicitat mai mult decât este disponibil și pentru care trebuie să plasăm o comandă:

Exemplu de tabel derivat.

Putem realiza această sarcină în mai multe moduri, toate producând același rezultat, cu diferite avantaje și dezavantaje.

Tabel modelare la cerere

Nu faceți o copie! Putem folosi următoarea formulă oriunde avem nevoie:

// 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 domeniu de aplicare a înregistrărilor este creat de funcțiile Filter și AddColumns pentru a efectua operații de comparație și scădere, respectiv, cu câmpurile "Cantitate solicitată" și "Cantitate valabilă" ale fiecărei înregistrări.

În acest exemplu, funcția Filter poate fi delegată. Acest lucru este important, întrucât poate găsi toate produsele care îndeplinesc criteriile, chiar dacă acestea sunt doar câteva înregistrări dintr-un tabel de milioane. În acest moment, ShowColumns și AddColumns nu poate fi delegat, astfel că numărul real de produse care trebuie comandate va fi limitat. Dacă știți că dimensiunea acestui rezultat va fi întotdeauna relativ mică, această abordare este bună.

Și pentru că nu am făcut o copie, nu există nicio copie suplimentară a informațiilor care să fie gestionate sau neactualizate.

ForAll la cerere

O altă abordare este utilizarea funcției ForAll pentru înlocuirea funcțiilor de modelare a tabelului:

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

Această formulă poate fi mai simplă pentru ca unii oameni să citească și să scrie.

Nicio parte din ForAll nu poate fi delegată. Doar prima porțiune a tabelului Produse va fi evaluată, ceea ce ar putea fi o problemă dacă acest tabel este mare. Întrucât Filter ar putea fi delegată în exemplul anteriro, ar putea funcționa mai bine cu seturi mari de date.

Colectați rezultatul

În unele situații, poate fi necesară o copie a datelor. Poate fi necesar să mutați informațiile de la o sursă de date în alta. În acest exemplu, comenzile sunt plasate printr-un tabel Comandă nouă în sistemul unui furnizor. Pentru interacțiuni cu utilizatori de mare viteză, poate doriți să memorați în cache o copie locală a unui tabel, astfel încât să nu existe latență de server.

Folosim același tabel pentru a modela, așa cum arată cele două exemple anterioare, dar colectăm rezultatul într-o colecție:

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 nu pot fi delegate. Ca urmare, cantitatea de date care pot fi mutate în acest mod este limitată.

Colectați în ForAll

În cele din urmă, putem efectua Collect direct în For All:

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

Din nou, funcția ForAll nu poate fi delegată în acest moment. Dacă tabelul Produse este mare, ForAll vom analiza doar primul set de înregistrări și s-ar putea să lipsească unele produse care trebuie comandate. Dar pentru tabelele despre care știm că vor rămâne mici, această abordare este bună.

Rețineți că nu capturăm rezultatul ForAll. Apelurile funcției Collect efectuate din interior vor returna sursa de date Comandă nouă pentru toate înregistrările, care s-ar putea adăuga la numeroase date dacă le-am captura.

Mapați tabelul într-o componentă

Consultați Mapare tabele.