Operadores e identificadores no Power Apps

Aplica-se a: Aplicações de tela Aplicações condicionadas por modelo

Alguns destes operadores dependem do idioma do autor. Para mais informações sobre o suporte de idiomas nas aplicações de tela, consulte Aplicações globais.

Símbolo Tipo Exemplo Descrição
'...' Identificador 'Nome da Conta' Os identificadores que contêm caracteres especiais, incluindo espaços, encontram-se entre plicas
"..." Cadeia de texto "Hello, World" As cadeias de texto estão entre aspas
$"..." Interpolação de cadeias $"Caro {FirstName}," Fórmulas incorporadas numa cadeia de texto
. Seletor de Propriedade Slider1.Value
Color.Red
Acceleration.X
Extrai uma propriedade de uma tabela, controlo, sinal ou enumeração. Para retrocompatibilidade, o ! também pode ser utilizado.
.
[depende de idioma]
Separador decimal 1.23 Separador entre as partes inteira e fracionária de um número. O caráter depende do idioma.
( ) Parênteses Filter(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 "hello" & " " & "world" Faz com que várias cadeias apareçam contínuas
&& ou And 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 Or   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 Not (Preço < 100) Negação lógica, equivalente à função Not
exactin Operadores de associação Gallery1.Selected exactin SavedItems Pertencente a uma coleção ou tabela
exactin   "Windows" exactin “Para apresentar janelas no sistema operativo Windows...” Teste de subcadeia (sensível às maiúsculas e minúsculas)
presente em   Gallery1.Selected in SavedItems Pertencente a uma coleção ou tabela
presente 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 If( X < 10, "Low", "Good" )
{ X: 12, Y: 32 }
[ 1, 2, 3 ]
Separa:
  • argumentos em chamadas de função
  • campos num registo
  • registos numa tabela
Este caráter depende do idioma.
;
[depende de idioma]
Encadeamento de fórmulas Collect(T, A); Navigate(S1, "") Separa invocações de funções nas propriedades de comportamento. O operador de encadeamento depende do idioma.
Como Como operador AllCustomers como Cliente Substitui ThisItem e ThisRecord nas galerias e funções de âmbito de registo. As é útil para fornecer um melhor nome específico e é particularmente importante em cenários aninhados.
Autónoma Operador Self Self.Fill Aceder às propriedades do controlo atual
Elemento Principal Operador principal Parent.Fill Acesso às propriedades de um contentor de controlos
ThisItem Operador ThisItem ThisItem.FirstName Acesso aos campos de uma Gallery ou controlo form
ThisRecord Operador ThisRecord 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.

Nota

O operador @ também pode ser utilizado para validar o tipo de objeto de gravação relativamente a uma origem de dados. Por exemplo, Collect(coll,Account@{'Account Number: 1111')

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:

  1. 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.

  2. Defina a propriedade Items da galeria como esta fórmula:
    Filter(Inventory, "E" in ProductName)

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

  3. Altere a propriedade Items da galeria para esta fórmula:
    Filter(Inventory, "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
ThisItem Controlo Gallery
Controlo Edit form
Controlo Display form
O nome predefinido para o registo atual num controlo de formulário ou Gallery.
ThisRecord ForAll, Filter, With, Sum e outras funções do âmbito do registo O nome predefinido para o registo atual em ForAll e outras funções de âmbito de registo.
Comonome Controlo Gallery
ForAll, Filter, With, Sum e outras funções do âmbito do registo
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 da Gallery, a propriedade Items é definida para a origem de dados funcionários (tal como a tabela funcionários incluída com a amostra Northwind Traders):

Employees

Empregados mostrados numa galeria.

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

Fórmula para a imagem de um empregado.

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

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

Fórmula para o nome próprio e apelido de um empregado.

Operador ThisRecord

ThisRecord é utilizado em funções com um âmbito de registo. 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" ) )

Filtrar os empregados baseado no nome, através de ThisRecord.

ThisRecord é opcional e implícito ao utilizar os campos diretamente, por exemplo, neste caso, podí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 obrigató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

Galeria de empregados, utilizando o operador As.

As fórmulas para a imagem e o nome são ajustadas para utilizarem este nome para o registo atual:

Employee.Picture

Imagem de um empregado a utilizar o conjunto de nomes Employee com o operador As.

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

Nome próprio e apelido de um empregado a utilizar o conjunto de nomes Employee com o operador As.

As também pode ser utilizado com funções de âmbito de registo para substituir o nome predefinido ThisRecord. Podemos aplicar esta informação 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:

Texto de tabuleiro de xadrez mostrado num controlo de etiqueta.

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 é utilizado duas vezes, primeiro para montar as colunas e, em seguida, as linhas, com Char(10) atribuído 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

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

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

Sequence(8) as File

Ilustração da galeria interna que fornece a iteração 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 )

Controlo Label nas duas galerias que fornece as cores alternativas para o tabuleiro de xadrez.

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.
Operador Self 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.
Operador Parent Alguns controlos acolhem outros controlos, como os controlos de Screen e Gallery. O controlo hosting dos controlos incluídos chama-se elemento 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.

Self e Principal são operadores e não propriedades nos próprios controlos. 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 contêm caracteres especiais não necessitam de plicas.

Aqui estão alguns exemplos de nomes de colunas que poderá encontrar numa tabela, bem como a forma 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 se garante ser único, que não altera depois de ser criado, normalmente não permite espaços nem 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 utilizador amigável e destinado a ser visto por 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.

Visto que os nomes a apresentar são mais fáceis de compreender, as aplicações de tela irão sugerir as opções como escolhas e não sugerir nomes lógicos. Apesar de não serem sugeridos nomes lógicos, os nomes podem continuar a ser utilizados se escritos indiretamente.

Por exemplo, imagine que adicionou um Campo Personalizado a uma tabela 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:

Tabela de contas com Campo Personalizado adicionado, mostrando uma nome a apresentar de

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. É necessário utilizar plicas pois este nome tem um espaço:

Barra de fórmulas do Studio que mostra sugestões para nomes de campos de Contas com o nome a apresentar 'Campo Personalizado' realçado.

Depois de seleccionar a sugestão, 'Campo Personalizado' é mostrado na barra de fórmulas e os dados são obtidos:

Barra de fórmulas do Studio que mostra a utilização do nome a apresentar 'Campo Personalizado' para o campo.

Embora não seja sugerido, também podemos 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:

Barra de fórmulas do Studio que mostra a utilização do nome lógico a apresentar cr5e3_customfield para o campo.

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 tabela do sistema e nomes de campo Dataverse, este não deve ser um problema, uma vez que os nomes lógicos são consistentes em todos os 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 únicos, o mesmo nome pode aparecer mais do que uma vez na mesma tabela. 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:

Barra de fórmulas do Studio que mostra a utilização do nome lógico cr5e3_customfieldalt para desambiguar as duas versões do

As cadeias de desambiguação de nomes são adicionadas noutras situações em que ocorrem conflitos de nomes, tais como os nomes da tabela, escolhas 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:
    Table[@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.