Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Заметка
Microsoft Power Fx — это новое название языка формул приложений на основе холста. Эти статьи выполняются, так как Microsoft извлекает язык из приложений холста, интегрирует его с другими продуктами Microsoft Power Platform и делает его доступным как открытый код. Начните с Обзора Microsoft Power Fx, содержащего введение в язык.
Узнайте, как переменные Power Fx отличаются от переменных в таких средствах, как Visual Basic или JavaScript, и когда формулы лучше выбрать. В этой статье объясняется, как выбрать глобальные переменные, контекстные переменные или коллекции для управления значениями и состоянием приложения.
В других средствах вы можете явно выполнить вычисление и сохранить результат в переменной. Однако в Power Fx и Excel формулы пересчитываются автоматически при изменении входных данных, поэтому обычно не требуется создавать и обновлять переменные. Применяя такой подход по мере возможности, можно легко создавать и обслуживать приложения, полностью понимая принцип их работы.
В некоторых случаях необходимо использовать переменные в Power Fx. Power Fx расширяет модель Excel путем добавления формул поведения. Эти формулы, например, выполняются, когда пользователь нажимает кнопку. В формуле поведения часто полезно задать переменную для использования в других формулах.
Как правило, использовать переменные нежелательно. Однако иногда только с их помощью можно обеспечить желаемые возможности. Вы неявно создаете и вводите переменные при отображении в функциях, которые задают их значения.
Реализация подхода Excel в Power Fx
Excel
Давайте посмотрим, как работает Excel. Ячейка может содержать значение, например число, строку или формулу, в которой используются значения других ячеек. После того как пользователь вводит другое значение в ячейку, Excel автоматически пересчитывает все формулы, которые зависят от нового значения. При этом для обеспечения такого поведения не нужно ничего программировать.
В следующем примере в ячейке A3 установлена формула A1+A2. Если ячейка A1 или A2 изменяется, ячейка A3 автоматически пересчитывается, чтобы отразить изменение. Такое поведение не требует кодирования вне самой формулы.
В Excel нет переменных. Значение ячейки, содержащей формулу, изменяется в зависимости от входных данных, но при этом нет возможности запомнить результат формулы и сохранить его в ячейке или в любом другом месте. При изменении значения ячейки вся электронная таблица может измениться, и все ранее вычисляемые значения будут потеряны. Пользователь Excel может копировать и вставлять ячейки, но это нужно делать вручную. С помощью формул выполнить такую операцию невозможно.
Power Fx
Логика, создаваемая в Power Fx, во многом напоминает поведение Excel. Вместо обновления ячеек можно добавить элементы управления в любом месте на экране и присвоить им имена, чтобы их можно было использовать в формулах.
Например, в Power Apps можно воспроизвести поведение Excel в приложении, добавив элемент управления Метка с именем Label1 и два элемента управления Текстовое поле с именами TextInput1 и TextInput2. Если затем задать для свойства TextLabel1 значение TextInput1.Text + TextInput2.Text, всегда отображается сумма всех чисел в TextInput1 и TextInput2 автоматически.
Обратите внимание, что при выборе элемента управления Label1 в строке формулы в верхней части экрана отображается его формула Text. Здесь вы найдете формулу TextInput1.Text + TextInput2.Text. Эта формула создает между этими элементами управления такую же зависимость, как между ячейками в книге Excel. Изменим значение TextInput1.
Формула для Label1 автоматически вычисляется, отображая новое значение.
Чтобы в Power Fx определить не только основное значение элемента управления, но и его свойства, например форматирование, можно воспользоваться формулами. В следующем примере формула свойства Color метки автоматически отображает отрицательные значения красным цветом. Функция If похожа на ту, которая используется в Excel.
If( Value(Label1.Text) < 0, Color.Red, Color.Black )
Формулы можно использовать в самых разнообразных сценариях.
- Используя GPS-модуль устройства, элемент управления картой может отобразить ваше текущее расположение с помощью формулы, использующей значения Location.Latitude и Location.Longitude. При перемещении карта автоматически отслеживает расположение.
- Другие пользователи могут обновлять источники данных. Например, другие участники рабочей группы могут обновлять элементы в списке SharePoint. При обновлении источника данных все зависимые формулы автоматически пересчитываются для отражения обновленных данных. Далее в примере можно задать свойство Items коллекции для фильтра формул (SharePointList), которое автоматически отображает только что отфильтрованный набор записей.
Преимущества формул Power Fx
Использование формул для создания приложений предлагает множество преимуществ:
- Если вы умеете работать с Excel, вы умеете работать с Power Fx. Модель и язык формул у них одинаковы.
- Если вы используете другие средства программирования, рассмотрите, сколько кода потребуется выполнить в этих примерах. В Visual Basic необходимо написать обработчик событий для события изменения в каждом текстовом поле. Код для выполнения вычисления в каждом из этих обработчиков событий является избыточным и может выйти из синхронизации или создать общую подпрограмму. В Power Fx все это работает с одной одностроочной формулой.
- Чтобы понять, откуда исходит текст Label1, вы точно знаете, где выглядеть: формула в свойстве Text . Повлиять на текст данного элемента управления другими способами невозможно. В традиционных средствах программирования любые подпрограммы и обработчики событий могут изменить значение метки из любого места в программе. Такой подход может затруднить отслеживание того, когда и где была изменена переменная.
- Изменив положение ползунка, пользователь может передумать и вернуть его в исходное положение. Это как будто ничего не изменилось: приложение отображает те же значения элементов управления, что и раньше. Нет никаких ответвлений для экспериментирования и задания вопросов "что, если", так же как их нет в Excel.
Как правило, если вы можете добиться эффекта с помощью формулы, лучше. Обработчик формул Power Fx сделает все автоматически.
Ситуации, в которых имеет смысл использовать переменные
Давайте изменим наш простой сумматор так, чтобы он функционировал по принципу старинного арифмометра, используя нарастающий итог. Если вы выберете кнопку "Добавить ", добавьте число в запущенную общую сумму. Если нажать кнопку "Очистить ", вы сбросите общей суммы выполнения до нуля.
| Отобразить | Описание |
|---|---|
|
Когда приложение запускается, нарастающий итог равен 0. Красная точка представляет палец пользователя в поле ввода текста, куда пользователь вводит 77. |
|
Пользователь выбирает кнопку Добавить. |
|
77 добавлено к нарастающему итогу. Пользователь выбирает кнопку Добавить еще раз. |
|
77 снова добавляется к нарастающему итогу, в результате чего получается 154. Пользователь выбирает кнопку Очистить. |
|
Нарастающий итог сбрасывается на 0. |
Наш арифмометр использует то, чего нет в Excel: кнопки. В этом приложении для вычисления нарастающих итогов нельзя использовать только формулы, поскольку их значение зависит от ряда действий, которые выполняет пользователь. Вместо этого необходимо записать и обновить общую сумму выполнения вручную. Большинство средств программирования сохраняет эти сведения в переменной.
Иногда, чтобы приложения вели себя необходимым образом, требуется использовать переменные. Однако такой подход применим с некоторыми оговорками.
- Нарастающий итог необходимо обновлять вручную. При автоматическом пересчете эта операция не выполняется.
- Вы не можете вычислить запущенный итог на основе значений других элементов управления. Он зависит от того, сколько раз пользователь нажимает кнопку Добавить и какое значение при этом содержится в элементе управления текстовым вводом на момент ее нажатия. Ввел ли пользователь 77 и нажал Добавить дважды или же указал 24 и 130 в качестве слагаемых? Вы не заметите разницу, если итог достигнет 154.
- Итог может изменяться по разным причинам. В этом примере к его изменению может приводить нажатие кнопок Добавить и Очистить. Как определить, какая кнопка вызывает проблему, если приложение не работает должным образом?
Использование глобальной переменной
Чтобы создать добавляющий компьютер, вам потребуется переменная для хранения выполняемой общей суммы. Простейшие переменные в Power Fx — это глобальные переменные.
Принцип их действия заключается в следующем:
- Используйте функцию Set , чтобы задать значение глобальной переменной. Set( MyVar, 1 ) задает для глобальной переменной MyVar значение 1.
- Используйте глобальную переменную, ссылаясь на имя, используемое с функцией Set . В этом случае MyVar возвращает 1.
- В глобальных переменных может храниться любое значение, в том числе строки, числа, записи и таблицы.
Перестроим наш арифмометр, воспользовавшись глобальными переменными.
Добавьте элемент управления ввода текста с именем TextInput1 и две кнопки с именами Button1 и Button2.
Задайте для свойства Text элемента управления Button1 значение "Добавить", а для свойства Text элемента управления Button2 — значение "Очистить".
Чтобы нарастающий итог обновлялся, когда пользователь нажимает кнопку Добавить, задайте следующую формулу в качестве значения свойства OnSelect:
Set( RunningTotal, RunningTotal + TextInput1.Text)
Само существование этой формулы устанавливает RunningTotal в качестве глобальной переменной, которая содержит число из-за оператора +. Вы можете ссылаться на RunningTotal в любом месте приложения. Всякий раз, когда пользователь открывает это приложение, RunningTotal имеет начальное пустое значение,
Первый раз, когда пользователь выбирает кнопку Добавить и выполняется функция Set, для RunningTotal устанавливается значение RunningTotal + TextInput1.
Чтобы нарастающий итог становился равным 0, когда пользователь нажимает кнопку Очистить, задайте в качестве значения его свойства OnSelect следующую формулу:
Set( RunningTotal, 0 )
Добавьте элемент управления Label (Метка) и задайте для его свойства Text значение RunningTotal.
Эта формула автоматически пересчитывает и отображает пользователю значение RunningTotal по мере изменения на основе кнопок, которые пользователь выбирает.
Предварительный просмотр приложения и добавление компьютера, как описано ранее. Введите число в текстовое поле и нажмите кнопку Добавить несколько раз. Когда все готово, вернитесь к интерфейсу разработки с помощью клавиши ESC .
Чтобы показать значение нашей глобальной переменной, щелкните меню Файл и на панели слева выберите Переменные.
Выберите переменную, чтобы показать все случаи ее определения и использования.
Типы переменных
Power Fx имеет два типа переменных:
| Тип переменной | Область действия | Описание | Функции, которые устанавливают |
|---|---|---|---|
| Глобальные переменные | Приложение | Самые простые в использовании. Содержит число, текстовую строку, логическое значение, запись, таблицу и многое другое. Вы можете ссылаться на него в любом месте приложения. | Set |
| Коллекции | Приложение | Содержит таблицу, на которую можно ссылаться в любом месте приложения. Вы можете изменить содержимое таблицы, а не задать ее в целом. Его можно сохранить на локальном устройстве для последующего использования. |
Collect ClearCollect |
При использовании Power Apps вы увидите третий тип переменной:
| Тип переменной | Область действия | Описание | Функции, которые устанавливают |
|---|---|---|---|
| Переменные контекста | Экран | Отлично подходят для передачи значений на экран, похожи на параметры для процедур на других языках. Вы можете ссылаться на него только на одном экране. |
UpdateContext Navigate |
Создание и удаление переменных
Все переменные создаются неявно при отображении в функции Set, UpdateContext, Navigate, Collect или ClearCollect . Чтобы объявить переменную и его тип, просто включите ее в любую из этих функций в любом месте приложения. Ни одна из этих функций не создает переменные; они только заполняют переменные значениями. Вы никогда не объявляете переменные явно, как в другом инструменте программирования, и вся типизация неявна по использованию.
Например, у вас может быть элемент управления "Кнопка" с формулой OnSelect равной Set( X, 1 ). Эта формула устанавливает X как переменную с типом числа. Вы можете использовать X в формулах в виде числа, и эта переменная имеет пустое значение после открытия приложения, но до нажатия кнопки. Когда вы выбираете кнопку, вы задаете для X значение 1.
Если добавить другую кнопку и задать для свойства OnSelect значение Set( X, Hello) возникает ошибка, так как тип (текстовая строка) не соответствует типу в предыдущем наборе (число). Все неявные определения переменной должны иметь согласованный тип. Опять же, все это произошло, потому что вы упомянули X в формулах, а не потому, что ни один из этих формул на самом деле запущен.
Вы удаляете переменную, удаляя все функции Set, UpdateContext, Navigate, Collect или ClearCollect, которые неявно устанавливают переменную. Без этих функций переменная не существует. Кроме того, необходимо удалить все ссылки на переменную, так как они вызывают ошибку.
Время жизни и начальное значение переменной
Приложение содержит все переменные в памяти во время его выполнения. Когда приложение закрывается, хранящиеся в переменных значения утрачиваются.
Вы можете сохранить содержимое переменной в источник данных, используя функции Patch или Collect. Вы также можете сохранить значения в коллекциях на локальном устройстве, используя функцию SaveData.
Когда пользователь открывает приложение, все переменные имеют пустое начальное значение.
Чтение переменных
Используйте имя переменной для чтения его значения. Например, вы можете определить переменную с помощью этой формулы:
Set( Radius, 12 )
Затем вы можете просто использовать Radius в любом месте, где можно использовать число, и он заменяет 12:
Pi() * Power( Radius, 2 )
Если вы присвоите контекстной переменной то же имя, что и глобальной переменной или коллекции, она будет иметь приоритет. Однако вы по-прежнему можете ссылаться на глобальную переменную или коллекцию, если используете оператор устранения неоднозначности[@Radius].
Использование переменной контекста (только Power Apps)
Ниже показано, как создать добавляемый компьютер с помощью контекстной переменной вместо глобальной переменной.
Принцип действия контекстных переменных заключается в следующем:
- Вы неявно определяете и задаете переменные контекста с помощью функции UpdateContext или Navigate. Когда приложение запускается, все переменные контекста имеют пустое начальное значение.
- Для обновления переменных контекста используются записи. В других средствах программирования для присвоения значений обычно используется оператор "=", например "x = 1". Для переменных контекста вместо этого используется { x: 1 }. Когда вы используете переменную контекста, используйте ее имя напрямую без синтаксиса записи.
- Переменную контекста можно также задать при использовании функции Navigate для отображения экрана. Если представить, что экран — это своего рода процедура или подпрограмма, то такой подход напоминает передачу параметров в других средствах программирования.
- За исключением функции Navigate, переменные контекста ограничены контекстом одного экрана (того, на котором им было присвоено их имя). Их нельзя использовать или задать вне данного контекста.
- В переменных контекста может храниться любое значение, в том числе строки, числа, записи и таблицы.
Перестроим наш арифмометр, воспользовавшись переменными контекста:
Добавьте элемент управления ввода текста с именем TextInput1 и две кнопки с именами Button1 и Button2.
Задайте для свойства Text элемента управления Button1 значение "Добавить", а для свойства Text элемента управления Button2 — значение "Очистить".
Чтобы нарастающий итог обновлялся, когда пользователь нажимает кнопку Добавить, задайте следующую формулу в качестве значения свойства OnSelect:
UpdateContext( { RunningTotal: RunningTotal + TextInput1.Text } )
Само существование этой формулы устанавливает RunningTotal в качестве переменной контекста, которая содержит число из-за оператора +. Вы можете ссылаться на RunningTotal в любом месте этого экрана. Всякий раз, когда пользователь открывает это приложение, RunningTotal имеет начальное пустое значение,
Первый раз, когда пользователь выбирает кнопку Добавить и выполняется функция UpdateContext, для RunningTotal устанавливается значение RunningTotal + TextInput1.
Чтобы нарастающий итог становился равным 0, когда пользователь нажимает кнопку Очистить, задайте в качестве значения его свойства OnSelect следующую формулу:
UpdateContext( { RunningTotal: 0 } )
Опять же, UpdateContext is used with the formula UpdateContext( { RunningTotal: 0 } ).
Добавьте элемент управления Label (Метка) и задайте для его свойства Text значение RunningTotal.
Эта формула автоматически пересчитывает и отображает пользователю значение RunningTotal по мере изменения на основе кнопок, которые пользователь выбирает.
Предварительный просмотр приложения и добавление компьютера, как описано ранее. Введите число в текстовое поле и нажмите кнопку Добавить несколько раз. Когда все готово, вернитесь к интерфейсу разработки с помощью клавиши ESC .
Вы можете задать значение переменной контекста, перейдя на экран. Этот метод полезен для передачи контекста или параметров с одного экрана на другой. Чтобы продемонстрировать этот прием, вставьте экран, вставьте кнопку и установите для ее свойства OnSelect следующую формулу:
Navigate( Screen1, None, { RunningTotal: -1000 } )
Удерживайте клавишу ALT при нажатии этой кнопки, чтобы отобразить экран1 и задать для переменной контекста RunningTotal значение -1000.
Чтобы показать значение переменной контекста, щелкните меню Файл, затем на панели слева выберите Переменные.
Выберите переменную контекста, чтобы узнать, где она определена и используется.
Использование коллекции
Наконец, давайте попробуем создать наш арифмометр с помощью коллекции. Так как коллекция содержит таблицу, которую можно легко изменить, это добавление компьютера сохраняет "бумажную ленту" каждого значения при вводе.
Принцип действия коллекций описан ниже.
- Используйте функцию ClearCollect для создания и задания коллекций. Вместо этого можно использовать функцию Collect , но она фактически требует другой переменной вместо замены старой.
- Коллекция — это тип источника данных, который можно представить как таблицу. Чтобы получить доступ к отдельному значению в коллекции, воспользуйтесь функцией First и извлеките одно поле из результирующей записи. Если вы используете одно значение с ClearCollect, это поле "Значение ", как показано в следующем примере:
First(VariableName).Value
Создадим арифмометр, воспользовавшись коллекцией.
Добавьте элемент управления Ввод текста с именем TextInput1 и две кнопки с именами Button1 и Button2.
Задайте для свойства Text элемента управления Button1 значение "Добавить", а для свойства Text элемента управления Button2 — значение "Очистить".
Чтобы нарастающий итог обновлялся, когда пользователь нажимает кнопку Добавить, задайте следующую формулу в качестве значения свойства OnSelect:
Collect( PaperTape, TextInput1.Text )
Само существование этой формулы устанавливает PaperTape как коллекцию, которая содержит таблицу с одним столбцом текстовых строк. Вы можете ссылаться на PaperTape в любом месте этого приложения. Всякий раз, когда пользователь открывает это приложение, PaperTape является пустой таблицей.
Когда эта формула выполняется, она добавляет новое значение в конец коллекции. Так как вы добавляете одно значение, сбор автоматически помещает его в таблицу с одним столбцом, а имя столбца — Значение, которое вы используете позже.
Чтобы очищать "бумажную ленту", когда пользователь нажимает кнопку Очистить, задайте в качестве значения свойства OnSelect следующую формулу:
Clear( PaperTape )
Для отображения нарастающего итога добавьте метку и задайте для нее в качестве значения свойства Text следующую формулу:
Sum( PaperTape, Value )
Чтобы запустить арифмометр, нажмите F5, чтобы перейти в режим предварительного просмотра, введите число в текстовом поле и нажмите кнопки.
Чтобы вернуться в рабочую область по умолчанию, нажмите клавишу ESC .
Чтобы отобразить "бумажную ленту", вставьте элемент управления Таблица данных и задайте его свойству Items следующую формулу:
PaperTape
На правой панели выберите Редактировать поля, а затем выберите Добавить поле, выберите столбец Значение, а затем выберите Добавить, чтобы показать.
Чтобы просмотреть значения в коллекции, выберите в меню Файл пункт Коллекции.
Чтобы сохранить и извлечь коллекцию, добавьте две дополнительные кнопки и задайте для их свойств Text значения Загрузить и Сохранить. Задайте для свойства OnSelect кнопки Загрузить такую формулу:
Clear( PaperTape ); LoadData( PaperTape, "StoredPaperTape", true )
Сначала нужно очистить коллекцию, так как функция LoadData добавит хранящиеся значения в конец коллекции.
Установите для свойства OnSelect кнопки Сохранить следующую формулу:
SaveData( PaperTape, "StoredPaperTape" )
Повторное просмотр, нажав клавишу F5 , введите цифры в элементе управления вводом текста и нажмите кнопки. Выберите кнопку Сохранить. Закройте и перезапустите приложение, затем нажмите кнопку Загрузить, чтобы повторно загрузить коллекцию.