Змінні
Нотатка
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 може копіювати та вставляти клітинки, але тільки вручну. Зробити це за допомогою формул неможливо.
Power Fx
Логіка, якою ви керуєтесь у Power Fx, дуже схожа на Excel. Замість того щоб оновлювати клітинки, можна додавати елементи керування будь-де на екрані та присвоювати їм імена, щоб потім використовувати їх у формулах.
Наприклад, у Power Apps можна дублювати поведінку Excel у програмі, додавши елемент керування Label з іменем Label1 і два елементи керування Text input з іменем TextInput1 і TextInput2. Якщо ви потім встановите властивість Text для Label1 на 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 можна задати значення Filter( SharePointList ), щоб автоматично відобразити новий фільтрований набір записів.
Переваги
Використання формул для створення програм має багато переваг.
- Якщо ви вмієте працювати з 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 значення «Add», а для властивості Text елемента Button2 – значення «Clear».
Щоб проміжний підсумок оновлювався щоразу, коли користувач натискає кнопку Додати, установіть як значення властивості OnSelect таку формулу:
Set( RunningTotal, RunningTotal + TextInput1.Text )
Сама наявність цієї формули задає RunningTotal як глобальну змінну, яка (завдяки оператору +) містить число. На RunningTotal можна посилатися будь-де в програмі. Коли користувач тільки-но відкриває цю програму, змінна RunningTotal має вихідне значення blank.
Коли він уперше натисне кнопку Додати й запуститься функція Set, змінній RunningTotal буде присвоєно значення RunningTotal + TextInput1.
Щоб проміжний підсумок набував значення 0 щоразу, коли користувач натискає кнопку Очистити, установіть як значення властивості OnSelect таку формулу:
Set( RunningTotal, 0 )
Додайте елемент керування Текстовий підпис і присвойте його властивості Text значення RunningTotal.
Ця формула переобчислюватиметься автоматично. Значення RunningTotal, що відображатиметься для користувача, змінюватиметься залежно від того, які кнопки він натискає.
Перегляньте, як працює програма. Ми отримали арифмометр, описаний вище. Введіть число в текстове поле та натисніть кнопку Додати кілька разів. Зробивши це, поверніться до функціоналу розробки за допомогою клавіші Esc.
Щоб переглянути значення глобальної змінної, перейдіть у меню Файл і в області ліворуч виберіть Змінні.
Щоб переглянути всі розташування, де визначено та використано змінну, виберіть її.
Типи змінних
У Power Fx є два типи змінних.
Тип змінних | Scope | Опис | Функції, що їх задають |
---|---|---|---|
Глобальні змінні | Програма | Найпростіші у використанні. Містять число, текстовий рядок, логічне значення, запис, таблицю тощо. Посилатися на них можна з будь-якої частини програми. | Встановити |
Колекції | Програма | Містять таблицю, на яку можна посилатися з будь-якої частини програми. Дають змогу змінювати вміст таблиці, а не задають її як єдине ціле. Їх можна зберегти на локальному пристрої для подальшого використання. | Збирати Технологія ClearCollect |
У разі використання в Power Apps існує третій тип змінної:
Тип змінних | Scope | Опис | Функції, що їх задають |
---|---|---|---|
Змінні контексту | Екран | Чудово підходять для передавання значень на екран, подібно до параметрів, що передаються до процедури в інших мовах. На них можна посилатися лише на одному екрані. | UpdateContext Переміщатися |
Створення та вилучення змінних
Усі змінні, зазначені у функціях Set, UpdateContext, Navigate, Collect або ClearCollect, створюються неявно. Щоб оголосити змінну та її тип, досить просто включити її в будь-яку з цих функцій будь-де в програмі. Жодна з цих функцій не створює змінні. Вони лише заповнюють змінні значеннями. Вам ніколи не доведеться явно оголошувати змінні, як в іншому засобі програмування. Усі введені елементи оголошуються неявно.
Наприклад, можна задати елемент керування «кнопка», використавши для OnSelect формулу Set( X, 1 ). Ця формула задає X як змінну числового типу. X можна використовувати у формулах як число. Коли ви відкриєте програму, ця змінна матиме значення blank, доки ви не натиснете кнопку. Якщо натиснути кнопку, змінній X присвоюється значення 1.
Якщо додати іншу кнопку й установити для її властивості OnSelect значення Set( X, «Привіт» ), станеться помилка, оскільки тип (текстовий рядок) не відповідає типу в попередній функції Set, де він числовий. Усі неявні визначення змінної слід узгоджувати за типом. Ще раз підкреслимо, що все це трапилося тому, що X згадано у формулах, а не через те, що якусь із них фактично виконано.
Щоб видалити змінну, видаліть усі функції Set, UpdateContext, Navigate, Collect і ClearCollect, які неявно її задають. Без них змінна не існує. Крім того, необхідно видалити будь-які посилання на змінну, оскільки вони спричинятимуть помилку.
Час життя змінної та початкове значення
Коли програма виконується, усі змінні зберігаються в пам’яті. Якщо закрити програму, усі значення, які зберігаються в змінних, буде втрачено.
За допомогою функцій Patch або Collect вміст змінної можна зберегти в джерело даних. Крім того, за допомогою функції SaveData можна зберігати значення в колекціях на локальному пристрої.
Коли користувач відкриває програму, усі змінні мають вихідне значення blank.
Зчитування значень змінних
Щоб зчитати значення змінної, слід скористатися її ім’ям. Наприклад, змінну можна визначити за допомогою цієї формули:
Set( Radius, 12 )
Потім змінну Radius можна використовувати скрізь, де потрібно вказати це число. Її просто буде замінено на 12.
Pi() * Power( Radius, 2 )
Якщо змінна контексту має таке саме ім’я, як і глобальна змінна або колекція, змінна контексту має пріоритет. Проте за допомогою оператора усунення неоднозначності [@Radius] можна послатися саме на глобальну змінну або колекцію.
Використовувати змінну контексту (тільки Power Apps)
Давайте подивимося, як створити арифмометр, використовуючи замість глобальної змінної змінну контексту.
Нижче описано принципи дії змінних контексту.
- Неявно задати та встановити змінні контексту можна за допомогою функції UpdateContext або Navigate. Коли запускається програма, усі змінні контексту мають вихідне значення blank.
- Змінні контексту можна оновити за допомогою записів. В інших засобах програмування для присвоювання зазвичай використовується оператор «=», як-от «x = 1». Для змінних контексту скористайтеся натомість синтаксисом { x: 1 }. Якщо ви використовуєте змінну контексту, указуйте її ім’я безпосередньо (без синтаксису запису).
- Змінну контексту можна також задати, якщо екран відображається за допомогою функції Navigate. Якщо уявити що екран – це своєрідна процедура або підпрограма, такий підхід нагадуватиме передавання параметра в інших засобах програмування.
- За винятком функції Navigate, область дії контекстних змінних обмежується контекстом одного екрана, у якому вони отримали своє ім’я. Їх не можна використовувати або встановлювати за межами цього контексту.
- Змінні контексту можуть містити будь-яке значення: рядки, числа, записи, таблиці тощо.
Перебудуймо наш арифмометр так, щоб у ньому використовувалася змінна контексту.
Додайте елемент керування введенням тексту з ім’ям TextInput1 і дві кнопки з іменами Button1 і Button2.
Задайте для властивості Text елемента Button1 значення «Add», а для властивості Text елемента Button2 – значення «Clear».
Щоб проміжний підсумок оновлювався щоразу, коли користувач натискає кнопку Додати, установіть як значення властивості OnSelect таку формулу:
UpdateContext( { RunningTotal: RunningTotal + TextInput1.Text } )
Сама наявність цієї формули задає RunningTotal як змінну контексту, яка (завдяки оператору +) містить число. На RunningTotal можна посилатися будь-де на цьому екрані. Коли користувач тільки-но відкриває цю програму, змінна RunningTotal має вихідне значення blank.
Коли він уперше натисне кнопку Додати й запуститься функція UpdateContext, змінній RunningTotal буде присвоєно значення RunningTotal + TextInput1.
Щоб проміжний підсумок набував значення 0 щоразу, коли користувач натискає кнопку Очистити, установіть як значення властивості OnSelect таку формулу:
UpdateContext( { RunningTotal: 0 } )
Знову UpdateContext використовується з формулою UpdateContext( { RunningTotal: 0 } ).
Додайте елемент керування Текстовий підпис і присвойте його властивості Text значення RunningTotal.
Ця формула переобчислюватиметься автоматично. Значення RunningTotal, що відображатиметься для користувача, змінюватиметься залежно від того, які кнопки він натискає.
Перегляньте, як працює програма. Ми отримали арифмометр, описаний вище. Введіть число в текстове поле та натисніть кнопку Додати кілька разів. Зробивши це, поверніться до функціоналу розробки за допомогою клавіші Esc.
Значення змінної контексту можна задати, переходячи на екран. Це зручно, якщо потрібно передати «контекст» або «параметри» з одного екрана на інший. Щоб побачити цю методику в дії, вставте екран, вставте кнопку та задайте як значення її властивості OnSelect таку формулу:
Навігація( Екран1, Немає, { БігВсього: -1000 } )
Натисніть і втримуйте клавішу Alt, натискаючи цю кнопку, щоб відобразити екран Screen1 і задати для змінної контексту RunningTotal значення –1000.
Щоб показати значення змінної контексту, перейдіть у меню Файл, а потім в області ліворуч виберіть Змінні.
Щоб переглянути, де визначено та використано змінну контексту, виберіть її.
Використання колекції
Нарешті, давайте розглянемо, як можна створити арифмометр із використанням колекції. Оскільки колекція містить таблицю, яку можна легко змінити, ми створимо арифмометр, що «записує на перфострічку» кожне введене значення.
Принципи роботи колекції описано нижче.
- Щоб створити та задати колекцію, скористаймося функцією ClearCollect. Замість неї можна використати функцію Collect, але в такому разі потрібно не заміняти стару змінну, а використати іншу.
- Колекція – це різновид джерела даних, і, відповідно, вона являє собою таблицю. Щоб отримати доступ до одного значення в колекції, скористайтеся функцією First і видобудьте одне поле з отриманого запису. Якщо з функцією ClearCollect використовується одне значення, ним буде поле Value, як у цьому прикладі:
First(Ім’я змінної). Цінність
Створімо арифмометр знову, використовуючи для цього колекцію.
Додайте елемент керування введенням тексту з ім’ям TextInput1 і дві кнопки з іменами Button1 і Button2.
Задайте для властивості Text елемента Button1 значення «Add», а для властивості Text елемента Button2 – значення «Clear».
Щоб проміжний підсумок оновлювався щоразу, коли користувач натискає кнопку Додати, установіть як значення властивості OnSelect таку формулу:
Collect( PaperTape, TextInput1.Text )
Сама наявність цієї формули задає PaperTape як колекцію, яка містить таблицю текстових рядків з одним стовпцем. На PaperTape можна посилатися будь-де в цій програмі. Щоразу, коли користувач відкриватиме цю програму, значенням PaperTape буде пуста таблиця.
Коли цю формулу буде запущено, вона додасть нове значення в кінець колекції. Оскільки ми додаємо одне значення, Collect автоматично розташовує його в таблиці з одним стовпцем, що має ім’я Value. Його буде використано згодом.
Щоб перфострічка очищувалася, коли користувач натискає кнопку Очистити, установіть як значення властивості OnSelect таку формулу:
Прозорий ( PaperTape )
Щоб відобразити проміжний підсумок, додайте підпис і задайте як значення його властивості Text таку формулу:
Сума ( PaperTape, Value )
Щоб запустити арифмометр, перейдіть у режим попереднього перегляду натисканням клавіші F5, введіть числа в елемент керування введенням тексту та натисніть кнопки.
Щоб повернутися до стандартної робочої області, натисніть клавішу Esc.
Щоб відобразити перфострічку, вставте елемент керування Таблиця даних і задайте як значення його властивості Items таку формулу:
Стрічка для паперу
В області праворуч виберіть Редагувати поля, а тоді виберіть Додати поле, виберіть стовпець Значення, і виберіть Додати, щоб показати його.
Щоб переглянути значення в колекції, у меню Файл виберіть Колекції.
Щоб зберегти та отримати колекцію, додайте два додаткові елементи керування «кнопка» та задайте для їхньої властивості Text значення Завантажити та Зберегти. Як значення властивості OnSelect кнопки Завантажити задайте таку формулу:
Прозорий ( PaperTape ); LoadData( PaperTape, "StoredPaperTape", true )
Спочатку колекцію потрібно очистити, оскільки функція LoadData додаватиме збережені значення в її кінець.
Як значення властивості OnSelect кнопки Зберегти задайте таку формулу:
SaveData( PaperTape, "StoredPaperTape" )
Знову перегляньте, як працює програма. Для цього натисніть клавішу F5, введіть числа в елемент керування введенням тексту та натисніть кнопки. Натисніть кнопку Зберегти. Закрийте та перезавантажте програму й натисніть кнопку Завантажити, щоб перезавантажити колекцію.