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


Переменные

Заметка

Microsoft Power Fx — это новое название языка формул приложений на основе холста. Эти статьи находятся в стадии разработки, поскольку мы извлекаем язык из приложений на основе холста, интегрируем его с другими продуктами Microsoft Power Platform и делаем его доступным как открытый исходный код. Начнем с Обзор Microsoft Power Fx для введения в язык.

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

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

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

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

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

Excel

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

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

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

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

Power Fx

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

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

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

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

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

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

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

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

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

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

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

Льготы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Set( RunningTotal, RunningTotal + TextInput1.Text)

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

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

    Для свойства OnSelect кнопки

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

    Set( RunningTotal, 0 )

    Для свойства OnSelect кнопки

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

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

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

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

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

  7. Чтобы показать значение нашей глобальной переменной, щелкните меню Файл и на панели слева выберите Переменные.

    Параметр

  8. Выберите переменную, чтобы показать все случаи ее определения и использования.

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

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

Power Fx имеет два типа переменных:

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

При использовании в Power Apps существует третий тип переменных:

Тип переменных Scope Описание Функции, которые устанавливают
Переменные контекста Экран Отлично подходят для передачи значений на экран, похожи на параметры для процедур на других языках. На них можно ссылаться только с одного экрана. ОбновлениеКонтекста
Навигация

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

Все переменные создаются неявно, когда они появляются в функции 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].

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

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

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

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

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

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

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

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

    UpdateContext( { RunningTotal: RunningTotal + TextInput1.Text } )

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

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

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

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

    UpdateContext( { RunningTotal: 0 } )

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

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

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

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

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

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

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

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

    Навигация( Экран1, Нет, { Итого: -1000 } )

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

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

    Screen1 открыт.

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

    Параметр

  9. Выберите переменную контекста, чтобы показать все случаи ее определения и использования.

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

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

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

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

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

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

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

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

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

    Собрать(PaperTape, TextInput1.Text)

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

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

    Свойство OnSelect

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

    Прозрачный (бумажная лента)

    Свойство OnSelect

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

    Сумма(PaperTape, Значение)

    Метка свойства текста.

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

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

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

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

    PaperTape

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

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

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

    Предварительный просмотр коллекции PaperTape.

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

    Очистить(PaperTape); ЗагрузитьДанные(PaperTape, "StoredPaperTape", true)

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

    Свойство OnSelect

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

    Сохранить данные(PaperTape, "StoredPaperTape")

    Свойство OnSelect

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