Compartilhar via


Operadores e identificadores

Observação

O Microsoft Power Fx é o novo nome da linguagem de fórmula para aplicativos de tela. Estes artigos são um trabalho em andamento à medida que extraímos a linguagem de aplicativos de tela, a integramos a outros produtos do Microsoft Power Platform e a disponibilizamos como software livre. Comece com Visão geral do Microsoft Power Fx para obter uma introdução à linguagem.

Os operadores do Microsoft Power Fx são descritos abaixo. Alguns desses operadores dependem do idioma do autor. Consulte Aplicativos globais para obter mais informações.

Símbolo Tipo Sintaxe Descrição
. Seletor de Propriedade Controle deslizante1.Valor
Color.Red
Extrai uma propriedade de uma tabela, controle ou de enumeração. Para compatibilidade com versões anteriores, ! pode ser usado.
.
dependente da linguagem
Separador decimal 1.23 Separador entre número inteiro e frações de um número. O caractere depende do idioma.
( ) Parênteses Filtro(T, A < 10)

(1 + 2) * 3
Impõe a ordem de precedência e agrupa subexpressões em uma expressão maior
+ Operadores aritméticos 1 + 2 Adição
-   2 - 1 Subtração e sinal
*   2 * 3 Multiplicação
/   2 / 3 Divisão (consulte também a função Mod)
^   2 ^ 3 Exponenciação, equivalente à função Power
%   20% Porcentagem (equivalente a "*1/100")
= Operadores de comparação Preço = 100 Igual a
>   Preço > 100 Maior que
>=   Preço >= 100 Maior que ou igual a
<   Preço < 100 Menor que
<=   Preço <= 100 Menor que ou igual a
<>   Preço <> 100 Diferente de
& Operador de concatenação de cadeia de caracteres "olá" & " " & "mundo" Faz com que várias cadeias de caracteres pareçam contínuas
&& ou E Operadores lógicos Preço < 100 && Slider1.Valor = 20
ou Price < 100 And Slider1.Value = 20
Conjunção lógica equivalente à função And
|| ou Ou   Preço < 100 || Slider1.Value = 20 ou Preço < 100 Ou Slider1.Value = 20 Disjunção lógica, equivalente à função Or
! ou Not   !(Preço < 100) ou Não (Preço < 100) Negação lógica, equivalente à função Not
exato Operadores de associação Galeria1.Selecionado exatamente em SavedItems Pertencente a uma coleção ou a uma tabela
exato   "Windows" exato "Para exibir janelas no sistema operacional Windows..." Teste de subcadeia de caracteres (diferencia maiúsculas de minúsculas)
em   Galeria1.Selecionado em Itens salvos Pertencente a uma coleção ou a uma tabela
em   "O" em "O teclado e o monitor..." Teste de subcadeia de caracteres (não diferencia maiúsculas de minúsculas)
@ Desambiguação operador MinhaTabela[@nomedocampo] Desambiguidade de campo
@   [@MinhaVariável] Desambiguidade global
,
[dependente do idioma]
Separador de lista Se(X < 10, "Baixo", "Bom")
{ X: 12, Y: 32 }
[ 1, 2, 3 ]
Separa:
  • argumentos em chamadas de função
  • campos em um registro
  • registros em uma tabela
Este caractere depende do idioma.
;
[dependente do idioma]
Encadeamento de fórmula Coletar(T, A); Navegar(S1, "") Separa invocações de funções em propriedades de comportamento. O operador de encadeamento depende do idioma.
Como Como operador Todos os clientes como cliente Substitui ThisItem e ThisRecord em galerias e funções de escopo de registro. Como é útil para fornecer um nome melhor e específico e é especialmente importante em cenários aninhados.
Auto Eu mesmo operador Autopreenchimento Acessa as propriedades do controle atual
pai pai operador Pai.Preencher Acesso a propriedades de um contêiner Container
EsteItem EsteItem operador EsteItem.PrimeiroNome Acesso a campos de um controle Gallery ou Form
EsteRegistro EsteItem operador EsteRegistro.Nome Acesso ao registro completo e aos campos individuais do registro em ForAll, Sum, With e outras funções de escopo de registro. Pode ser substituído pelo operador As.

operadores in e exactin

Use os operadores in e exactin para localizar uma cadeia de caracteres em uma fonte de dados, como uma coleção ou uma tabela importada. O operador in identificará correspondências independentemente de letras maiúsculas e minúsculas e o operador exactin identificará correspondências somente se as letras maiúsculas e minúsculas forem usadas da mesma maneira. Veja um exemplo:

  1. Crie ou importe uma coleção chamada Inventory e mostre-a na galeria, conforme o primeiro procedimento em Mostrar imagens e texto em uma galeria descreve.

  2. Defina a propriedade Items da galeria, conforme esta fórmula:
    Filtro(Inventário, "E" em ProductName)

    A galeria mostra todos os produtos, exceto Calisto, porque o nome do produto é o único que não contém a letra especificada.

  3. Altere a propriedade Items da galeria, conforme esta fórmula:
    Filtro(Inventário, "E" exatoNomeDoProduto)

    A galeria mostra apenas Europa, porque apenas seu nome contém a letra especificada, no caso especificado.

Operadores ThisItem, ThisRecord e As

Alguns controles e funções aplicam fórmulas a registros individuais de uma tabela. Para se referir ao registro individual em uma fórmula, use uma das seguintes opções:

Operador Aplica-se a Descrição
EsteItem Galeria controlar
Editar formulário controlar
Formulário de exibição controlar
O nome padrão do registro atual em um Gallery ou controle de formulário.
EsteRegistro Para todos, Filtro, Com, Soma e outros escopo do registro funções O nome padrão do registro atual em ForAll e outras funções de escopo de registro.
Como nome Galeria controlar
ForAll, Filter, With, Sum e outras funções de escopo de registro
Define o nome do registro atual, substituindo o padrão ThisItem ou ThisRecord. Use As para tornar as fórmulas mais fáceis de entender e resolver a ambiguidade durante o aninhamento.

Operador ThisItem

Por exemplo, no controle Gallery a seguir, a propriedade Items é definida como a fonte de dados Funcionários (como a entidade Funcionários incluída no exemplo da Northwind Traders):

Employees

Funcionários mostrados em uma galeria.

O primeiro item da galeria é um modelo replicado para cada funcionário. No modelo, a fórmula da imagem usa ThisItem para se referir ao item atual:

ThisItem.Picture

Fórmula da foto de um funcionário.

Da mesma forma, a fórmula para o nome também usa ThisItem:

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

Fórmula do nome e sobrenome de um funcionário.

Operador ThisRecord

ThisRecord é usado em funções que têm um escopo de registro. Por exemplo, podemos usar a função Filter com a propriedade Items da nossa galeria para mostrar apenas os primeiros nomes que estão com M:

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

Filtragem dos funcionários com base no nome, usando ThisRecord.

ThisRecord é opcional e implícito ao usar os campos diretamente, por exemplo, neste caso, poderíamos ter escrito:

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

Embora opcional, o uso de ThisRecord pode tornar as fórmulas mais fáceis de entender e pode ser necessário em situações ambíguas em que um nome de campo também pode ser um nome de relacionamento. ThisRecord é opcional, enquanto ThisItem é sempre obrigatório.

Use ThisRecord para fazer referência a todo o registro com Patch, Collect e outras funções de escopo de registro. Por exemplo, a fórmula a seguir define o status de todos os funcionários inativos para ativo:

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

Operador As

Use o operador As para nomear um registro em uma galeria ou função de escopo de registro, substituindo o padrão ThisItem ou ThisRecord. Nomear o registro pode tornar suas fórmulas mais fáceis de entender e pode ser necessário em situações aninhadas para acessar registros em outros escopos.

Por exemplo, você pode modificar a propriedade Items da nossa galeria para usar As para identificar que estamos trabalhando com um funcionário:

Employees As Employee

Galeria de funcionários, usando o operador As.

As fórmulas da imagem e do nome são ajustadas para usar esse nome no registro atual:

Employee.Picture

Imagem de um funcionário usando o nome do funcionário definido com o operador As.

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

O nome e o sobrenome de um funcionário usando o nome do funcionário definido com o operador As.

As também podem ser usadas com funções de escopo de registro para substituir o nome padrão ThisRecord. Podemos aplicá-lo ao nosso exemplo anterior para esclarecer o registro com o qual estamos trabalhando:

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

Ao aninhar galerias e funções de escopo de registro, ThisItem e ThisRecord sempre se referem ao escopo mais interno, deixando registros em escopos externos indisponíveis. Use As para disponibilizar todos os escopos de registro, dando a cada um um nome exclusivo.

Por exemplo, esta fórmula produz um padrão de tabuleiro como uma cadeia de texto aninhando duas funções 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 
)

Definir uma propriedade Text do controle Label para esta fórmula exibe:

Texto do tabuleiro mostrado em um controle de rótulo.

Vamos entender o que está acontecendo aqui:

  • Começamos iterando uma tabela sem nome de 8 registros numerados da função Sequence. Esse loop é para cada linha do tabuleiro, comumente referido como Rank, razão pela qual recebe esse nome.
  • Para cada linha, iteramos outra tabela sem nome de 8 colunas e damos o nome comum File.
  • Se Rank.Value + File.Value for um número ímpar, o quadrado recebe um X; caso contrário, um ponto. Essa parte da fórmula faz referência a ambos os loops ForAll, possibilitados pelo uso do operador As.
  • Concat é usado duas vezes, primeiro para montar as colunas e depois as linhas, com um Char(10) incluído para criar uma nova linha.

Um exemplo semelhante é possível com controles Gallery aninhados em vez de funções ForAll. Vamos começar com a galeria vertical para Rank. Esse controle de galeria terá uma fórmula Items de:

Sequence(8) as Rank

Ilustração da galeria externa que fornece a iteração Rank.

Nessa galeria, colocaremos uma galeria horizontal para File, que será replicado para cada Rank, com uma propriedade Items de:

Sequence(8) as File

Ilustração da galeria interna que fornece a iteração File.

E, por fim, nessa galeria, adicionaremos um controle Label que será replicado para cada File e cada Rank. Vamos dimensioná-lo para preencher todo o espaço e usar a propriedade Fill para fornecer a cor com esta fórmula:

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

Controle Label nas duas galerias que fornece as cores alternadas para o tabuleiro.

Operadores Self e Parent

Há três maneiras de se referir a um controle e suas propriedades dentro de uma fórmula:

Método Descrição
Por nome de controle Qualquer controle pode ser referenciado por nome de qualquer lugar dentro do aplicativo.

Por exemplo, Label1.Fill refere-se à propriedade de preenchimento do nome de quem controla Label1.
Eu operador Muitas vezes, é conveniente fazer referência a outra propriedade do mesmo controle ao escrever uma fórmula. Em vez de usar uma referência absoluta por nome, é mais fácil e mais fácil usar uma referência relativa aself. O operador Self fornece acesso fácil ao controle atual.

Por exemplo, Self.Fill refere-se à cor de preenchimento do controle atual.
pai operador Alguns controles hospedam outros controles, como a Screen e Gallery. O controle de hospedagem dos controles é chamado parent. Como o operador Self, o operador Parent fornece uma referência relativa fácil ao controle de contêiner.

Por exemplo, Parent.Fill refere-se à propriedade de preenchimento do controle que é o contêiner do controle atual.

Self e pai são operadores e não propriedades nos próprios controles. A referência a Parent.Parent, Self.Parent ou Parent.Self não é suportada.

Nomes do identificador

Os nomes de variáveis, fontes de dados, colunas e outros objetos podem conter qualquer Unicode.

Use aspas simples ao redor de um nome que contenha um espaço ou outro caractere especial.
Use duas aspas simples juntas para representar uma única aspa no nome. Nomes que não contêm caracteres especiais não requerem aspas simples.

Aqui estão alguns exemplos de nomes de colunas que você pode encontrar em uma tabela e como eles são representados em uma fórmula:

Nome da coluna em um banco de dados Referência de coluna em uma fórmula
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'

Aspas duplas são usadas para designar cadeias de texto.

Nomes de exibição e nomes lógicos

Algumas fontes de dados como SharePoint e Microsoft Dataverse tem dois nomes diferentes para se referir à mesma tabela ou coluna de dados:

  • Nome lógico - Um nome que tem a garantia de ser único, não muda após ser criado, geralmente não permite espaços ou outros caracteres especiais e não é localizado em diferentes idiomas. Como resultado, o nome pode ser enigmático. Esses nomes são usados por desenvolvedores profissionais. Por exemplo, cra3a_customfield. Esse nome também pode ser chamado de nome do esquemaou apenas nome.

  • Nome de exibição - Um nome que seja amigável e destinado a ser visto pelos usuários finais. Esse nome pode não ser exclusivo, pode mudar com o tempo, pode conter espaços e qualquer caractere Unicode e pode estar localizado em idiomas diferentes. Correspondendo ao exemplo acima, o nome de exibição pode ser Campo personalizado com espaço entre as palavras.

Como os nomes de exibição são mais fáceis de entender, o Power Fx vai sugeri-los como opções e não vai sugerir nomes lógicos. Embora os nomes lógicos não sejam sugeridos, eles ainda podem ser usados se digitados indiretamente.

Por exemplo, imagine que você adicionou um Campo customizado para uma entidade no Dataverse. Um nome lógico será atribuído a você pelo sistema, que você poderá modificar apenas ao criar o campo. O resultado seria semelhante a:

Entidade de contas com Campo Personalizado adicionado, mostrando um nome para exibição de

Ao criar uma referência a um campo de Contas, a sugestão será feita para usar 'Custom Field' já que este é o nome de exibição. As aspas simples devem ser usadas porque este nome contém um espaço:

Barra de fórmulas do Studio, mostrando sugestões para nomes de campos de contas com o nome de exibição 'Custom Field' realçado.

Depois de selecionar a sugestão, 'Custom Field' é mostrado na barra de fórmulas e os dados são recuperados:

Barra de fórmulas do Studio, mostrando o uso do nome de exibição 'Custom Field' para o campo.

Embora não seja sugerido, também podemos usar o nome lógico para este campo. Isso resultará na recuperação dos mesmos dados. Não são necessárias aspas simples, pois este nome não contém espaços ou caracteres especiais:

Barra de fórmulas do Studio, mostrando o uso do nome lógico cr5e3_customfield para o campo.

Em segundo plano, é mantido um mapeamento entre os nomes de exibição vistos nas fórmulas e os nomes lógicos subjacentes. Como os nomes lógicos devem ser usados para interagir com a fonte de dados, esse mapeamento é usado para converter automaticamente o nome de exibição atual para o nome lógico e é isso que é visto no tráfego da rede. Esse mapeamento também é usado para reverter os nomes lógicos para mudar para novos nomes de exibição; por exemplo, se um nome de exibição mudar ou um fabricante em um idioma diferente editar o aplicativo.

Nota

Os nomes lógicos não são traduzidos ao mover um aplicativo entre ambientes. Para a entidade do sistema e nomes de campo do Dataverse, isso não deve ser um problema, pois os nomes lógicos são consistentes entre os ambientes. Mas quaisquer campos personalizados, como cra3a_customfield neste exemplo acima, pode ter um prefixo de ambiente diferente (cra3a nesse caso). Os nomes de exibição são preferidos, pois podem ser comparados aos nomes para exibição no novo ambiente.

Desambiguidade do nome

Como os nomes de exibição não são exclusivos, o mesmo nome de exibição pode aparecer mais de uma vez na mesma entidade. Quando isso acontecer, o nome lógico será adicionado ao final do nome para exibição entre parênteses para um ou mais nomes conflitantes. Com base no exemplo acima, se houvesse um segundo campo com o mesmo nome de exibição de Custom Field com um nome lógico de cra3a_customfieldalt as sugestões mostrariam:

Barra de fórmulas do Studio, mostrando o uso do nome lógico cr5e3_customfieldalt para tornar claro as duas versões do

As sequências de desambiguidade de nome são adicionadas em outras situações em que ocorrem conflitos de nome, como nomes de entidades, conjuntos de opções e outros itens do Dataverse.

Operador de desambiguidade

Algumas funções criam escopos de registro para acessar os campos de tabela durante o processamento de cada registro, como Filter, AddColumns e Sum. Os nomes de campo adicionados com o escopo de registro substituem os mesmos nomes de outro lugar no aplicativo. Quando isso acontece, ainda é possível acessar os valores de fora do escopo de registro com o operador de desambiguidade @:

  • Para acessar valores de escopos de registro aninhados, use o operador @ com o nome da tabela que está sendo operada usando este padrão:
    Tabela[@NomeDoCampo]
  • Para acessar valores globais, como fontes de dados, coleções e variáveis de contexto, use o padrão [@NomeDoObjeto] (sem uma designação de tabela).

Para obter mais informações e exemplos, consulte escopos de registro.