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: 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:
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.
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.
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
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
Da mesma forma, a fórmula para o nome também usa ThisItem:
ThisItem.'First Name' & " " & ThisItem.'Last Name'
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" ) )
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
As fórmulas da imagem e do nome são ajustadas para usar esse nome no registro atual:
Employee.Picture
Employee.'First Name' & " " & Employee.'Last Name'
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:
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
Nessa galeria, colocaremos uma galeria horizontal para File, que será replicado para cada Rank, com uma propriedade Items de:
Sequence(8) as 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 )
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:
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:
Depois de selecionar a sugestão, 'Custom Field' é mostrado na barra de fórmulas e os dados são recuperados:
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:
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:
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.