Você pode criar um aplicativo que acessa informações no Microsoft Excel, SharePoint, SQL Server e várias outras fontes que armazenam dados em tabelas e registros. Para trabalhar com mais eficiência com esse tipo de dados, examine os conceitos que fundamentam essas estruturas.

  • Um registro contém uma ou mais categorias de informações sobre uma pessoa, um lugar ou algo. Por exemplo, um registro pode conter o nome, o endereço de email e o número de telefone de um único cliente. Outras ferramentas se referem a um registro como uma "linha" ou "item".
  • Uma tabela tem um ou mais registros que contêm as mesmas categorias de informações. Por exemplo, uma tabela pode conter os nomes, endereços de email e números de telefone de 50 clientes.

Em seu aplicativo, você usará fórmulas para criar, atualizar e manipular os registros e tabelas. Provavelmente, você vai ler e gravar dados em uma fonte de dados externa, que é uma tabela estendida. Além disso, você pode criar uma ou mais tabelas internas, que são chamadas de coleções.

Você pode criar uma variedade de fórmulas que usam o nome de uma tabela como um argumento, assim como uma fórmula no Excel tem uma ou mais referências de célula como argumentos. Algumas fórmulas no PowerApps retornam uma tabela que reflete os outros argumentos que você especificar. Por exemplo, você pode criar uma fórmula:

  • para atualizar um registro em uma tabela especificando a tabela como um dos vários argumentos para a função Patch
  • para adicionar, remover e renomear colunas em uma tabela especificando a tabela como um argumento para a função AdicionarColunas, DropColumns ou RenameColumns. Nenhuma dessas funções modifica a tabela original. Em vez disso, a função retorna outra tabela com base em outros argumentos que você especificar.

Elementos de uma tabela

Registros

Cada registro contém pelo menos uma categoria de informações para uma pessoa, lugar ou algo. O exemplo acima mostra um registro de cada produto (Chocolate, Pão e Água) e uma coluna para cada categoria de informações (Preço, Quantidade disponível e Quantidade do pedido).

Em uma fórmula, você fazer referência a um registro por si só, fora do contexto de uma tabela, usando chaves. Por exemplo, este registro { Name: "Strawberries", Price: 7.99 } não está associado a uma tabela.

Campos

Um campo é uma informação individual em um registro. Você pode visualizar esse tipo de campo como um valor em uma coluna para determinado registro.

Assim como com um controle, você se refere a um campo de um registro usando o . operador no registro. Por exemplo, First(Products).Name retorna o campo Nome do primeiro registro na tabela Produtos.

Um campo pode conter outro registro ou tabela, como o exemplo para a função GroupBy mostra. Você pode aninhar quantos níveis de registros e tabelas desejar.

Colunas

Uma coluna refere-se ao mesmo campo para um ou mais registros em uma tabela. No exemplo acima, cada produto tem um campo de preço e esse preço está na mesma coluna para todos os produtos. A tabela acima tem quatro colunas, exibidas na horizontal na parte superior:

  • Nome
  • Preço
  • Quantidade disponível
  • Quantidade do pedido

O nome da coluna reflete os campos nessa coluna.

Todos os valores em uma coluna são do mesmo tipo de dados. No exemplo acima, a coluna "Quantidade disponível" sempre contém um número e não pode conter uma cadeia de caracteres, como "12 unidades", para um registro. O valor de qualquer campo também pode ser em branco.

Você pode ter feito referência a colunas como "campos" em outras ferramentas.

Observação: nas fontes de dados do Excel e do SharePoint que contêm nomes de colunas com espaços, o PowerApps substituirá os espaços por "_x0020_". Por exemplo, "Nome da Coluna", no SharePoint ou no Excel, aparecerá como "Nome_x0020_da_x0020_Coluna" no PowerApps quando exibidos no layout de dados ou usados em uma fórmula.

Tabela

Uma tabela consiste em um ou mais registros, cada um com vários campos com nomes consistentes entre os registros.

Qualquer tabela que seja armazenada em uma fonte de dados ou em uma coleção tem um nome que você usa para fazer referência à tabela e passá-la para funções que aceitam tabelas como argumentos. Tabelas também podem ser o resultado de uma função ou uma fórmula.

Como no exemplo a seguir, você pode expressar uma tabela em uma fórmula usando a função Tabela com um conjunto de registros demarcados entre chaves:

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

Você também pode definir uma tabela de coluna única com colchetes. Uma maneira equivalente de escrever o exemplo acima:

[ "Strawberry", "Vanilla" ]

Fórmulas de tabela

No Excel e no PowerApps, é possível usar fórmulas para manipular números e cadeias de caracteres de texto de maneiras semelhantes:

  • No Excel, digite um valor, como 42, na célula A1 e, em seguida, digite uma fórmula, como A1+2, em outra célula para mostrar o valor de 44.
  • No PowerApps, defina a propriedade Default de Slider1 como 42 e defina a propriedade Text de um rótulo como Slider1.Value + 2 para mostrar o valor 44.

Em ambos os casos, o valor calculado será alterado automaticamente se você alterar os valores dos argumentos (por exemplo, o número na célula A1 ou o valor de Slider1).

Da mesma forma, você pode usar fórmulas para acessar e manipular dados em tabelas e registros. Você pode usar nomes de tabelas como argumentos em algumas fórmulas, como Min(Catalog, Price) para mostrar o valor mais baixo na coluna Preço da tabela Catálogo. Outras fórmulas fornecem tabelas inteiras como valores de retorno, como RenameColumns(Catalog, "Price", "Cost"), que retornam todos os registros da tabela Catálogo, mas altera o nome da coluna Preço para Custo.

Assim como com números, fórmulas que envolvem tabelas e registros são recalculadas automaticamente à medida que a tabela subjacente ou o registro são alterados. Se o custo de um produto na tabela Catálogo for reduzido abaixo do mínimo anterior, o valor retornado da fórmula Min alterará automaticamente de acordo com ele.

Vamos examinar alguns exemplos simples.

  1. Adicione um controle Galeria de texto e defina sua propriedade Itens como o nome de uma tabela.

    Por padrão, a galeria exibe o texto de espaço reservado de uma tabela chamado TextualGallerySample. A propriedade Itens da galeria é definida automaticamente como essa tabela.

    Observação: alguns controles foram reorganizados e ampliados para fins de ilustração.

  2. Em vez de definir a propriedade Itens como o nome de uma tabela, defina-a como uma fórmula que inclui o nome da tabela como um argumento, como neste exemplo:
    Sort(TextualGallerySample, Heading, Descending)

    Esta fórmula incorpora a função Classificar, que usa o nome de uma tabela como seu primeiro argumento e o nome de uma coluna nessa tabela como seu segundo argumento. A função também dá suporte a um terceiro argumento opcional, que estipula que você deseja classificar os dados em ordem decrescente.

  3. Defina a propriedade Itens como uma fórmula que usa a fórmula da etapa anterior como um argumento e retorna uma tabela, como neste exemplo:
    FirstN(Sort(TextualGallerySample, Heading, Descending), 2)

    Nesta fórmula, use a função FirstN para mostrar um determinado número de registros em uma tabela. Você usa a função Classificar como o primeiro argumento para FirstN e um número (nesse caso, 2) como o segundo argumento, que especifica quantos registros devem ser exibidos.

    Toda a fórmula retorna uma tabela que contém os dois primeiros registros da tabela TextualGallerySample, classificada pela coluna Direção em ordem decrescente.

Funções de tabela e propriedades de controle

Várias funções no PowerApps levam o nome de uma tabela como um argumento, criam uma segunda tabela que contém os mesmos dados, manipulam a nova tabela com base em outros argumentos e retornam o resultado. Essas funções não modificarão a tabela original, mesmo se houver uma fonte de dados.

  • Classificar, Filtrar – classifica e filtra registros.
  • FirstN, LastN – retorna os N primeiros ou os N últimos registros da tabela.
  • Abs, Sqrt, Round, RoundUp, RoundDown – operações aritméticas em cada registro de uma tabela de coluna única, resultando em uma tabela de resultados de coluna única.
  • Left, Mid, Right, Replace, Substitute, Trim, Lower, Upper, Proper – manipulações de cadeia de caracteres em cada registro de tabela de coluna única, resultando em uma tabela de cadeia de caracteres de coluna única.
  • Len – para uma coluna de cadeias de caracteres, retorna uma tabela de coluna única que contém o comprimento de cada cadeia de caracteres.
  • Concatenar – concatena várias colunas de cadeias de caracteres, resultando em uma tabela de coluna única de cadeias de caracteres.
  • AdicionarColunas, DropColumns, RenameColumns, MostrarColunas – manipulação de coluna da tabela, resultando em uma nova tabela com colunas diferentes.
  • Distinto – remove registros duplicados.
  • Embaralhar – mistura os registros em ordem aleatória.
  • HashTags – pesquisa hashtags em uma cadeia de caracteres.
  • Erros – fornece informações de erros quando você trabalha com uma fonte de dados.

Você pode executar uma função em uma tabela que contenha várias colunas, mesmo se a função exigir uma única coluna como um argumento. Para extrair uma única coluna de uma tabela de várias colunas, use a função MostrarColunas como um argumento para a função que deseja usar, como neste exemplo:
Lower( ShowColumns( Products, "Name" ) )

Esta fórmula cria uma tabela de coluna única que contém todos os dados da coluna Nome da tabela Produtos, mas converte todas as letras maiúsculas em minúsculas. Se você especificar uma tabela como um argumento para a função AdicionarColunas, RenameColumns ou DropColumns, será possível remodelar completamente essa tabela como desejar.

Se você especificar uma fonte de dados como um argumento para uma dessas funções, ela modificará os registros dessa fonte de dados e, em geral, retornará o novo valor dessa fonte de dados como uma tabela.

Os seguintes controles têm propriedades que são tabelas:

  • Itens – aplica-se a galerias e caixas de listagem. Tabela a ser exibida na galeria.
  • SelectedItems – aplica-se a caixas de listagem. Tabela de itens que o usuário selecionou.

Fórmulas de registro

Você também pode criar uma fórmula que calcula os dados para um registro individual, usa um registro individual como um argumento e fornece um registro individual como um valor retornado. Voltando ao nosso exemplo de galeria acima, vamos usar a propriedade Gallery1.Selected para exibir informações de todos os registros que o usuário selecionar nessa galeria.

  1. Adicione um botão e defina a propriedade OnSelect para esta fórmula:
    Collect( SelectedRecord, Gallery1.Selected )
  2. Se o botão não estiver selecionado, clique nele para selecioná-lo e, em seguida, clique nele novamente para executar a fórmula.
  3. No menu Arquivo, selecione Coleções.

Esta fórmula retorna um registro que inclui não apenas os dados do registro que está selecionado atualmente na galeria, mas também cada controle nessa galeria. Por exemplo, o registro contém uma coluna Body, que corresponde à coluna Body da tabela original e uma coluna Body1, que representa o rótulo que mostra os dados dessa coluna. Selecione o ícone de tabela na coluna Body1 para analisar esses dados.

Agora que você tem o registro selecionado, é possível extrair campos individuais dele com o operador . .

  1. Pressione Esc para retornar ao espaço de trabalho padrão e, em seguida, adicione um rótulo abaixo da galeria.

  2. Defina a propriedade Text do rótulo com esta fórmula:
    Gallery.Selected.Heading

Você usou a propriedade Selecionado, que é um registro, e extraiu a propriedade Cabeçalho dela.

Também é possível usar um registro como um contêiner de finalidade geral para valores nomeados relacionados.

Nesses casos, o registro nunca foi uma parte de uma tabela.

Funções de registro e propriedades de controle

Funções que retornam registros:

  • FirstN, LastN – retorna o primeiro ou último registro ou registros da tabela.
  • Pesquisa – retorna o primeiro registro de uma tabela que corresponde a um ou mais critérios.
  • Patch – atualiza uma fonte de dados ou mescla registros.
  • Padrões – retorna os valores padrão para uma fonte de dados.

Propriedades que retornam registros:

  • Selecionado – aplica-se a galerias e caixas de listagem. Retorna o registro selecionado atualmente.
  • Atualizações – aplica-se a galerias. Reúne todas as alterações feitas pelo usuário em um formulário de entrada de dados.
  • Atualizar – aplica-se a controles de entrada como controles de entrada de texto e controles deslizantes. Define as propriedades individuais da galeria para reunir.

Escopo do registro

Algumas funções operam avaliando uma fórmula em todos os registros de uma tabela individualmente. O resultado da fórmula é usado de várias maneiras:

  • Filtrar, Pesquisa – a fórmula que determina se o registro deve ser incluído na saída.
  • Classificar – fórmula que fornece o valor pelo qual classificar os registros.
  • Concat – fórmula que determina as cadeias de caracteres para se concatenar.
  • ForAll – fórmula que pode retornar qualquer valor, possivelmente com um efeito colateral.
  • Distinto – fórmula que retorna um valor usada para identificar registros duplicados.
  • AdicionarColunas – fórmula que fornece o valor do campo adicionado.
  • Média, Max, Min, Sum, StdevP, VarP – fórmula que fornece o valor a ser agregado.

Dentro dessas fórmulas, você pode fazer referência aos campos do registro que está sendo processado. Cada uma dessas funções cria um "escopo de registro" em que a fórmula é avaliada, no qual os campos do registro estão disponíveis como identificadores de nível superior. Também é possível fazer referência a propriedades de controle e a outros valores de todo o seu aplicativo.

Por exemplo, use uma tabela de Produtos:

Para determinar se algum desses produtos foram mais solicitados do que o disponível:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

O primeiro argumento para filtrar é a tabela de registros na qual operar e o segundo argumento é uma fórmula. Filtrar cria um escopo de registro para avaliar esta fórmula na qual os campos de cada registro estão disponíveis, nesse caso Produto, Quantidade Solicitada e Quantidade Disponível. O resultado da comparação determina se cada registro deve ser incluído no resultado da função:

Ao adicionar a este exemplo, podemos calcular quanto de cada produto pedir:

AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' )

Aqui, estamos adicionando uma coluna calculada ao resultado. AdicionarColunas tem seu próprio escopo de registro que ele usa para calcular a diferença entre o que foi solicitado e o que está disponível.

Por fim, podemos reduzir a tabela de resultados a apenas as colunas desejadas:

ShowColumns( AddColumns( Filter( Products, 'Quantity Requested' > 'Quantity Available' ), "Quantity To Order", 'Quantity Requested' - 'Quantity Available' ), "Product", "Quantity To Order" )

Observe que, nos itens acima, usamos aspas duplas (") em alguns lugares e aspas simples (') em outros lugares. Aspas simples são necessárias ao referenciar o valor de um objeto, como um campo ou uma tabela, em que o nome do objeto contém um espaço. Aspas duplas são usadas quando não estamos fazendo referência ao valor de um objeto, mas, apenas falando dele, especialmente em situações em que o objeto ainda não existe, como no caso de AdicionarColunas.

Desambiguidade

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 o padrão Tabela[@FieldName].
  • Para acessar valores globais, como fontes de dados, coleções e variáveis de contexto, use o padrão [@ObjectName] (sem uma designação de tabela).

Se a tabela que está sendo operada for uma expressão, como Filter( table, ... ), o operador de desambiguidade não poderá ser usado. Apenas o escopo interno do registro pode acessar os campos de expressão dessa tabela ao não utilizar o operador de desambiguidade.

Por exemplo, imagine ter uma coleção X:

Você pode criar essa coleção com ClearCollect( X, [1, 2] ).

E outra coleção Y:

Você pode criar essa coleção com ClearCollect( Y, ["A", "B"] ).

Além disso, defina uma variável de contexto chamada Valor com esta fórmula: UpdateContext( {Value: "!"} )

Vamos reunir tudo isso. Nesse contexto, a fórmula a seguir:

  • Ungroup( ForAll( X, ForAll( Y, Y[@Value] & Text( X[@Value] ) & [@Value] ) ), "Value" )

produz essa tabela:

O que está acontecendo aqui? A função ForAll mais externa define um escopo de registro para X, permitindo o acesso ao campo Valor de cada registro à medida que ele é processado. Para acessá-lo, basta usar a palavra Valor ou usar X [@Value].

A função ForAll mais interna define outro escopo de registro para Y. Como essa tabela também tem um campo Valor definido, usar Valor aqui faz referência ao campo no registro de Y e não mais ao de X. Aqui, para acessar em X o campo Valor, devemos usar a versão mais longa com o operador de desambiguidade.

Como Y é o escopo de registro interno, acessar campos dessa tabela não exige desambiguidade, permitindo que usemos esta fórmula com o mesmo resultado:

  • Ungroup( ForAll( X, ForAll( Y, Value & Text( X[@Value] ) & [@Value] ) ), "Value" )

Todos os escopos do registro ForAll substituem o escopo global. A variável de contexto Valor que definimos não está disponível por nome sem o operador de desambiguidade. Para acessar esse valor, devemos usar [@Value].

Ungroup nivela o resultado, uma vez que as funções ForAll aninhadas resultarão em uma tabela de resultados aninhados.

Sintaxe embutida

Registros

Você pode expressar registros usando chaves que contêm valores de campos nomeados. Por exemplo, você pode expressar o primeiro registro na tabela no início deste tópico usando esta fórmula:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

Também é possível inserir fórmulas dentro de outras fórmulas, como exibido neste exemplo:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

Você pode aninhar registros aninhando entre chaves, como demonstrado neste exemplo:

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Coloque cada nome de coluna que contém um caractere especial, como um espaço ou um vírgula, entre aspas simples. Para usar uma aspa simples em um nome de coluna, clique duas vezes nele.

Observe que o valor na coluna Preço não inclui o símbolo da moeda, como um sinal de cifrão. Essa formatação será aplicada quando o valor é exibido.

Tabelas

Você pode criar uma tabela usando a função Tabela e um conjunto de registros. Você pode expressar a tabela no início deste tópico usando esta fórmula:

Table( { Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
            { Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
            { Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } )

Você também pode aninhar tabelas:

Table( { Name: "Chocolate",
            'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
                        { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) } )

Tabelas de valor

Você pode criar tabelas de coluna única especificando valores entre colchetes. A tabela resultante tem uma única coluna, chamada Valor.

Por exemplo, [ 1, 2, 3, 4 ] é equivalente a Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) e retorna essa tabela: