Funkcja ForAll

Dotyczy: Aplikacje oparte na kanwie Przepływy pulpitu Aplikacje oparte na modelach Power Platform CLI

Oblicza wartości i wykonuje akcje dla wszystkich rekordów w tabeli.

Opis

Funkcja ForAll ocenia formułę dla wszystkich rekordów tabeli. Formuła może obliczać wartość i/lub wykonywać akcje, takie jak modyfikowanie danych lub współdziałanie z połączeniem. Użyj funkcji With, aby oszacować formułę dla pojedynczego rekordu.

Użyj funkcji Sequence z funkcją ForAll, aby wykonać iterację na podstawie liczby.

Pola aktualnie przetwarzanego rekordu są dostępne w obrębie formuły. Użyj operatora ThisRecord lub po prostu odwołuj się do pól, używając ich nazw, tak jak w przypadku każdej innej wartości. Możesz też użyć operatora As w celu nadania nazwy przetwarzanemu rekordowi, co umożliwi utworzenie bardziej zrozumiałej formuły oraz dostęp do zagnieżdżonych rekordów. Aby uzyskać więcej informacji, zobacz poniższe przykłady oraz temat Praca z zakresem rekordów.

Wartość zwracana

Wynik każdej oceny formuły jest zwracany w tabeli, w takiej samej kolejności, jak w tabeli wejściowej.

Jeśli wynik formuły jest pojedynczą wartością, tabela wynikowa będzie tabelą jednokolumnową. Jeśli wynik formuły jest rekordem, tabela wynikowa zawiera rekordy z takimi samymi kolumnami, jak rekord wyniku.

Jeśli wynikiem formuły jest wartość pusta, tabela wynikowa nie zawiera żadnego rekordu dla tego rekordu wejściowego. W takim przypadku w tabeli wynikowej będzie mniej rekordów niż w tabeli źródłowej.

Podejmowanie akcji

Formuła może zawierać funkcje podejmujące akcje, takie jak modyfikowanie rekordów źródła danych przy użyciu funkcji Patch i Collect. Formuła może również wywoływać metody dla połączeń. W celu wykonania wielu akcji na rekordzie można użyć operatora ;. Nie można zmodyfikować tabeli, która jest obiektem funkcji ForAll.

Podczas zapisywania formuły należy pamiętać, że rekordy mogą być przetwarzane w dowolnej kolejności i, jeśli to możliwe, równolegle. Pierwszy rekord tabeli może być przetwarzany po ostatnim rekordzie.

Należy uważać, aby uniknąć zależności kolejności. Z tego powodu nie można używać funkcji UpdateContext, Clear i ClearCollect w obrębie funkcji ForAll, ponieważ mogą one być łatwo używane do przechowywania zmiennych, które byłyby podatne na ten efekt. Można użyć funkcji Collect, ale kolejność, w której dodawane są rekordy, jest niezdefiniowana.

Kilka funkcji, które modyfikują źródeł danych, takich jak Collect, Remove i Update, zwraca zmienione źródło danych jako wartość zwracaną. Te wartości zwracane mogą być duże i wykorzystywać istotne zasoby, jeśli są zwracane dla każdego rekordu tabeli ForAll. Możesz również stwierdzić, że te wartości zwracane są nie zgodne z oczekiwaniami, ponieważ funkcja ForAll może działać równolegle i może oddzielić efekty uboczne tych funkcji od uzyskiwania ich wyników. Jeśli wartość zwracana funkcji ForAll nie jest używana, co jest częste w przypadku funkcji modyfikacji danych, wówczas wartość zwracana nie zostanie utworzona i nie będzie żadnych problemów z zasobami czy porządkowaniem. Ale w przypadku używania wyniku funkcji ForAll i jednej z funkcji, które zwracają źródło danych, należy dobrze przemyśleć strukturę wyniku i wypróbować go najpierw na małych zestawach danych.

Alternatywy

Wiele funkcji w usłudze Power Apps może przetwarzać więcej niż jedną wartość jednocześnie przy użyciu jednokolumnowej tabeli. Na przykład funkcja Len może przetworzyć tabelę wartości tekstowych, zwracając tabelę długości, w taki sam sposób, jak funkcja ForAll. Może ona wyeliminować konieczność użycia funkcji ForAll w wielu przypadkach, może być bardziej efektywna i jest łatwiejsza w odczycie.

Kolejna kwestia jest związana z tym, że funkcja ForAll nie jest możliwa do delegowania, podczas gdy inne funkcje, takie jak Filter, mogą być delegowane.

Delegowanie

Tej funkcji nie można delegować, gdy jest używana ze źródłem danych. Zostanie pobrana tylko pierwsza część źródła danych, a następnie zostanie zastosowana funkcja. Wynik może nie odpowiadać pełnym informacjom. W czasie tworzenia może zostać wyświetlone ostrzeżenie przypominające o tym ograniczeniu i sugerujące użycie delegowalnych alternatyw, jeśli jest to możliwe. Aby uzyskać więcej informacji, zobacz Omówienie delegowania.

Składnia

ForAll( Tabela, Formuła )

  • Tabela – wymagane. Tabela, dla której mają zostać podjęte działania.
  • Formula - wymagane. Formuła oceniana dla wszystkich rekordów Tabeli.

Przykłady

Obliczenia

W poniższych przykładach używane jest źródło danychSquares:

Przykład kwadratów.

Aby utworzyć to źródło danych, ustaw właściwość OnSelect kontrolki Button na poniższą formułę, otwórz tryb podglądu, a następnie wybierz przycisk:

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

Wzór Opis Wynik
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
Dla wszystkich rekordów tabeli wejściowej oblicza pierwiastek kwadratowy wartości w kolumnie Value. Funkcji Sqrt można również używać w tabeli jednokolumnowej, co umożliwia wykonanie tego przykładu bez użycia funkcji ForAll. Przykład Sqrt.
ForAll( Squares, Power( Value, 3 ) ) Dla wszystkich rekordów tabeli wejściowej podnosi wartość kolumny Value do potęgi trzeciej. Funkcja Power nie obsługuje tabel jednokolumnowych. W związku z tym w tym przypadku konieczne jest użycie funkcji ForAll. Przykład zasilania.

Korzystanie z połączenia

W poniższych przykładach używane jest źródło danychExpressions:

Przykład wyrażeń.

Aby utworzyć to źródło danych, ustaw właściwość OnSelect kontrolki Button na poniższą formułę, otwórz tryb podglądu, a następnie wybierz przycisk:

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

W tym przykładzie używane jest również połączenie z usługą Microsoft Translator. Aby dodać to połączenie do swojej aplikacji, zobacz artykuł dotyczący sposobu zarządzania połączeniami.

Wzór Opis Wynik
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) Dla wszystkich rekordów w tabeli Expressions tłumaczy zawartość kolumny Value na język hiszpański („es”). Przykład z wartością
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) Dla wszystkich rekordów w tabeli Expressions tłumaczy zawartość kolumny Value na język francuski („fr”). Przykład z wartością

Kopiowanie tabeli

Czasami trzeba filtrować dane, kształtować je, sortować i manipulować nimi. Power Apps udostępnia wiele funkcji w tym zakresie, takich jak Filter, AddColumns i Sort. Power Apps traktuje każdą tabelę jako wartość, umożliwiając jej przepływ przez formuły i łatwe wykorzystywanie.

Czasami chcesz wykonać kopię tego wyniku do późniejszego wykorzystania lub chcesz przenieść informacje z jednego źródła danych do drugiego. Usługa Power Apps udostępnia funkcję Collect umożliwiającą skopiowanie danych.

Jednak przed wykonaniem tej kopii zastanów się, czy jest to potrzebne. W wielu sytuacjach może wystarczyć filtrowanie i kształtowanie podstawowego źródła danych na żądanie przy użyciu formuły. Oto niektóre z wad tworzenia kopii:

  • Istnienie dwóch kopii tych samych informacji oznacza, że jedna z nich może nie być zsynchronizowana.
  • Wykonywanie kopii może pochłaniać większość pamięci komputera, przepustowości sieci i/lub czasu.
  • W przypadku większości źródeł danych kopiowanie nie może być delegowane, co ogranicza ilość danych, które mogą zostać przeniesione.

W poniższych przykładach używane jest źródło danychProducts:

Przykład produktów źródło danych.

Aby utworzyć to źródło danych, ustaw właściwość OnSelect kontrolki Button na poniższą formułę, otwórz tryb podglądu, a następnie wybierz przycisk:

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

Naszym celem jest praca z tabelą pochodną, która zawiera tylko elementy, w przypadku których ilość żądana jest większa niż dostępna i na które należy złożyć zamówienie:

Przykład tabeli instrumentów pochodnych.

To zadanie można wykonać na kilka różnych sposobów, które dają taki sam wynik i mają różne wady i zalety.

Kształtowanie tabeli na żądanie

Nie należy tworzyć kopii! Możemy użyć następującej formuły w dowolnym miejscu:

// 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"
)

Zakres rekordów jest tworzony przez funkcje Filter i AddColumns w celu wykonania operacji porównania i odejmowania za pomocą pól 'Quantity Requested' i 'Quantity Available' każdego rekordu.

W tym przykładzie funkcja Filter może być delegowana. Jest to ważne, ponieważ może ona znaleźć wszystkie produkty spełniające kryteria, nawet jeśli to tylko kilka rekordów z tabeli zawierającej ich miliony. W tej chwili funkcje ShowColumns i AddColumns nie mogą być delegowane, więc rzeczywista liczba produktów, które muszą zostać zamówione, zostanie ograniczona. Jeśli wiesz, że rozmiar tego wyniku zawsze będzie stosunkowo mały, to podejście jest właściwe.

I ponieważ nie utworzyliśmy kopii, nie ma żadnej dodatkowej kopii informacji, która wymaga zarządzania lub może stać się nieaktualna.

Funkcja ForAll na żądanie

Innym podejściem jest użycie funkcji ForAll w celu zastąpienia funkcji kształtowania tabeli:

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

Ta formuła może być dla niektórych osób łatwiejsza do odczytania i zapisania.

Żadna część formuły ForAll nie może być delegowana. Tylko pierwsza część tabeli Products zostanie oceniona, co może być problemem, jeśli ta tabela jest duża. Ponieważ funkcja Filter w poprzednim przykładzie mogła być delegowana, może działać lepiej w dużych zestawach danych.

Zbieranie wyników

W pewnych sytuacjach może być wymagana kopia danych. Może zaistnieć potrzeba przeniesienia informacji z jednego źródła danych do innego. W tym przykładzie zamówienia składane są za pomocą tabeli NewOrder w systemie dostawcy. Aby zapewnić dużą szybkość interakcji z użytkownikami, można buforować w pamięci podręcznej kopię lokalną tabeli, co pozwala uniknąć opóźnień serwera.

Używamy tego samego kształtowania tabeli, co w poprzednich dwóch przykładach, ale przechwytujemy wynik w kolekcji:

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

Funkcje ClearCollect i Collect nie mogą być delegowane. W związku z tym ilość danych, które mogą zostać przeniesione w ten sposób, jest ograniczona.

Funkcja Collect wewnątrz funkcji ForAll

Na koniec można wykonać funkcję Collect bezpośrednio w funkcji ForAll:

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

Funkcja ForAll nie może być delegowana w tej chwili. Jeśli tabela Products jest duża, funkcja ForAll będzie sprawdzać tylko pierwszy zestaw rekordów i niektóre produkty, które należy zamówić, mogą zostać pominięte. Jednak w przypadku tabel, o których wiemy, że pozostaną małe, to podejście jest odpowiednie.

Należy pamiętać, że wynik funkcji ForAll nie jest przechwytywany. Wywołania funkcji Collect wykonywane w ramach tej funkcji będą zwracały źródło danych NewOrder dla wszystkich rekordów, co mogłoby spowodować dodanie dużej ilości danych, gdyby były one przechwytywane.

Mapowanie tabeli w składniku

Zobacz Mapowanie tabeli.