Операторы и идентификаторы

Заметка

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

Операторы в Microsoft Power Fx описаны ниже. Некоторые из этих операторов зависят от языка, используемого на компьютере автора. Дополнительные сведения см. в статье Глобальные приложения.

Символ Тип Синтаксис Описание
. Выбор свойства Slider1.Значение
Color.Red
Извлекает свойство из таблицы, элемента управления или перечисления. Для обратной совместимости, ! может использоваться.
.
зависит от языка
Десятичный разделитель 1.23 Разделитель между целой и дробной частью числа. Символ зависит от языка.
( ) Круглые скобки Фильтр(Т, А < 10)

(1 + 2) * 3
Принудительно применяет порядок приоритета и группирует подвыражения в большом выражении
+ Арифметические операторы 1 + 2 Сложение
-   2 - 1 Вычитание и знак
*   2 * 3 Умножение
/   2 / 3 Деление (см. также сведения о функции Mod)
^   2 ^ 3 Возведение в степень (эквивалентно функции Power)
%   20% Процент (эквивалентно "* 1/100")
= Операторы сравнения Цена = 100 Равно
>   Цена > 100 Больше
>=   Цена >= 100 Больше или равно
<   Цена < 100 Меньше
<=   Цена <= 100 Меньше или равно
<>   Цена <> 100 Не равно
& Оператор объединения строк "привет" & "" & "мир" Непрерывно отображает несколько строк.
&& или И Логические операторы Цена < 100 && Slider1.Значение = 20
или Price < 100 And Slider1.Value = 20
Логическая конъюнкция (эквивалентна функции And).
|| или Или   Цена < 100 || Slider1.Значение = 20 или Цена < 100 Или Slider1.Значение = 20 Логическое сложение, эквивалентное функции Or
! или Not   !(Цена < 100) или Нет (Цена < 100) Логическое отрицание (эквивалентно функции Not).
точный Операторы членства Галерея1.Выбранные точные в СохраненныхЭлементах Принадлежит коллекции или таблице.
точный   "Windows" exactin "Для отображения окон в операционной системе Windows..." Тестирование подстроки (с учетом регистра).
в   Галерея1.Выбрано в SavedItems Принадлежит коллекции или таблице.
в   «The» в «Клавиатура и монитор...» Тестирование подстроки (без учета регистра).
@ Оператор разрешения неоднозначности МояТаблица[@имя_поля] Устранение неоднозначности для поля.
@   [@MyVariable] Глобальное устранение неоднозначности.
,
[зависит от языка]
Разделитель элементов списка Если(X < 10, "Низкий", "Хороший")
{ X: 12, Y: 32 }
[ 1, 2, 3 ]
Разделяет: Этот символ зависит от языка.
;
[зависит от языка]
Объединение формул в цепочку Собрать(T, A); Навигация(S1, "") Отдельные вызовы функций в свойствах поведения. Оператор построения цепочки зависит от языка.
Как Как оператор ВсеКлиенты Как Клиенты Переопределяет ThisItem и ThisRecord в функциях коллекций и области записи. Как полезно для предоставления лучшего, конкретного имени и особенно важно во вложенных сценариях.
Себя Самостоятельный оператор Самостоятельное заполнение Доступ к свойствам текущего элемента управления
родительский элемент родительский элемент оператор Родитель.Заполнить Доступ к свойствам контейнера элемента управления.
ЭтотЭлемент Оператор ThisItem ThisItem.FirstName Доступ к полям коллекции или элемента управления формы
Эта запись Оператор ThisItem ЭтаЗапись.Имя Доступ ко всей записи и отдельным полям записи в ForAll, Sum, With и других функциях области записи. Может быть переопределено с помощью оператора As.

Операторы in и exactin

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

  1. Создайте или импортируйте коллекцию с именем Inventory, затем покажите ее в коллекции, как это описано в первой процедуре раздела Отображение изображений и текстов в коллекции.

  2. Задайте для свойства Items коллекции следующую формулу:
    Фильтр(Инвентарь, "E" в ProductName)

    В коллекции отображаются все товары, за исключением Callisto, так как имя этого товара является единственным, которое не содержит указанную букву.

  3. Задайте для свойства Items коллекции следующую формулу:
    Фильтр (Инвентарь, "E" exactin ProductName)

    В коллекции отображается только имя Europa, так как оно единственное, которое содержит указанную букву в указанном регистре.

Операторы ThisItem, ThisRecord и As

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

Оператор Относится к Описание
ЭтотЭлемент Галерея контроль
Редактировать форму контроль
Форма отображения контроль
Имя по умолчанию для текущей записи в элементу управления Gallery или форме.
Эта запись Для всех, Фильтр, С, Сумма и другие область действия записи функции Имя по умолчанию для текущей записи в ForAll и других функциях области записи.
Как имя Галерея контроль
ForAll, Filter, With, Sum и другие функции области записи
Определяет имя для текущей записи, заменяя ThisItem или ThisRecord по умолчанию. Используйте As, чтобы облегчить понимание формул и устранить неоднозначность при вложении.

Оператор ThisItem

Например, в следующем элементе управления Gallery свойство Items установлено на источник данных Employees (например, сущность Employees, включенная в пример Northwind Traders):

Employees

Сотрудники, отображаемые в коллекции.

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

ThisItem.Picture

Формула для изображения сотрудника.

Аналогично, формула для имени также использует ThisItem:

ThisItem.'First Name' & " " & ThisItem.'Last Name'

Формула для имени и фамилии сотрудника.

Оператор ThisRecord

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

Filter( Employees, StartsWith( ThisRecord.Employee.'First Name', "M" ) )

Фильтрация сотрудников по имени с использованием ThisRecord.

ThisRecord является необязательным и подразумевается при непосредственном использовании полей, например, в этом случае мы могли бы написать:

Filter( Employees, StartsWith( 'First Name', "M" ) )

Хотя необязательно, использование ThisRecord может упростить понимание формул и может потребоваться в неоднозначных ситуациях, когда имя поля также может быть именем отношения. ThisRecord является необязательным, тогда как ThisItem всегда требуется.

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

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees, 
              Patch( Employees, ThisRecord, { Status: 'Status (Employees)'.Active } ) ) )

Оператор As

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

Например, вы можете изменить свойство Items нашей коллекции для использования As, чтобы определить, что мы работаем с сотрудником:

Employees As Employee

Коллекция сотрудников, использующая оператор As.

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

Employee.Picture

Изображение сотрудника, использующее имя сотрудника, заданное оператором As.

Employee.'First Name' & " " & Employee.'Last Name'

Имя и фамилия сотрудника, использующее имя сотрудника, заданное оператором As.

As также может использоваться с функциями области действия записи для замены имени по умолчанию ThisRecord. Мы можем применить это к нашему предыдущему примеру, чтобы прояснить запись, с которой мы работаем:

With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
      ForAll( InactiveEmployees As Employee, 
              Patch( Employees, Employee, { Status: 'Status (Employees)'.Active } ) ) )

При вложении коллекций и функций области записи, ThisItem и ThisRecord всегда относится к внутренней области, оставляя записи во внешних областях недоступными. Используйте As, чтобы сделать доступными все области записи, дав каждой уникальное имя.

Например, эта формула создает узор шахматной доски в виде текстовой строки путем вложения двух функций ForAll:

Concat( 
    ForAll( Sequence(8) As Rank,
        Concat( 
            ForAll( Sequence(8) As File, 
                    If( Mod(Rank.Value + File.Value, 2) = 1, " X ", " . " ) 
            ),
            Value 
        ) & Char(10) 
    ), 
    Value 
)

При задании в элементе управления Label для свойства Text следующей формулы отображается:

Текстовая шахматная доска, отображаемая в элементе управления подписи.

Давайте разберем, что здесь происходит:

  • Мы начинаем с перебора безымянной таблицы из 8 пронумерованных записей из функции Sequence. Этот цикл предназначен для каждой строки доски, который обычно называют Rank, поэтому мы даем ему это имя.
  • Для каждой строки мы перебираем другую безымянную таблицу из 8 столбцов и даем общее имя File.
  • Если Rank.Value + File.Value нечетное число, квадрат получает X, иначе точку. Эта часть формулы упоминается в обоих циклах ForAll, что стало возможным благодаря использованию оператора As.
  • Concat используется дважды, сначала для объединения столбцов, а затем строк, с добавлением Char(10) для создания новой строки.

Аналогичный пример возможен с вложенными элементами управления Gallery вместо функций ForAll. Начнем с вертикальной коллекции для Rank. Этот элемент управления коллекции будет иметь для Items формулу:

Sequence(8) as Rank

Иллюстрация внешней коллекции, которая обеспечивает итерацию Rank.

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

Sequence(8) as File

Иллюстрация внутренней коллекции, которая обеспечивает итерацию File.

И, наконец, в этой коллекции мы добавим элемент управления Label, который будет воспроизведен для каждого элемента File и для каждого элемента Rank. Мы изменим его размер, чтобы заполнить все пространство, и используем свойство Fill, чтобы задать цвет по этой формуле:

If( Mod( Rank.Value + File.Value, 2 ) = 1, Green, Beige )

Элемент управления

Операторы Self и Parent

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

Способ Описание
По имени элемента управления На элемент управления можно ссылаться по имени из любого места в приложении.

Например, Label1.Fill относится к свойству fill элемента управления, имя которого Label1.
Самостоятельный оператор Часто удобно ссылаться на другое свойство того же элемента управления при написании формулы. Вместо того, чтобы использовать абсолютную ссылку по имени, проще и более переносимо использовать относительную ссылку на один Self. Оператор Self обеспечивает удобный доступ к текущему элементу управления.

Например, Self.Fill относится к цвету заливки текущего элемента управления.
родительский элемент оператор Некоторые элементы управления содержат другие элементы управления, такие как Screen и Gallery. Элемент управления, в котором размещаются другие элементы управления, называется родительским. Как оператор Self, оператор Parent обеспечивает простую относительную ссылку на элемент управления контейнера.

Например, Parent.Fill ссылается на свойство fill элемента управления, являющегося контейнером для текущего элемента управления.

Self и родительский элемент являются операторами, а не свойствами самих элементов управления. Ссылка на Parent.Parent, Self.Parent или Parent.Self не поддерживается.

Имена идентификаторов

Имена переменных, источников данных, столбцов и других объектов могут содержать любые символы Юникода.

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

Вот несколько примеров имен столбцов, которые вы можете встретить в таблице, и их представление в формуле:

Имя столбца в базе данных Ссылка на столбец в формуле
SimpleName SimpleName
NameWith123Numbers NameWith123Numbers
Name with spaces (Имя с пробелами) 'Name with spaces'
Name with "double" quotes (Имя с "двойными" кавычками) 'Name with "double" quotes'
Name with 'single' quotes (Имя с "одинарными" кавычками) 'Name with ''single'' quotes'
Name with an @ at sign (Имя со знаком @) 'Name with an @ at sign'

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

Отображаемые имена и логические имена

Некоторые источники данных, такие как SharePoint и Microsoft Dataverse, имеют два разных имени для ссылки на одну и ту же таблицу или столбец данных:

  • Логическое имя - имя, которое гарантированно уникально, не изменяется после создания, обычно не допускает пробелов или других специальных символов и не локализуется на другие языки. В результате имя может быть загадочным. Эти имена используются профессиональными разработчиками. Например, cra3a_customfield. Это имя также может упоминаться как имя схемы или просто имя.

  • отображаемое имя - Имя, удобное для пользователя и предназначенное для просмотра конечными пользователями. Это имя может быть не уникальным, может меняться с течением времени, может содержать пробелы и любые символы Юникода и может быть локализовано на разные языки. В соответствии с примером выше, отображаемое имя может быть Настраиваемое поле с пробелом между словами.

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

Например, представьте, что вы добавили Пользовательское поле к сущности в Dataverse. Система присваивает вам логическое имя, которое вы можете изменять только при создании поля. Результат будет выглядеть примерно так:

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

При создании ссылки на поле сущности Accounts (Организации) будет предложено использовать 'Custom Field', так как это отображаемое имя. Необходимо использовать одинарные кавычки, потому что в этом имени есть пробел:

Панель формул Studio, отображающая предложения для имен полей Accounts с выделенным отображаемым именем 'Custom Field'.

После выбора предложения в строке формул отображается 'Custom Field' (Пользовательское поле), и данные извлекаются:

Панель формул Studio, показывающая использование отображаемого имени 'Custom Field' для поля.

Хотя это и не предлагается, мы также можем использовать логическое имя для этого поля. Это приведет к получению тех же данных. Одиночные кавычки не требуются, так как это имя не содержит пробелов и специальных символов:

Панель формул Studio, показывающая использование логического имени cr5e3_customfield для поля.

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

Заметка

Логические имена не переводятся при перемещении приложения между средами. Для имен системных сущностей и полей Dataverse это не должно быть проблемой, так как логические имена согласованы в разных средах. Но любые пользовательские поля, такие как cra3a_customfield в приведенном выше примере, могут иметь другой префикс среды (cra3a в этом случае). Отображаемые имена являются предпочтительными, поскольку они могут сопоставляться с отображаемыми именами в новой среде.

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

Поскольку отображаемые имена не являются уникальными, одно и то же отображаемое имя может появляться более одного раза в одной и той же сущности. Когда это происходит, логическое имя будет добавлено в конец отображаемого имени в скобках для одного или нескольких конфликтующих имен. Основываясь на приведенном выше примере, если было второе поле с тем же отображаемым именем Custom Field (Пользовательское поле) с логическим именем cra3a_customfieldalt, тогда предложения покажут:

Панель формул Studio, показывающая использование логического имени cr5e3_customfieldalt для устранения неоднозначности двух версий

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

Оператор устранения неоднозначности

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

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

Дополнительные сведения и примеры см. в разделе Области записей.