ForAll функція

Застосовується до: Програми Canvas Copilot Studio Desktop flows Model-driven apps Power Platform CLI Dataverse functions Power Pages

Обчислює значення та виконує дії для всіх записів у таблиці.

Опис

Функція ForAll обчислює формулу для всіх записів у таблиці. Формула може обчислювати значення та/або виконувати дії, як-от змінювати дані або працювати з підключенням. Використовуйте функцію With, щоб перевірити формулу для одного запису.

Використовуйте функцію Sequence з функцієюForAll, щоб ітерувати на основі кількості.

Поля оброблюваного запису доступні у формулі. Використовуйте оператор ThisRecord або просто вкажіть посилання на поля за іменем, як у випадку з будь-яким іншим значенням. Оператор As також можна використовувати для призначення імені оброблюваного запису, що спростить сприймання формули та зробить вкладені записи доступними. Додаткову інформацію див. у прикладах нижче та в статті Робота з областю застосування записів.

Значення, що повертається

Результати обчислення кожної формули повертаються в таблиці в тому самому порядку, що й у вхідній таблиці.

Якщо результат формули – це одне значення, отримана таблиця – це таблиця з одним стовпцем. Якщо результатом формули є запис, то результуюча таблиця містить записи з однаковими стовпцями як запис результату.

Якщо результат формули пустий, у таблиці результатів для цього вхідного запису немає жодного запису. У цьому випадку в таблиці результатів менше записів, ніж вихідна таблиця.

Виконання дій

Формула може включати функції, що виконують дії, як-от змінення записів джерела даних за допомогою функцій Patch і Collect. Формула також може викликати методи підключень. За допомогою оператора ; із записом можна виконати кілька дій. Не можна змінити таблицю, яка є темою ForAll функції.

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

Уникайте залежностей упорядкування. З цієї причини не можна використовувати функції UpdateContext, Clear і ClearCollect у ForAll функції, оскільки вони можуть бути легко використані для утримання змінних, які будуть сприйнятливі до цього ефекту. Можна використати функцію Collect, але порядок додавання записів буде невизначеним.

Деякі функції, що змінюють джерела даних, як-от Collect, Remove та Update, повертають змінене джерело даних як значення, що повертається. Ці повернуті значення можуть бути великими та використовувати значні ресурси, якщо їх повернуто для кожного запису ForAll таблиці. Крім того, ви можете виявити, що ці повернуті значення не є очікуваними, оскільки ForAll вони можуть працювати паралельно та відокремлювати побічні ефекти цих функцій від отримання результату. Якщо повернуте значення ForAll не використовується, це часто буває з функціями змінення даних, повернуте значення не створюється, а проблем із ресурсом або замовленням немає. Але якщо ви використовуєте результат і ForAll одну з функцій, які повертають джерело даних, ретельно подумайте про те, як ви структуруєте результат, і спробуйте спочатку на невеликих наборах даних.

Альтернативи

Багато функцій у надбудові Power Apps можуть обробляти кілька значень одночасно за допомогою таблиці з одним стовпцем. Наприклад, функція Len може обробляти таблицю текстових значень, повертаючи таблицю довжини так само, як ForAll це може бути. Це може уникнути необхідності використання ForAll в багатьох випадках, може бути більш ефективним і легше читати.

Інша увага полягає в тому, що ForAll це не делегування, а інші функції, наприклад Фільтр.

Делегування

Коли використовується з джерелом даних, цю функцію не можна делегувати. Буде отримано лише першу частину джерела даних, а потім – застосовано функцію. У результаті може відображатися не повна історія. Під час редагування може з’явитися попередження, щоб нагадати вам про це обмеження та запропонувати переключитися на делеговані альтернативи, де це можливо. Додаткову інформацію див. у статті Огляд делегування.

Синтаксис

ForAll(Таблиця, формула)

  • Таблиця - обов’язковий. Таблиця, із якою потрібно виконати дії.
  • Формула - Обов’язкова. Формула, яку потрібно обчислити для всіх записів таблиці.

Приклади

Обчислення

У наступних прикладах використовується джерело данихSquares.

Приклад квадратів.

Щоб створити це джерело даних як колекцію, задайте для властивості OnSelect елемента керування Кнопка цю формулу, відкрийте режим попереднього перегляду, а потім натисніть кнопку.

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

Формула Опис Результат
ForAll( Квадрати, Sqrt( значення )

Sqrt( Квадрати )
Для всіх записів вхідної таблиці обчислює квадратний корінь стовпця Value (Значення). Функцію Sqrt також можна використовувати з таблицею з одним стовпцем, що дає змогу виконувати цей приклад без використання ForAll. Приклад Sqrt.
ForAll( Квадрати, степінь( значення, 3 ) Для всіх записів вхідної таблиці підносить стовпець Value до третього степеня. Функція Power не підтримує таблиці з одним стовпцем. Таким чином, ForAll слід використовувати в цьому випадку. Приклад потужності.

Використання підключення

У наступних прикладах використовується джерело данихExpressions.

Приклад виразів.

Щоб створити це джерело даних як колекцію, задайте для властивості OnSelect елемента керування Кнопка цю формулу, відкрийте режим попереднього перегляду, а потім натисніть кнопку.

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

У цьому прикладі також використовується підключення до Microsoft Translator. Відомості про додавання підключення до програми див. в статті про керування підключеннями.

Формула Опис Результат
ForAll(Вирази, MicrosoftTranslator.Translate(значення, "es")) Для всіх записів у таблиці «Expressions» перекладає вміст стовпця Value іспанською (скорочене позначення: «es»). Приклад зі значенням «es».
ForAll(Вирази, MicrosoftTranslator.Translate(значення, "fr")) Для всіх записів у таблиці «Expressions» перекладає вміст стовпця 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 для виконання з полями 'Quantity Requested' (Запитана кількість) і 'Quantity Available' (Доступна кількість) кожного запису операцій порівняння та віднімання відповідно.

У цьому прикладі функцію Filter можна делегувати. Це важливо, оскільки вона може знайти всі продукти, що відповідають критеріям, навіть якщо це лише кілька записів із таблиці з мільйонами елементів. Наразі не можна делегувати showColumns і AddColumns , тому фактична кількість продуктів, які потрібно замовити, обмежена. Якщо ви знаєте, що розмір цього результату завжди відносно невеликий, цей підхід добре.

І оскільки ми не зробили копію, немає додаткової копії інформації для керування або випадання з дати.

ForAll на вимогу

Інший спосіб полягає в ForAll тому, щоб використовувати функцію для заміни функцій формування таблиць:

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

Певним користувачам може бути простіше читати та записувати цю формулу.

Жодна ForAll частина не делегується. Обчислюється лише перша частина таблиці "Товари ", що може бути проблемою, якщо ця таблиця велика. Оскільки в попередньому прикладі можна делегувати функцію Filter, вона більше підходить для роботи з великими наборами даних.

Отримання результату

У деяких випадках може знадобитися копія даних. Також може знадобитися перемістити інформацію з одного джерела даних до іншого. У цьому прикладі замовлення розміщуються через таблицю 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

Нарешті, ми можемо виконати збирання безпосередньо в :ForAll

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

Знову ж таки, ForAll функцію зараз не можна делегувати. Якщо таблиця "Товари" велика, ForAll перегляньте лише перший набір записів, і ми можемо пропустити деякі продукти, які потрібно замовити. Але для таблиць, які, як ми знаємо, залишаються невеликими, цей підхід добре.

Зверніть увагу, що результат ForAll. Функція Збирання викликів, здійснених із неї, повертає джерело даних NewOrder для всіх записів, яке може додати до багатьох даних, якщо б ми записували його.

Зіставлення таблиць у компоненті

Див. Зіставлення таблиць.