Поділитися через


Функція «Для всіх»

Застосовується до: програм Canvas Потоків робочого столу Програм, Power Pages Power Platform керованих моделлю, CLI

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

Опис

Функція 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 не можна делегувати, тоді як інші функції, як от Filter, можна.

Делегування

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

Синтаксис

ForAll( Table, Formula )

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

Приклади

Обчислення

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

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

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

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

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

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

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

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

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

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

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

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

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

Нарешті, можна виконати функцію Collect безпосередньо в межах функції ForAll.

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

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

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

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

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