Operadores e identificadores no Power Apps

Aplica-se a: Aplicativos de tela Aplicativos baseados em modelo

Alguns desses operadores dependem do idioma do autor. Para obter mais informações sobre o suporte a idioma em aplicativos de tela, consulte Aplicativos globais.

Símbolo Tipo Exemplo Descrição
'...' Identificador 'Nome da Conta' Identificadores que contêm caracteres especiais, incluindo espaços, são colocados entre aspas simples
"..." Cadeia de caracteres de texto "Olá, Mundo" As cadeias de caracteres de texto são colocadas entre aspas duplas
$"..." Interpolação de cadeia de caracteres $"Dear {FirstName}," Fórmulas inseridas em uma cadeia de caracteres de texto
. Seletor de Propriedade Slider1.Value
Color.Red
Acceleration.X
Extrai uma propriedade de uma tabela, controle, sinal ou enumeração. Para compatibilidade com versões anteriores, ! também pode ser usado.
.
[dependente do idioma]
Separador decimal 1.23 Separador entre número inteiro e frações de um número. O caractere depende do idioma.
( ) Parênteses Filter(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 Price = 100 Igual a
>   Price > 100 Maior que
>=   Price >= 100 Maior que ou igual a
<   Price < 100 Menor que
<=   Price <= 100 Menor que ou igual a
<>   Price <> 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.Value = 20
ou Price < 100 And Slider1.Value = 20
Conjunção lógica equivalente à função And
|| ou Or   Price < 100 || Slider1.Value = 20 or Price < 100 Or Slider1.Value = 20 Disjunção lógica, equivalente à função Or
! ou Not   !(Price < 100) ou Not (Price < 100) Negação lógica, equivalente à função Not
exactin Operadores de associação Gallery1.Selected exactin SavedItems Pertencente a uma coleção ou a uma tabela
exactin   "Windows" exactin “To display windows in the Windows operating system...” Teste de subcadeia de caracteres (diferencia maiúsculas de minúsculas)
está   Gallery1.Selected in SavedItems Pertencente a uma coleção ou a uma tabela
está   "The" in "The keyboard and the monitor..." Teste de subcadeia de caracteres (não diferencia maiúsculas de minúsculas)
@ Operador de desambiguidade MyTable[@fieldname] Desambiguidade de campo
@   [@MyVariable] Desambiguidade global
,
[dependente do idioma]
Separador de lista If( X < 10, "Low", "Good" )
{ 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 Collect(T, A); Navigate(S1, "") Separa invocações de funções em propriedades de comportamento. O operador de encadeamento depende do idioma.
Como Operador As Cliente AllCustomers As Substitui ThisItem e ThisRecord em galerias e funções de escopo de registro. As é útil para fornecer um nome melhor e específico e é especialmente importante em cenários aninhados.
Auto Operador Self Self.Fill Acessa as propriedades do controle atual
Primário Operador pai Parent.Fill Acesso a propriedades de um contêiner Container
ThisItem Operador ThisItem ThisItem.FirstName Acesso a campos de um controle Gallery ou Form
ThisRecord Operador ThisRecord ThisRecord.FirstName 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.

Nota

O operador @ também pode ser usado para validar o tipo do objeto de registro em uma fonte de dados. Por exemplo, Collect(coll,Account@{'Account Number: 1111')

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:
    Filter(Inventory, "E" in 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:
    Filter(Inventory, "E" exactin ProductName)

    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
ThisItem Controle Gallery
Controle Editar formulário
Controle Exibir formulário
O nome padrão do registro atual em um Gallery ou controle de formulário.
ThisRecord ForAll, Filter, With, Sum e outras funções de escopo do registro O nome padrão do registro atual em ForAll e outras funções de escopo de registro.
Comonome Controle Gallery
ForAll, Filter, With, Sum e outras funções de escopo do 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 tabela 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 do 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, nesse 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 pode ser usado com funções de escopo de registro para substituir o nome padrão ThisRecord. Podemos aplicar isso 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) lançado 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.
OperadorSelf 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.
OperadorPai Alguns controles hospedam outros controles, como a Screen e Gallery. O controle de hospedagem dos controles dentro dele é chamado de pai. 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 Parent 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 exigem 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 garantido como único não muda após 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 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 fácil para o usuário 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, os aplicativos do Canvas os sugerem como opções e não sugerem 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ê tenha adicionado um Campo Personalizado a uma tabela 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:

Tabela Accounts com Custom Field adicionado, mostrando um nome de exibição

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 tem 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 nomes de tabela do sistema e de campo do Dataverse, isso não deverá ser um problema, já que os nomes lógicos são consistentes em todos 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 tabela. Quando isso acontece, 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 cadeias de caracteres de desambiguação de nomes são adicionadas em outras situações onde ocorrem conflitos de nomes, como nomes de tabela, 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:
    Table[@FieldName]
  • 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.