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

Если вы использовали другое средство программирования, например Visual Basic или JavaScript, у вас может возникнуть вопрос: Где переменные? Power Apps немного отличается и требует иного подхода. Вместо того, чтобы при создании приложения на основе холста мыслить в категориях переменных, спросите себя: Как это делается в Excel?

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

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

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

Реализация подхода Excel в Power Apps

Excel

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

В следующем примере в ячейке A3 установлена формула A1+A2. Если ячейка A1 или A2 изменяется, ячейка A3 автоматически пересчитывается, чтобы отразить изменение. Такое поведение не требует кодирования вне самой формулы.

Анимация пересчета суммы двух чисел в Excel.

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

Power Apps

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

Например, можно воспроизвести поведение Excel в приложении, добавив элемент управления Подпись с именем Label1 и два элемента управления Ввод текста с именами TextInput1 и TextInput2. Если затем задать для свойства Text элемента управления Label1 значение TextInput1 + TextInput2, в результате всегда будет автоматически отображаться сумма любых чисел, указанных в элементах управления TextInput1 и TextInput2.

Вычисление суммы двух чисел в Power Apps.

Обратите внимание, что при выборе элемента управления Label1 в строке формулы в верхней части экрана отображается его формула Text. В данном случае она выглядит таким образом: TextInput1 + TextInput2. Эта формула создает между этими элементами управления такую же зависимость, как между ячейками в книге Excel. Изменим значение TextInput1.

Анимация вычисления суммы двух чисел в Power Apps.

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

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

If( Value(Label1.Text) < 0, Red, Black )

Анимация условного форматирования.

Формулы можно использовать в самых разнообразных сценариях.

  • Используя GPS-модуль устройства, элемент управления картой может отобразить ваше текущее расположение с помощью формулы, использующей значения Location.Latitude и Location.Longitude. При перемещении карта будет автоматически отслеживать расположение.
  • Другие пользователи могут обновлять источники данных. Например, другие участники группы могут обновлять элементы в списке. При обновлении источника данных все зависимые формулы автоматически пересчитываются, в результате чего отображаются обновленные данные. Дополнив этот пример, можно задать коллекцию свойства Items в формуле Filter( SharePointList ), что обеспечит автоматическое отображение заново отфильтрованного набора записей.

Льготы

Использование формул для создания приложений дает множество преимуществ.

  • Если вы умеете работать с Excel, вы умеете работать с Power Apps. Модель и язык формул у них одинаковы.
  • Если вы использовали другие средства программирования, представьте себе, сколько бы вам пришлось написать кода, чтобы обеспечить вычисления, приведенные в этих примерах. В Visual Basic необходимо написать обработчик событий для события изменения в каждом текстовом поле. Код, необходимый для выполнения вычисления в каждом из них, избыточен и может не синхронизироваться, или же вам придется написать общие подпрограммы. В Power Apps все это можно сделать с помощью единственной формулы в одну строку.
  • Чтобы понять, откуда берется текст Label1, просто посмотрите на формулу в свойстве Text. Повлиять на текст данного элемента управления другими способами невозможно. В традиционных средствах программирования любые подпрограммы и обработчики событий могут изменить значение метки из любого места в программе. Из-за этого иногда сложно отследить, где и когда была изменена переменная.
  • Изменив положение ползунка, пользователь может передумать и вернуть его в исходное положение. В результате как бы ничего не происходит: приложение отображает такие же значения элемента управления, как и раньше. Нет никаких ответвлений для экспериментирования и задания вопросов "что, если", так же как их нет в Excel.

Как правило, если желаемого эффекта можно добиться с помощью формулы, лучше использовать именно ее. Обработчик формул Power Apps сделает все автоматически.

Ситуации, в которых имеет смысл использовать переменные

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

Отобразить Описание
Приложение с элементом управления вводом текста, меткой и двумя кнопками. Когда приложение запускается, нарастающий итог равен 0.

Красная точка представляет палец пользователя в поле ввода текста, куда пользователь вводит 77.
Элемент управления вводом текста содержит 77, и кнопка "Добавить" нажимается. Пользователь выбирает кнопку Добавить.
Итог равен 77, и еще 77 добавляется к нему. 77 добавлено к нарастающему итогу.

Пользователь выбирает кнопку Добавить еще раз.
Итог равен 154, прежде чем он будет очищен. 77 снова добавляется к нарастающему итогу, в результате чего получается 154.

Пользователь выбирает кнопку Очистить.
Итог очищается. Нарастающий итог сбрасывается на 0.

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

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

  • Нарастающий итог необходимо обновлять вручную. При автоматическом пересчете эта операция не выполняется.
  • Нарастающий итог больше нельзя рассчитать на основе значений других элементов управления. Он зависит от того, сколько раз пользователь нажимает кнопку Добавить и какое значение при этом содержится в элементе управления текстовым вводом на момент ее нажатия. Ввел ли пользователь 77 и нажал Добавить дважды или же указал 24 и 130 в качестве слагаемых? После того как итог станет равным 154, определить разницу невозможно.
  • Итог может изменяться по разным причинам. В этом примере к его изменению может приводить нажатие кнопок Добавить и Очистить. Как определить, какая кнопка вызывает проблему, если приложение не работает должным образом?

Использование глобальной переменной

Чтобы создать арифмометр, нам понадобится переменная для хранения нарастающего итога. Простейшие переменные в Power Apps — это глобальные переменные.

Принцип их действия заключается в следующем:

  • Значение глобальной переменной задается с помощью функции Set. Set( MyVar, 1 ) задает для глобальной переменной MyVar значение 1.
  • Используйте эту глобальную переменную, ссылаясь на ее имя в функции Set. В этом случае MyVar возвращает значение 1.
  • В глобальных переменных может храниться любое значение, в том числе строки, числа, записи и таблицы.

Перестроим наш арифмометр, воспользовавшись глобальными переменными.

  1. Добавьте элемент управления ввода текста с именем TextInput1 и две кнопки с именами Button1 и Button2.

  2. Задайте для свойства Text элемента управления Button1 значение "Добавить", а для свойства Text элемента управления Button2 — значение "Очистить".

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

    Set( RunningTotal, RunningTotal + TextInput1 )

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

    Первый раз, когда пользователь выбирает кнопку Добавить и выполняется функция Set, для RunningTotal устанавливается значение RunningTotal + TextInput1.

    Для свойства OnSelect кнопки "Добавить" установлена функция Set.

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

    Set( RunningTotal, 0 )

    Для свойства OnSelect кнопки "Очистить" установлена функция Set.

  5. Добавьте элемент управления Подпись и задайте для его свойства Text значение RunningTotal.

    Эта формула пересчитывается автоматически, а для пользователя отображается значение RunningTotal, которое изменяется в зависимости от нажимаемых им кнопок.

    Для свойства Text метки установлено имя переменной.

  6. Перейдите в режим предварительного просмотра приложения, и вы увидите, что наш арифмометр работает, как описано выше. Введите число в текстовое поле и нажмите кнопку Добавить несколько раз. Выполнив эти действия, вернитесь к разработке, нажав клавишу ESC.

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

  7. Чтобы отобразить значение глобальной переменной, выполните одно из следующих действий:

    • Если вы используете предварительную версию Power Apps Studio, выберите Переменные в меню разработки приложения.

      Меню переменных и коллекций.

    • Если вы используете классическую версию Power Apps Studio, выберите меню Файл и выберите Переменные в левой области.

  8. Чтобы отобразить все места, где определена и где используется переменная, выберите ее в разделе Глобальные переменные.

    Список мест, где используется переменная.

Типы переменных

Power Apps имеет три типа переменных:

Тип переменных Scope Описание Функции, которые устанавливают
Глобальные переменные Приложение Самые простые в использовании. В них могут храниться любые значения, в том числе числа, текстовые строки, логические значения, записи, таблицы и т. п., на которые можно ссылаться из любого места в приложении. Задание записи
Переменные контекста Экран Отлично подходят для передачи значений на экран, похожи на параметры для процедур на других языках. На них можно ссылаться только с одного экрана. UpdateContext
Navigate
Коллекции Приложение Содержит таблицу, на которую можно ссылаться из любого места в приложении. Позволяет изменять содержимое таблицы вместо того, чтобы задать все содержимое сразу. Можно сохранить на локальном устройстве для дальнейшего использования. Collect
ClearCollect

Создание и удаление переменных

Все переменные создаются неявно, когда они появляются в функции Set, UpdateContext, Navigate, Collect или ClearCollect. Чтобы объявить переменную и ее тип, вам нужно только включить ее в любую из этих функций в любом месте вашего приложения. Ни одна из этих функций не создает переменные; они только заполняют переменные значениями. Вы никогда не объявляете переменные явно, как в другом инструменте программирования, и вся типизация неявна по использованию.

Например, у вас может быть элемент управления "Кнопка" с формулой OnSelect равной Set( X, 1 ). Эта формула устанавливает X как переменную с типом числа. Вы можете использовать X в формулах в виде числа, и эта переменная имеет пустое значение после открытия приложения, но до нажатия кнопки. Когда вы выбираете кнопку, вы задаете для X значение 1.

Если вы добавите еще одну кнопку и установите для ее свойства OnSelect значение Set( X, "Hello" ), возникает ошибка, потому что тип (текстовая строка) не соответствует типу предыдущего вызова функции Set (число). Все неявные определения переменной должны иметь согласованный тип. Опять же, все это произошло потому, что вы упомянули X в формулах, а не потому, что какая-то из этих формул действительно выполнялась.

Вы удаляете переменную, удаляя все функции Set, UpdateContext, Navigate, Collect или ClearCollect, которые неявно устанавливают переменную. Без этих функций переменная не существует. Вы также должны удалить все ссылки на переменную, потому что они вызовут ошибку.

Время жизни и начальное значение переменной

Все переменные хранятся в памяти во время выполнения приложения. Когда приложение закрывается, хранящиеся в переменных значения утрачиваются.

Вы можете сохранить содержимое переменной в источник данных, используя функции Patch или Collect. Вы также можете сохранить значения в коллекциях на локальном устройстве, используя функцию SaveData.

Когда пользователь открывает приложение, все переменные имеют пустое начальное значение.

Считывание переменных

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

Set( Radius, 12 )

Тогда вы можете просто использовать переменную Radius везде, где вы можете использовать число, и она будет заменена на 12:

Pi() * Power( Radius, 2 )

Если вы присвоите контекстной переменной то же имя, что и глобальной переменной или коллекции, она будет иметь приоритет. Однако вы по-прежнему можете ссылаться на глобальную переменную или коллекцию, если используете оператор устранения неоднозначности [@Radius].

Использование переменной контекста

Давайте попробуем создать наш арифмометр, используя переменную контекста вместо глобальной переменной.

Принцип действия контекстных переменных заключается в следующем:

  • Вы неявно определяете и задаете переменные контекста с помощью функции UpdateContext или Navigate. Когда приложение запускается, все переменные контекста имеют пустое начальное значение.
  • Для обновления переменных контекста используются записи. В других средствах программирования для присвоения значений обычно используется оператор "=", например "x = 1". Для переменных контекста вместо этого используется { x: 1 }. Когда вы используете переменную контекста, используйте ее имя напрямую без синтаксиса записи.
  • Переменную контекста можно также задать при использовании функции Navigate для отображения экрана. Если представить, что экран — это своего рода процедура или подпрограмма, то такой подход напоминает передачу параметров в других средствах программирования.
  • За исключением функции Navigate, переменные контекста ограничены контекстом одного экрана (того, на котором им было присвоено их имя). Их нельзя использовать или задать вне данного контекста.
  • В переменных контекста может храниться любое значение, в том числе строки, числа, записи и таблицы.

Перестроим наш арифмометр, воспользовавшись переменными контекста:

  1. Добавьте элемент управления ввода текста с именем TextInput1 и две кнопки с именами Button1 и Button2.

  2. Задайте для свойства Text элемента управления Button1 значение "Добавить", а для свойства Text элемента управления Button2 — значение "Очистить".

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

    UpdateContext( { RunningTotal: RunningTotal + TextInput1 } )

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

    Первый раз, когда пользователь выбирает кнопку Добавить и выполняется функция UpdateContext, для RunningTotal устанавливается значение RunningTotal + TextInput1.

    Свойство OnSelect кнопки "Добавить" с updatecontext.

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

    UpdateContext( { RunningTotal: 0 } )

    Опять же, функция UpdateContext используется с формулой UpdateContext( { RunningTotal: 0 } ).

    Свойство OnSelect кнопки "Очистить" с updatecontext.

  5. Добавьте элемент управления Подпись и задайте для его свойства Text значение RunningTotal.

    Эта формула пересчитывается автоматически, а для пользователя отображается значение RunningTotal, которое изменяется в зависимости от нажимаемых им кнопок.

    Свойство Text метки.

  6. Перейдите в режим предварительного просмотра приложения, и вы увидите, что наш арифмометр работает, как описано выше. Введите число в текстовое поле и нажмите кнопку Добавить несколько раз. Выполнив эти действия, вернитесь к разработке, нажав клавишу ESC.

    Элемент управления вводом текста показывает значение, а метка показывает нарастающий итог.

  7. Вы можете задать значение переменной контекста, перейдя на экран. Этот вариант используется для передачи "контекста" или "параметров" с одного экрана на другой. Чтобы продемонстрировать этот прием, вставьте экран, вставьте кнопку и установите для ее свойства OnSelect следующую формулу:

    Navigate( Screen1, None, { RunningTotal: -1000 } )

    Свойство OnSelect кнопки.

    Удерживайте нажатой клавишу ALT, пока вы нажимаете эту кнопку, чтобы показать экран Screen1 и установить для переменной контекста RunningTotal значение –1000.

    Screen1 открыт.

  8. Чтобы отобразить значение переменной контекста, выполните одно из следующих действий:

    • Если вы используете предварительную версию Power Apps Studio, выберите Переменные в меню разработки приложения.

    • Если вы используете классическую версию Power Apps Studio, выберите меню Файл, а затем выберите Переменные в левой области.

  9. Чтобы отобразить все места, где определена и где используется переменная контекста, выберите ее в разделе Переменные контекста.

Использование коллекции

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

Принцип действия коллекций описан ниже.

  • Создайте и настройте коллекции с помощью функции ClearCollect. Вместо этого можно использовать функцию Collect, но фактически для этого потребуется создать другую переменную, а не заменить имеющуюся.
  • Коллекция — это тип источника данных, который можно представить как таблицу. Чтобы получить доступ к отдельному значению в коллекции, воспользуйтесь функцией First и извлеките одно поле из результирующей записи. Если вы использовали одно значение с ClearCollect, это будет поле Value, как в этом примере:
    First( VariableName ).Value

Создадим арифмометр, воспользовавшись коллекцией.

  1. Добавьте элемент управления Ввод текста "Ввод текста" с именем TextInput1 и две кнопки с именами Button1 и Button2.

  2. Задайте для свойства Text элемента управления Button1 значение "Добавить", а для свойства Text элемента управления Button2 — значение "Очистить".

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

    Collect( PaperTape, TextInput1.Text )

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

    Когда эта формула выполняется, она добавляет новое значение в конец коллекции. Так как мы добавляем одно значение, функция Collect автоматически помещает его в таблицу с одним столбцом с именем Value, который мы будем использовать позже.

    Свойство OnSelect кнопки "Добавить" с collect.

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

    Clear( PaperTape )

    Свойство OnSelect кнопки "Очистить" с clear.

  5. Для отображения нарастающего итога добавьте метку и задайте для нее в качестве значения свойства Text следующую формулу:

    Sum( PaperTape, Value )

    Свойство Text метки.

  6. Чтобы запустить арифмометр, нажмите F5, чтобы перейти в режим предварительного просмотра, введите число в текстовом поле и нажмите кнопки.

    Элемент управления вводом текста показывает значение, а метка показывает нарастающий итог.

  7. Нажмите клавишу ESC, чтобы вернуться в рабочую область по умолчанию.

  8. Чтобы отобразить "бумажную ленту", вставьте элемент управления Таблица данных и задайте его свойству Items следующую формулу:

    PaperTape

    На правой панели выберите Редактировать поля, а затем выберите Добавить поле, выберите столбец Значение, а затем выберите Добавить, чтобы показать.

    Таблица данных, которая показывает значения, добавленные в коллекцию.

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

    • Если вы используете предварительную версию Power Apps Studio, выберите Переменные в меню разработки приложения и затем выберите Коллекции.

    • Если вы используете классическую версию Power Apps Studio, выберите Коллекции в меню Файл.

  10. Чтобы сохранить и извлечь коллекцию, добавьте две дополнительные кнопки и задайте для их свойств Text значения Загрузить и Сохранить. Задайте для свойства OnSelect кнопки Загрузить такую формулу:

    Clear( PaperTape ); LoadData( PaperTape, "StoredPaperTape", true )

    Сначала нужно очистить коллекцию, так как функция LoadData добавит хранящиеся значения в конец коллекции.

    Свойство OnSelect кнопки "Загрузить".

  11. Установите для свойства OnSelect кнопки Сохранить следующую формулу:

    SaveData( PaperTape, "StoredPaperTape" )

    Свойство OnSelect* кнопки "Загрузить".

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

Примечание

Функции SaveData и LoadData работают в Power Apps Mobile, но не в Power Apps Studio или в веб-проигрывателе для Power Apps.

Примечание

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

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