Operadores e Identificadores
Nota
Microsoft Power Fx é o novo nome para a linguagem de fórmula de aplicações de tela. Estes artigos associados são um trabalho em curso à medida que extraímos o idioma das aplicações de tela, o integramos com outros produtos do Microsoft Power Platform e o disponibilizamos como open source. Comece com a Visão geral de Microsoft Power Fx para uma introdução ao idioma.
Os operadores no Microsoft Power Fx estão descritos abaixo. Alguns destes operadores dependem do idioma do autor. Veja Aplicações globais para obter mais informações.
Símbolo | Tipo | Sintaxe | Descrição |
---|---|---|---|
. | Seletor de Propriedade | Slider1.Value Color.Red |
Extrai uma propriedade de uma tabela, controlo ou enumeração. Para retrocompatibilidade, o ! pode ser utilizado. |
. dependente da língua |
Separador decimal | 1.23 | Separador entre as partes inteira e fracionária de um número. O caráter depende do idioma. |
( ) | Parênteses | Filtro (T, A < 10) (1 + 2) * 3 |
Impõe a ordem de precedência e agrupa as subexpressões numa expressão maior |
+ | Operadores aritméticos | 1 + 2 | Adição |
- | 2 - 1 | Subtração e sinal | |
* | 2 * 3 | Multiplicação | |
/ | 2 / 3 | Divisão (veja também a função Mod) | |
^ | 2 ^ 3 | Exponenciação, equivalente à função Power | |
% | 20% | Percentagem (equivalente a "* 1/100") | |
= | Operadores de comparação | Preço = 100 | Igual a |
> | Preço > 100 | Maior que | |
>= | Preço >= 100 | Maior ou igual a | |
< | Preço < 100 | Menor que | |
<= | Preço <= 100 | Menor ou igual a | |
<> | Preço <> 100 | Diferente de | |
& | Operador de concatenação de cadeia | "Olá" & " " & "mundo" | Faz com que várias cadeias apareçam contínuas |
&&ou E | Operadores lógicos | Preço < 100 && Slider1.Value = 20 ou Preço < 100 And ControloDeDeslize1.Value = 20 |
Conjunção lógica, equivalente à função And |
|| ou Ou | Preço < 100 || Slider1.Value = 20 ou Price < 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 | |
exactina | Operadores de associação | Gallery1.Selected exactin SavedItems | Pertencente a uma coleção ou tabela |
exactina | "Windows" exactin "Para exibir janelas no sistema operativo Windows..." | Teste de subcadeia (sensível às maiúsculas e minúsculas) | |
em | Gallery1.Selected em SavedItems | Pertencente a uma coleção ou tabela | |
em | "O" em "O teclado e o monitor..." | Teste de subcadeia (não sensível às maiúsculas e minúsculas) | |
@ | Operador de desambiguação | MyTable[@fieldname] | Desambiguação de campo |
@ | [@MyVariable] | Desambiguação global | |
, [depende de idioma] |
Separador de lista | Se(X < 10, "Baixo", "Bom") { X: 12, Y: 32 } [ 1, 2, 3 ] |
Separa: Este caráter depende do idioma. |
; [depende de idioma] |
Encadeamento de fórmulas | Coleta(T, A); Navegação(S1, "") | Separa invocações de funções nas propriedades de comportamento. O operador de encadeamento depende do idioma. |
Como | Como operador | Todos os Clientes Como Cliente | Substitui ThisItem e ThisRecord nas galerias e funções de âmbito de registo. Como é útil para fornecer um nome melhor e específico e é especialmente importante em cenários aninhados. |
Eu mesmo | Auto-operador | Auto.Preenchimento | Aceder às propriedades do controlo atual |
elemento principal | elemento principal operador | Parent.Fill | Acesso às propriedades de um contentor de controlos |
EsteItem | Operador ThisItem | ThisItem.FirstName | Acesso aos campos de um controlo de formulário ou da Galeria |
IstoRecord | Operador ThisItem | ThisRecord.FirstName | Acesso ao registo completo e aos campos individuais do registo em ForAll, Sum, With e outras funções de âmbito de registo. Pode ser substituído pelo operador As. |
Operadores in e exactin
Utilize os operadores in e exactin para localizar uma cadeia numa origem de dados, como uma coleção ou uma tabela importada. O operador in identifica correspondências independentemente das maiúsculas e minúsculas, e o operador exactin identifica correspondências apenas se estiverem escritas com as mesmas maiúsculas. Eis um exemplo:
Crie ou importe uma coleção com o nome Inventorye mostre-a numa galeria, como o primeiro procedimento em Mostrar imagens e texto numa galeria descreve.
Defina a propriedade Items da galeria como esta fórmula:
Filtro(Inventário, "E" em ProductName)A galeria mostra todos os produtos, exceto Callisto porque o nome do produto é o único que não contém a letra especificada.
Altere a propriedade Items da galeria para esta fórmula:
Filtro(Inventário, "E" exactin ProductName)A galeria mostra apenas Europa porque só o respetivo nome contém a letra que especificou nas maiúsculas/minúsculas que especificou.
Operadores ThisItem, ThisRecord e As
Alguns controlos e funções aplicam fórmulas aos registos individuais de uma tabela. Para referenciar o registo individual de uma fórmula, utilize um dos seguintes:
Operador | Aplica-se ao | Descrição |
---|---|---|
EsteItem | Controlo de galeria Editar controle de formulário Controle de formulário de exibição |
O nome predefinido para o registo atual num controlo de formulário ou Gallery. |
IstoRecord | ForAll,Filter,With,Sum ... ... ... e outras funções de escopo de registro | O nome predefinido para o registo atual em ForAll e outras funções de âmbito de registo. |
Comonome | Controlo de galeria ForAll,Filter,With,Sum ... ... ... e outras funções de escopo de registro |
Define um nome para o registo atual, substituindo o ThisItem ou ThisRecord predefinido. Utilize As para facilitar a compreensão das fórmulas e resolver a ambiguidade durante o aninhamento. |
Operador ThisItem
Por exemplo, no seguinte controlo Gallery, a propriedade Items é definida para a origem de dados Empregados (como a entidade Empregados incluída no exemplo da Distribuidores Adamastor):
Employees
O primeiro item na galeria é um modelo que é replicado para cada empregado. No modelo, a fórmula para a imagem utiliza ThisItem para referenciar o item atual:
ThisItem.Picture
Da mesma forma, a fórmula para o nome também utiliza ThisItem:
ThisItem.'First Name' & " " & ThisItem.'Last Name'
Operador ThisRecord
ThisRecord é usado em funções que têm um escopo deregistro. Por exemplo, podemos utilizar a função Filter com a propriedade Items da nossa galeria para mostrar apenas os nomes próprios que começam por M:
Filter( Employees, StartsWith( ThisRecord.Employee.'First Name', "M" ) )
ThisRecord é opcional e implícito usando os campos diretamente, por exemplo, neste caso, poderíamos ter escrito:
Filter( Employees, StartsWith( 'First Name', "M" ) )
Apesar de opcional, a utilização de ThisRecord pode facilitar a compreensão das fórmulas e pode ser necessário em situações ambíguas, em que um nome de campo também pode ser um nome de relação. ThisRecord é opcional, enquanto ThisItem é sempre necessário.
Utilize ThisRecord para referenciar todo o registo com Patch, Collect e outras funções de âmbito de registo. Por exemplo, a seguinte fórmula define o estado de todos os empregados inativos para ativos:
With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
ForAll( InactiveEmployees,
Patch( Employees, ThisRecord, { Status: 'Status (Employees)'.Active } ) ) )
Como operador
Utilize o operador As para atribuir um nome a um registo numa galeria ou função de âmbito de registo, substituindo o ThisItem ou ThisRecord predefinido. A atribuição de um nome ao registo pode facilitar a compreensão das fórmulas e pode ser necessário em situações aninhadas para aceder a registos noutros âmbitos.
Por exemplo, pode modificar a propriedade Items da nossa galeria para utilizar As para identificar que estamos a trabalhar com um Empregado:
Employees As Employee
As fórmulas para a imagem e o nome são ajustadas para utilizarem este nome para o registo atual:
Employee.Picture
Employee.'First Name' & " " & Employee.'Last Name'
Como também pode ser usado com funções de escopo de registro para substituir o nome padrão ThisRecord. Podemos aplicar isto ao nosso exemplo anterior para clarificar o registo com o qual estamos a trabalhar:
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 âmbito de registo, a ThisItem e ThisRecord referem-se sempre ao âmbito mais interior, deixando os registos em âmbitos exteriores não disponíveis. Utilize As para disponibilizar todos os âmbitos de registo ao atribuir um nome exclusivo a cada um.
Por exemplo, esta fórmula produz um padrão de tabuleiro de xadrez como uma cadeia de texto ao aninhar 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 a propriedade Text de um controlo Label para esta fórmula apresenta:
Vamos desmontar o que está a acontecer aqui:
- Começamos por iterar uma tabela sem nome de 8 registos numerados a partir da função Sequence. Este ciclo é para cada linha do tabuleiro, que é comumente referido como Rank, pelo que lhe atribuímos este nome.
- Para cada linha, iteramos outra tabela sem nome de 8 colunas e atribuímos-lhe o nome comum File.
- Se Rank.Value + File.Value for um número ímpar, é colocado um X no quadrado, caso contrário é um ponto. Esta parte da fórmula referencia os dois ciclos ForAll, possíveis ao utilizar o operador As.
- Concat é usado duas vezes, primeiro para montar as colunas e depois as linhas, com um Char(10) lançado para criar uma nova linha.
É possível um exemplo semelhante com os controlos Gallery aninhados das funções ForAll. Vamos começar com a galeria vertical para Rank. Este controlo gallery terá uma fórmula Items de:
Sequence(8) as Rank
Nesta galeria, colocaremos uma galeria horizontal para File, que será replicada para cada Rank, com uma propriedade Items de:
Sequence(8) as File
E, finalmente, dentro desta galeria, vamos adicionar um controlo Label que será replicado para cada File e cada Rank. Vamos dimensioná-lo para preencher todo o espaço e utilizar a propriedade Fill para fornecer a cor com esta fórmula:
If( Mod( Rank.Value + File.Value, 2 ) = 1, Green, Beige )
Operadores de Self e Principais
Existem três formas de se referir a um controlo e às suas propriedades dentro de uma fórmula:
Método | Descrição |
---|---|
Por nome do controlo | Qualquer controlo pode ser referido pelo nome a partir de qualquer lugar dentro da aplicação. Por exemplo, Label1.Fill refere-se à propriedade de preenchimento do controlo cujo nome é Label1. |
Auto-operador | Muitas vezes é conveniente referir outra propriedade do mesmo controlo ao escrever uma fórmula. Em vez de usar uma referência absoluta pelo nome, é mais fácil e portátil usar uma referência relativa a si próprio. O operador Self proporciona esse fácil acesso ao controlo atual. Por exemplo, Self.Fill refere-se à cor de preenchimento do controlo atual. |
elemento principal operador | Alguns controlos acolhem outros controlos, como os controlos de Screen e Gallery. Ao controlo de alojamento dos controlos nele contidos damos o nome de principal. Tal como o operador self, o operador principal fornece uma referência relativa fácil ao controlo do recipiente. Por exemplo, Parent.Fill refere-se à propriedade de preenchimento do controlo que é o recipiente para o controlo atual. |
Operadores próprios e elemento principal e não propriedades nos próprios controles. Referir-se a Parent.Parent, Self.Parent ou Parent.Self não é suportado.
Nomes de identificador
Os nomes de variáveis, origens de dados, colunas e outros objetos podem conter qualquer Unicode.
Utilize aspas simples ao redor de um nome que contém um espaço ou outro caráter especial.
Utilize plicas em conjunto para representar uma única plica no nome. Os nomes que não tiverem carateres especiais não necessitam de plicas.
Seguem-se alguns exemplos de nomes de coluna que poderá encontrar numa tabela e como são representados numa fórmula:
Nome da coluna numa base de dados | Referência de coluna numa fórmula |
---|---|
SimpleName | SimpleName |
NameWith123Numbers | NameWith123Numbers |
Nome com espaços | 'Name with spaces' |
Nome com "aspas" | 'Name with "double" quotes' |
Nome com "plicas" | 'Name with ''single'' quotes' |
Nome com um sinal @ arroba | 'Name with an @ at sign' |
As aspas são utilizadas para designar cadeias de texto.
Nomes a apresentar e nomes lógicos
Algumas origens de dados, tais como o SharePoint e o Microsoft Dataverse têm dois nomes diferentes para referenciarem a mesma tabela ou coluna de dados:
Nome lógico - Um nome que é garantido como exclusivo, não muda depois de ser criado, geralmente não permite espaços ou outros caracteres especiais e não está localizado em idiomas diferentes. Como resultado, o nome pode ser críptico. Estes nomes são utilizados por programadores profissionais. Por exemplo, cra3a_customfield. Este nome também pode ser referido como nome de esquema ou apenas nome.
nome a apresentar - Um nome de fácil utilização e destinado a ser visto pelos utilizadores finais. Este nome poderá não ser exclusivo, poderá ser alterado com o tempo, poderá conter espaços e qualquer caráter Unicode e poderá ser traduzido em diferentes idiomas. Correspondendo ao exemplo acima, o nome a apresentar pode ser Campo Personalizado com um espaço entre as palavras.
Uma vez que os nomes a apresentar são mais fáceis de entender, o Power Fx irá sugeri-los como escolhas e não sugerir nomes lógicos. Apesar de não serem sugeridos nomes lógicos, continuam a poder ser utilizados se forem digitados indiretamente.
Por exemplo, imagine que adicionou um Campo Personalizado a uma entidade no Dataverse. Um nome lógico ser-lhe-á atribuído pelo sistema que só pode ser modificado quando criar o campo. O resultado seria semelhante a:
Quando criar uma referência a um campo Contas, a sugestão será efetuada para utilizar o 'Campo Personalizado', uma vez que este é o nome a apresentar. As plicas têm de ser usadas porque este nome contém um espaço:
Depois de seleccionar a sugestão, 'Campo Personalizado' é mostrado na barra de fórmulas e os dados são obtidos:
Apesar de não ser sugerido, também poderíamos utilizar o nome lógico para este campo. Isto irá resultar na obtenção dos mesmos dados. Não são necessárias plicas, uma vez que este nome não contém espaços ou carateres especiais:
Nos bastidores, é mantido um mapeamento entre os nomes a apresentar vistos em fórmulas e os nomes lógicos subjacentes. Uma vez que os nomes lógicos têm de ser utilizados para interagir com a origem de dados, este mapeamento é utilizado para converter automaticamente o nome a apresentar atual no nome lógico e isto é o que é visto no tráfego de rede. Este mapeamento também é utilizado para reverter para nomes lógicos para mudar para novos nomes a apresentar, por exemplo, se um nome a apresentar for alterado ou um fabricante numa linguagem diferente editar a aplicação.
Nota
Os nomes lógicos não são traduzidos quando move uma aplicação entre ambientes. Para a entidade de sistema e nomes de campos do Dataverse, isto não deve ser um problema uma vez que os nomes lógicos são consistentes entre ambientes. No entanto, os campos personalizados, tais como cra3a_customfield neste exemplo, poderão ter um prefixo de ambiente diferente (cra3a neste caso). Os nomes a apresentar são preferenciais uma vez que podem ser correspondidos aos nomes a apresentar no novo ambiente.
Desambiguação de nome
Visto que os nomes a apresentar não são exclusivos, o mesmo nome a apresentar poderá aparecer mais de uma vez na mesma entidade. Quando isto acontecer, o nome lógico será adicionado ao final do nome a apresentar entre parênteses para um ou mais dos nomes em conflito. Com base no exemplo acima, se havia um segundo campo com o mesmo nome a apresentar de Campo Personalizado com um nome lógico de cra3a_customfieldalt, as sugestões demonstrariam:
As cadeias de desambiguação de nomes são adicionadas em outras situações em que ocorrem conflitos de nomes, tais como os nomes de entidades, conjuntos de opções e outros itens do Dataverse.
Operador de desambiguação
Algumas funções criam âmbitos de registo para aceder aos campos da tabela durante o processamento de cada registo, tal como Filter, AddColumns e Sum. Os nomes de campos adicionados com o âmbito de registo substituem os mesmos nomes em qualquer outro local na aplicação. Quando isto acontece, pode continuar a aceder a valores fora do âmbito de registo com o operador de desambiguação @:
- Para aceder a valores de âmbitos de registo aninhados, utilize o operador @ com o nome da tabela que está a ser utilizada através da utilização deste padrão:
Tabela[@FieldName] - Para aceder a valores globais, tais como origens de dados, coleções e variáveis de contexto, utilize o padrão [@ObjectName] (sem uma designação de tabela).
Para obter mais informações e exemplos, veja âmbitos de registo.