Споделяне чрез


Функция ForAll

Отнася се за: Canvas apps Desktop flows Model-driven apps Power Platform CLI

Изчислява стойности и изпълнява действия за всички записи в таблица.

Описание

Функцията ForAll оценява формула за всички записи в таблица. Формулата може да изчисли стойност и / или да извърши действия, като например промяна на данни или работа с връзка. Използвайте With function за изчисляване на формулата за един запис.

Използвайте Sequence function с функцията ForAll за итерация, базирана на брой.

Полетата от записа, които се обработват в момента, са достъпни във формулата. Използвайте оператора ThisRecord или просто посочете полета по име, както при всяка друга стойност. Операторът As може също така да бъде използван за задаване на име на записа, който се обработва, което може да помогне вашата формула да стане по-лесна за разбиране и вложените записи да са достъпни. За повече информация вижте примерите по-долу и работа с обхвата на запис.

Стойност на връщане

Резултатът от всяка оценка на формулата се връща в таблица, в същия ред като таблицата за въвеждане.

Ако резултатът от формулата е единична стойност, получената таблица ще бъде таблица с една колона. Ако резултатът от формулата е запис, получената таблица съдържа записи със същите колони като записа на резултата.

Ако резултатът от формулата е празна стойност, няма запис в получената таблица за този входен запис. В този случай в таблицата с резултати ще има по-малко записи от таблицата с източници.

Предприемане на действие

Формулата може да включва функции, които предприемат действия, като например промяна на записите на източник на данни с Patch и Collect функции. Формулата може също да извика методи на връзки. На един запис могат да се извършват множество действия с помощта на ; оператор. Не можете да промените таблицата, която е предмет на функцията ForAll.

Когато пишете формулата си, имайте предвид, че записите могат да се обработват в произволен ред и, когато е възможно, паралелно. Първият запис на таблицата може да бъде обработен след последния запис.

Внимавайте да не поръчате зависимости. Поради тази причина не можете да използвате UpdateContext, Clear и ClearCollect функции в рамките на функцията ForAll, защото те лесно биха могли да бъдат използвани за задържане на променливи, които биха били податливи на този ефект. Можете да използвате Collect, но редът, в който се добавят записи, е неопределен.

Няколко функции, които променят източниците на данни, включително Collect, Remove и Update, върнете променената източник на данни като тяхната възвръщаема стойност. Тези стойности за връщане могат да бъдат големи и да консумират значителни ресурси, ако се върнат за всеки запис на таблица ForAll. Може също да откриете, че тези възвръщаеми стойности не са това, което очаквате, защото ForAll може да работи паралелно и може да отдели страничните ефекти от тези функции от получаването на техния резултат. Ако върнатата стойност от ForAll не се използва, което често се случва с функции за промяна на данни, върнатата стойност няма да се създаде и няма да има съображения за ресурсите или поръчките. Но ако използвате резултата от ForAll и една от функциите, която връща източник на данни, помислете внимателно как структурирате резултата и го изпробвайте първо на малки набори от данни.

Алтернативи

Много функции в Power Apps могат да обработват повече от една стойност наведнъж чрез използването на таблица с една колона. Например функцията Len може да обработва таблица с текстови стойности, връщайки таблица с дължини, по същия начин, по който може ForAll. Това може да премахне необходимостта от употреба ForAll в много случаи може да бъде по-ефикасен и по-лесен за четене.

Друго съображение е това ForAll не е делируем, докато могат да бъдат други функции, като например Filter.

Делегиране

Когато се използва с източник на данни, тази функция не може да се делегира. Ще се извлече само първата част на източника на данни, след което ще се приложи функцията. Резултатът може да не е завършен. Може да се покаже предупреждение в момента на създаване, за да ви напомни за това ограничение и да предложи превключване към алтернативи с възможност за делегиране, ако е възможно. За повече информация вж. прегледа на делегирането.

Синтаксис

ForAll( Table, Formula )

  • Table – Задължително. Таблица, върху която трябва да се действа.
  • Formula – Задължително. Формулата за оценка за всички записи на Таблица.

Примери

Изчисления

Следващите примери използват Squaresизточник на данни:

Пример за квадрати.

За да създадете тази източник на данни като колекция, задайте свойството OnSelect на контролата Бутон на тази формула, отворете режим за преглед и след това изберете бутона:

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

Формула Описание Резултат
ForAll( Squares, Sqrt( Value ) )

Sqrt( Squares )
За всички записи на входната таблица изчислява квадратния корен на колона стойност. Функцията Sqrt може да се използва и с таблица с една колона, което прави възможно изпълнението на този пример без използване на ForAll. Пример за Sqrt.
ForAll( Squares, Power( Value, 3 ) ) За всички записи на входната таблица повдига колоната стойност на трета степен. Функцията Power не поддържа таблици с една колона. Следователно, ForAll трябва да се използва в този случай. Пример за мощност.

Използване на връзка

Следващите примери използват Expressionsизточник на данни:

Пример за изрази.

За да създадете тази източник на данни като колекция, задайте свойството OnSelect на контролата Бутон на тази формула, отворете режим за преглед и след това изберете бутона:

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

Този пример също използва връзка с Microsoft Translator. За да добавите тази връзка към приложението, вижте статията за това как да управлявате връзки.

Формула Описание Резултат
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "es" ) ) За всички записи в таблицата изрази преведете съдържанието на стойност колона на испански (съкратено "es"). Пример със стойност
ForAll( Expressions, MicrosoftTranslator.Translate( Value, "fr" ) ) За всички записи в таблицата изрази преведете съдържанието на стойност колона на френски (съкратено "fr"). Пример със стойност

Копиране на таблица

Понякога е необходимо да филтрирате, оформите, подредите и манипулирате данните. Power Apps предоставя много функции, с които да го направите, като например Filter, AddColumns и Sort. Power Apps третира всяка таблица като стойност, като й позволява да преминава през формули и да се използва лесно.

А понякога искате да направите копие на този резултат за по-късно използване или искате да преместите информация от един източник на данни в друг. Power Apps осигурява Collect функция за копиране на данни.

Но преди да направите това копие, помислете внимателно дали е необходимо. Много ситуации могат да бъдат разрешени чрез филтриране и оформяне на основните източник на данни при поискване с формула. Някои от недостатъците при създаването на копие включват:

  • Две копия на една и съща информация означават, че едно от тях може да не се синхронизира.
  • Създаването на копие може да използва голяма част от компютърната памет, мрежовата честотна лента и/или много време.
  • За повечето източници на данни копирането не може да бъде делегирано, ограничавайки колко данни могат да бъдат преместени.

Следващите примери използват Productsизточник на данни:

Пример за източник на данни на продукт.

За да създадете тази източник на данни като колекция, задайте свойството OnSelect на контролата Бутон на тази формула, отворете режим за преглед и след това изберете бутона:

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

Нашата цел е да работим с производна таблица, която включва само елементите, за които е поискано повече, отколкото е налично, и за които трябва да направим поръчка:

Пример за производна таблица.

Можем да изпълним тази задача по няколко различни начина, всички от които дават един и същ резултат, с различни плюсове и минуси.

Оформяне на маса при поискване

Не правете това копие! Можем да използваме следната формула навсякъде, където имаме нужда:

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

Обхват на записа е създаден от Filter и AddColumns функции за изпълнение на операциите за сравняване и изваждане, съответно, с „Заявено количество“ и „Количество на разположение“ полета на всеки запис.

В този пример функцията Filter може да бъде делегирана. Това е важно, тъй като в него могат да се намерят всички продукти, които отговарят на критериите, дори ако това е само няколко записа от таблица с милиони. Засега ShowColumns и AddColumns не могат да се делегират, така че действителният брой продукти, които трябва да се поръчат, ще бъде ограничен. Ако знаете, че размерът на този резултат винаги ще бъде сравнително малък, този подход е добре.

И тъй като не направихме копие, няма допълнително копие на информацията, която да се управлява или да остарее.

ForAll при поискване

Друг подход е използването на ForAll функция за замяна на функциите за оформяне на таблицата:

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

Тази формула може да бъде по-проста за някои хора да четат и пишат.

Никоя част от ForAll не може да се делегира. Само първата част от таблицата Продукти ще се оцени, което може да е проблем, ако тази таблица е голяма. Тъй като филтър може да бъде делегиран в предишния пример, може да работи по-добре с големи масиви от данни.

Съберете резултата

В някои ситуации може да се изисква копие на данни. Може да имате нужда да преместите информация от един източник на данни в друг. В този пример поръчките се правят чрез таблица NewOrder на системата на доставчик. За високоскоростни потребителски взаимодействия може да искате да кеширате локално копие на таблица, така че да няма закъснение на сървъра.

Ние използваме същата оформяне на таблицата като предишните два примера, но улавяме резултата в колекция:

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 и Collect не може да бъде делегиран. В резултат на това количеството данни, което може да бъде преместено по този начин, е ограничено.

Събиране в рамките на ForAll

Накрая можем да изпълним Collect директно в рамките на ForAll:

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

Отново ForAll функцията не може да бъде делегирана понастоящем. Ако нашата таблица Продукти е голяма, ForAll ще погледне само първия набор от записи и може да пропуснем някои продукти, които трябва да бъдат поръчани. Но за таблиците, за които знаем, че ще останат малки, този подход е добре.

Имайте предвид, че ние не улавяме резултата от ForAll. Извикванията на функцията Collect, направени отвътре, ще върнат източник на данни NewOrder за всички записи, които могат да добавят към множество данни, ако бъдат уловени.

Таблица на картата в компонент

Вижте Таблици с карти.