Общие сведения о таблицах и записях в приложениях на основе холста

Power Apps позволяет вам создать приложение на основе холста, обращающееся к сведениям в Microsoft Excel, SharePoint, SQL Server и ряде других источников, хранящих данные в виде записей и таблиц. Чтобы работать с данными такого типа максимально эффективно, ознакомьтесь с основными понятиями, которые лежат в основе этих структур.

  • Запись содержит одну или несколько категорий сведений о человеке, месте или предмете. Например, запись может содержать имя, адрес электронной почты и номер телефона для одного клиента. В других средствах записи называются "строками" или "элементами".
  • В таблице хранится одна или несколько записей, содержащих одинаковые категории сведений. Например, таблица может содержать имена, адреса электронной почты и номера телефона 50 клиентов.

Для создания и обновления записей и таблиц, а также управления ими в приложении используются формулы. Зачастую данные при этом считываются из внешнего источника данных, представляющего собой расширенную таблицу, и записываются в такой источник. Кроме того, можно создать одну или несколько внутренних таблиц, которые называются коллекциями.

Вы можете создавать различные формулы, которые принимают имя таблицы в качестве аргумента так же, как формула в Excel принимает одну или несколько ссылок на ячейки. Некоторые формулы в Power Apps возвращают таблицу, в которой отражаются значения других заданных аргументов. Например, можно создать формулу:

  • чтобы обновлять записи в таблице, указав эту таблицу в качестве одного из нескольких аргументов функции Patch;
  • чтобы добавлять, удалять и переименовывать столбцы в таблице, указав ее в качестве аргумента функции AddColumns, DropColumns или RenameColumns. Ни одна из этих функций не изменяет исходную таблицу. Вместо этого функция возвращает другую таблицу на основе других заданных аргументов.

Элементы таблицы

Элементы таблицы.

Записи

Каждая запись содержит по меньшей мере одну категорию сведений о человеке, месте или предмете. В предыдущем примере показана запись для каждого товара (Chocolate, Bread и Water) и столбец для каждой категории сведений (Price, Quantity on Hand и Quantity on Order).

Чтобы сослаться в формуле на саму запись вне контекста таблицы, воспользуйтесь фигурными скобками. Например, запись { Name: "Strawberries", Price: 7,99 } не связана с таблицей. Обратите внимание, что имена полей Name и Price в этом примере не заключаются в двойные кавычки.

Поля

Поле — это отдельная часть сведений в записи. Такого рода поля можно представить себе как значение в столбце определенной записи.

Как и в случае с элементом управления, для ссылки на поле записи используется . (оператор записи). Например, First(Products).Name возвращает поле Name для первой записи в таблице Products.

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

Столбцы

Столбец состоит из одинаковых полей одной или нескольких записей в таблице. В приведенном выше примере у каждого товара есть поле цены, и эта цена находится в одном и том же столбце для всех продуктов. Приведенная выше таблица состоит из четырех столбцов, имена которых показаны в первой строке:

  • Название
  • Цена
  • Количество в наличии
  • Количество по заказу

Имя столбца соответствует содержащимся в нем полям.

Все значения в столбце принадлежат к одинаковому типу данных. В приведенном выше примере столбец "Количество в наличии" всегда содержит число и не может содержать строку, например "12 единиц", для одной из записей. Значение любого поля может быть также пустым.

В других средствах столбцы могут называться "полями".

Примечание

Для источников данных, таких как плитки SharePoint, Excel, Power BI, содержащие имена столбцов с пробелами, Power Apps заменит эти пробелы кодом "_x0020_". Например, столбец Имя столбца из плитки SharePoint, Excel или Power BI будет отображаться как Имя_x0020_столбца в Power Apps при отображении в структуре данных или использовании в формуле.

Table

Таблица состоит из одной или нескольких записей, каждая из которых имеет несколько полей с согласованными именами во всех записях.

У всех таблиц, хранящихся в источнике данных или коллекции, есть имя, которое используется для ссылки на таблицу и передачи ее функциям, принимающим таблицы в качестве аргументов. Таблицы также могут быть результатом функции или формулы.

Как показано в следующем примере, таблицу в формуле можно представить с помощью функции Table с набором записей, которые записываются в фигурных скобках:

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

Используя квадратные скобки, можно также определить таблицу с одним столбцом. Эквивалентный способ представления приведенной выше записи:

[ "Strawberry", "Vanilla" ]

Формулы для таблиц

В Excel и Power Apps формулы для обработки чисел и строк текста используются аналогичным образом.

  • Если в Excel ввести значение, например 42, в ячейке A1 и формулу, например A1+2, в другой ячейке, в ней отобразится значение 44.
  • Если в Power Apps задать для свойства Default элемента управления Ползунок1 значение 42, а для свойства Text метки — значение Slider1.Value + 2, также отобразится значение 44.

В обоих случаях вычисленное значение изменяется автоматически при изменении значений аргументов (например, числа в ячейке A1 или значения Slider1).

Аналогично можно использовать формулы для доступа к данным в таблицах и записях, а также управления ими. В некоторых формулах имена таблиц можно использовать в качестве аргументов. Например, Min(Catalog, Price) можно использовать для отображения минимального значения столбца Price таблицы Catalog. Другие формулы возвращают в качестве значения целые таблицы, например RenameColumns(Catalog, "Price", "Cost"), которая возвращает все записи из таблицы Catalog, но изменяет имя столбца Price на Cost.

Так же как в случае с числами, формулы, включающие в себя таблицы и записи, автоматически пересчитываются при изменении базовой таблицы или записи. Если стоимость товара в таблице Catalog станет меньше предыдущего минимального значения, возвращаемое значение формулы Min автоматически изменится соответствующим образом.

Давайте рассмотрим несколько простых примеров.

  1. Создайте пустое приложение для телефона и добавьте вертикальный элемент управления Галерея, который содержит другие элементы управления.

    По умолчанию на экране отображается заполнитель из таблицы CustomGallerySample. В качестве значения свойства Items элемента управления Галерея на этом экране автоматически устанавливается эта таблица.

    Коллекция.

    Примечание

    Для большей наглядности на иллюстрациях мы изменили относительное расположение некоторых элементов управления и увеличили их размер.

  2. Вместо того чтобы задавать в качестве значения свойства Items имя таблицы, присвойте ему формулу, которая включает в себя имя таблицы в качестве аргумента, как показано в этом примере:

    Sort(CustomGallerySample, SampleHeading, SortOrder.Descending)

    Эта формула содержит функцию Sort, которая принимает имя таблицы в качестве первого аргумента и имя ее столбца в качестве второго. Функция также поддерживает необязательный третий аргумент, который указывает, что данные необходимо отсортировать в порядке убывания.

    Sort для коллекции.

  3. Задайте в качестве значения свойства Items формулу, которая принимает в качестве аргумента формулу с предыдущего этапа и возвращает таблицу, как в следующем примере:

    FirstN(Sort(CustomGallerySample, SampleHeading, SortOrder.Descending), 2)

    В этой формуле для отображения определенного числа записей в таблице используется функция FirstN. Функция Sort используется в качестве первого аргумента FirstN, и число (в данном случае 2) — в качестве второго (он указывает, сколько записей следует отображать).

    Вся формула возвращает таблицу, содержащую первые две записи таблицы CustomGallerySample, отсортированные по столбцу SampleHeading в порядке убывания.

    FirstN для коллекции.

Функции для таблиц и свойства элементов управления

Рассмотрим функцию Lower. Если переменная welcome содержит текстовую строку "Hello, World", формула Lower( welcome ) возвращает "hello, world". Эта функция никоим образом не изменяет значение в этой переменной. Lower — это чистая функция в том смысле, что она только обрабатывает входные данные и производит выходные данные. Это все; она не имеет побочных эффектов. Все функции в Excel и большинство функций в Power Apps — это чистые функции, которые позволяют автоматически пересчитать книгу или приложение.

Power Apps предлагает набор функций, которые работают с таблицами таким же образом. Эти функции принимают таблицы в качестве входных данных и фильтруют, сортируют, преобразовывают, сокращают и суммируют целые таблицы данных. На самом деле функция Lower и многие другие функции, которые обычно принимают одно значение, также могут принимать в качестве входных данных таблицу из одного столбца.

  • Sort, Filter  — сортирует и фильтрует записи.
  • FirstN, LastN  — возвращает первые или последние N записей таблицы.
  • Abs, Sqrt, Round, RoundUp, RoundDown  — выполняет с каждой записью таблицы из одного столбца арифметические операции, результатом которых является таблица с одним столбцом.
  • Left, Mid, Right, Replace, Substitute, Trim, Lower, Upper, Proper  — обрабатывает строки каждой записи таблицы из одного столбца, создавая в результате таблицу строк с одним столбцом.
  • Len  — возвращает таблицу из одного столбца, содержащего длины каждой из строк, для столбца строк.
  • Concatenate  — объединяет несколько столбцов строк, создавая в результате таблицу строк из одного столбца.
  • AddColumns, DropColumns, RenameColumns, ShowColumns  — обрабатывает столбец таблицы, в результате чего создается новая таблица с различными столбцами.
  • Distinct  — удаляет дубликаты записей.
  • Shuffle  — переставляет записи в произвольном порядке.
  • HashTags  — ищет хэш-теги в строке.
  • Errors  — предоставляет сведения об ошибке при работе с источником данных.

Многие из этих функций принимают в качестве входных данных таблицу из одного столбца. Если во всей таблице есть только один столбец, вы можете указать его по имени. Если таблица имеет несколько столбцов, вы можете указать один из этих столбцов, используя синтаксис Таблица.Столбец. Например, Products.Name возвращает таблицу с одним столбцом только значений Name из таблицы Products.

Вы можете полностью изменить форму таблицы, как хотите, используя функцию AddColumns, RenameColumns, ShowColumns или DropColumns. Опять же, эти функции изменяют только свое выходные данные, но не источник.

Свойства элементов управления также могут быть таблицами:

  • Items — применяется для коллекций, списков и полей со списком. Это свойство определяет таблицу, которую показывает колекция или список.
  • SelectedItems — применяется для списков и полей со списком. Это свойство определяет таблицу элементов, выбранных пользователем, если включен параметр SelectMultiple.

Формулы поведения

Другие функции специально предназначены для изменения данных и имеют побочные эффекты. Поскольку эти функции не являются чистыми, вы должны тщательно их строить, и они не могут участвовать в автоматическом пересчете значений в приложении. Эти функции можно использовать только внутри формул поведения.

  • Collect, Clear, ClearCollect  — создает коллекции, очищает их и добавляет данные в них.
  • Patch — изменяет одно или несколько полей в записи.
  • Update, UpdateIf  — обновляет записи, которые соответствуют одному или нескольким заданным условиям.
  • Remove, RemoveIf  — удаляет записи, которые соответствуют одному или нескольким заданным условиям.

Формулы записей

Вы можете также создать формулу, которая вычисляет данные для отдельной записи, принимает отдельную запись в качестве аргумента и предоставляет отдельную запись как возвращаемое значение. Возвращаясь к приведенному выше примеру коллекции, воспользуемся свойством Gallery1.Selected для отображения сведений из записи, которую выбрал в ней пользователь.

  1. Добавьте кнопку и задайте следующую формулу в качестве значения свойства OnSelect:
    Collect( SelectedRecord, Gallery1.Selected )

  2. Удерживая нажатой клавишу ALT, выберите эту кнопку.

  3. В меню Файл выберите Коллекции.

    Коллекция SelectedRecord.

Эта формула возвращает запись, которая включает в себя данные не только из записи, выбранной в данный момент в коллекции, но и каждого элемента управления в этой коллекции. Например, запись содержит столбец SampleText, который соответствует столбцу SampleText в исходной таблице, и столбец Subtitle1, представляющий метку, в которой отображаются данные из этого столбца. Выберите значок таблицы в столбце Subtitle1 для детализации данных.

Примечание

Столбец Subtitle1 может называться Subtitle2 или подобным образом, если вы добавили другие элементы помимо описанных в этом разделе.

Теперь при наличии выбранной записи можно извлечь из нее отдельные поля с помощью оператора . оператор.

  1. Добавьте элемент управления Подпись и переместите его под коллекцию и кнопку.

  2. Задайте для свойства Text метки следующее выражение:
    "Selected: " & Gallery1.Selected.SampleHeading

    Текстовое свойство с обновленной меткой.

Таким образом вы получили свойство Selected, которое представляет собой запись, и извлекли из него свойство SampleHeading.

Запись можно также использовать как контейнер общего назначения для соответствующих именованных значений.

  • При построении формулы, в которой используются функции UpdateContext и Navigate, для сбора переменных контекста, которые необходимо обновить, используется запись.
  • Для сбора изменений, внесенных пользователем в форму, воспользуйтесь свойством Updates элемента управления Форма редактирования.
  • Чтобы обновить источник данных и при этом объединить записи, воспользуйтесь функцией Patch.

В этих случаях запись никогда не была частью таблицы.

Функции для записей и свойства элементов управления

Функции, возвращающие записи:

  • FirstN, LastN  — возвращает одну или несколько первых или последних записей таблицы.
  • Lookup  — возвращает первую запись таблицы, которая соответствует одному или нескольким условиям.
  • Patch  — обновляет источник данных или выполняет слияние записей.
  • Defaults — возвращает значения по умолчанию для источника данных.

Свойства, возвращающие записи:

  • Selected — применяется для коллекций и списков. Возвращает выбранную в данный момент запись.
  • Updates — применяется для коллекций. Объединяет все изменения, вносимые пользователем в форме ввода данных.
  • Update  — применяется для элементов управления вводом, например элементов управления вводом текста и ползунков. Задает отдельные свойства, собираемые в коллекции.

Область действия записи

Некоторые функции при выполнении вычисляют формулы для всех записей таблицы по отдельности. Результат формулы используется различными способами:

  • AddColumns — формула предоставляет значение добавленного поля.
  • Average, Max, Min, Sum, StdevP, VarP — формула предоставляет значение для выполнения статистического вычисления.
  • Filter, Lookup — формула определяет, нужно ли включать запись в выходные данные.
  • Concat — формула определяет строки, которые следует объединять.
  • DISTINCT — формула возвращает значение, используемое для выявления повторяющихся записей.
  • ForAll — формула может возвращать любое значение, потенциально может иметь побочные эффекты.
  • Sort — формула предоставляет значение для сортировки записей.
  • With — формула может возвращать любое значение, потенциально может иметь побочные эффекты.

Внутри этих формул можно ссылаться на поля обрабатываемой записи. Каждая из этих функций создает "область записи", в которой вычисляется формула. При этом поля записи предоставляются как идентификаторы верхнего уровня. Можно также сослаться на свойства элемента управления и другие значения из приложения.

Возьмем, например, таблицу Products.

Пример продуктов.

Чтобы создать этот пример таблицы в вашем приложении, вставьте кнопку, установите для ее свойства OnSelect следующую формулу, затем выберите кнопку (нажмите ее, удерживая нажатой клавишу ALT в Power Apps Studio):

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

Чтобы определить, требуется ли какого-либо из этих продуктов больше, чем есть в наличии, воспользуйтесь формулой:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Первый аргумент функции Filter — это таблица записей, которые необходимо обработать, а второй — это формула. Функция Filter создает для вычисления этой формулы область записи, в которой доступны поля каждой записи. В данном случае это Product, Quantity Requested и Quantity Available. От результата сравнения зависит, нужно ли включать каждую запись в результат функции.

Фильтрованная таблица.

Просуммировав значения в этом примере, можно рассчитать, сколько единиц каждого товара следует заказать.

AddColumns( 
    Filter( Products, 'Quantity Requested' > 'Quantity Available' ), 
    "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)

Здесь мы добавляем к результату вычисляемый столбец. У функции AddColumns есть своя область записи, которая используется для вычисления разницы между запрашиваемым и доступным количеством.

Добавленные столбцы.

Наконец, мы можем сократить результирующую таблицу только до необходимых столбцов.

ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Обновленная таблица.

Обратите внимание, что в приведенном выше примере в одних местах мы использовали двойные кавычки ("), а в других — одинарные ('). Одинарные кавычки необходимы при ссылке на значение объекта, например поля или таблицы, если его имя содержит пробел. Двойные кавычки используются, когда нужно не сослаться на значение объекта, а просто его объявить, что особенно важно в ситуациях, когда объект еще не существует, как в случае с AddColumns.

Устранение неоднозначности

Имена полей, добавленные с помощью области записи, переопределяют такие же имена из любого другого места в приложении. В этом случае с помощью оператора устранения неоднозначности @ можно по-прежнему получать доступ к значениям за пределами области записи.

  • Для доступа к значениям из вложенных областей записей используйте оператор @, указав имя нужной таблицы в формате:
    Table[@FieldName]
  • Чтобы получить доступ к глобальным значениям, таким как источники данных, коллекции и переменные контекста, используйте шаблон [@ObjectName] (без обозначения таблицы).

Если таблица, над которой выполняется операция, представляет собой выражение, например Filter( Table, ... ), оператор устранения неоднозначности использовать нельзя. Не используя оператор устранения неоднозначности, получить доступ к полям этого табличного выражения можно только в наиболее глубоко вложенной области записи.

Представьте, например, что есть коллекция X.

Коллекция X.

Ее можно создать с помощью функции ClearCollect( X, [1, 2] ).

Есть также другая коллекция Y.

Коллекция Y.

Эту коллекцию можно создать с помощью функции ClearCollect( Y, ["A", "B"] ).

Кроме того, определите переменную контекста с именем Value с помощью следующей формулы: UpdateContext( {Value: "!"} )

Давайте теперь соберем все это вместе. В этом контексте следующая формула:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

дает такую таблицу:

Таблица XY.

Что в этом случае происходит? Внешняя функция ForAll определяет область записи для X, обеспечивая доступ к полю Value всех записей по мере их обработки. Для доступа к нему можно просто воспользоваться словом Value или выражением X[@Value].

Наиболее глубоко вложенная функция ForAll определяет другую область записи для Y. Поскольку в этой таблице также определено поле Value, значение Value в данном случае будет ссылаться на поле в записи коллекции Y и больше не будет ссылаться на поле из X. Чтобы получить здесь доступ к полю Value из коллекции X, необходимо использовать более длинную версию с оператором устранения неоднозначности.

Поскольку Y является самой глубоко вложенной областью записи, для доступа к полям в этой таблице устранение неоднозначности не требуется, что позволяет использовать эту формулу с тем же результатом:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

Все области записей ForAll переопределяют глобальную область. На определенную нами переменную контекста Value нельзя ссылаться по имени без оператора устранения неоднозначности. Чтобы получить доступ к этому значению, используйте [@Value].

Ungroup преобразует результат в плоскую структуру, поскольку вложенные функции ForAll приведут к созданию вложенной результирующей таблицы.

Таблицы с одним столбцом

Для работы с одним столбцом из таблицы используйте функцию ShowColumns, как в этом примере:

ShowColumns( Products, "Product" )

Эта формула производит эту таблицу с одним столбцом:

Таблица с одним столбцом.

Для более короткой альтернативы укажите Table.Column, что извлекает таблицу из одного столбца (только Столбециз Таблицы). Например, эта формула дает точно такой же результат, как и при использовании ShowColumns.

Products.Product

Встроенные записи

Для обозначения записей используются фигурные скобки, содержащие значения именованных полей. Например, первую запись в таблице, приведенной в начале данного раздела, можно выразить с помощью следующей формулы:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

Вы можете также встраивать одни формулы в другие, как показано в этом примере:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

Чтобы вложить записи, можно воспользоваться вложенными фигурными скобками, как показано в следующем примере:

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Заключите имя каждого столбца, содержащего специальный символ, например пробел или двоеточие, в одинарные кавычки. Чтобы использовать одинарные кавычки в имени столбца, укажите их дважды.

Обратите внимание, что значение в столбце Price не содержит символ валюты, например знак рубля. Форматирование будет применено при отображении значения.

Встроенные таблицы

Таблицу можно создать с помощью функции Table и набора записей. Таблицу, приведенную в начале данного раздела, можно представить с помощью следующей формулы:

Table( 
    { Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
    { Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
    { Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } 
)

Таблицы можно также вкладывать друг в друга:

Table( 
    { Name: "Chocolate", 
      'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
                                 { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
    }
)

Таблицы встроенных значений

Вы можете создать таблицы с одним столбцом, указав значения в квадратных скобках. Результирующая таблица будет содержать один столбец с именем Value.

Например, [ 1, 2, 3, 4 ] эквивалентно Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) и возвращает следующую таблицу:

Встроенная таблица.

Примечание

Каковы ваши предпочтения в отношении языка документации? Пройдите краткий опрос (обратите внимание, что этот опрос представлен на английском языке).

Опрос займет около семи минут. Личные данные не собираются (заявление о конфиденциальности).