Compreender tabelas e registos em aplicações de tela no Power Apps

No Power Apps pode criar uma aplicação de tela que acede a informações no Microsoft Excel, no SharePoint, no SQL Server e em várias outras origens que armazenam dados em tabelas e registos. Para trabalhar de forma mais eficaz com estes tipos de dados, reveja os conceitos subjacentes a estas estruturas.

  • Os registos contêm uma ou mais categorias de informações relativas a uma pessoa, local ou coisa. Por exemplo, podem conter o nome, o endereço de e-mail e o número de telefone de um cliente individual. Outras ferramentas referem-se aos registos como “linhas” ou “itens.”
  • As tabelas incluem um ou mais registos que contêm as mesmas categorias de informações. Por exemplo, podem conter os nomes, os endereços de e-mail e os números de telefone de 50 clientes.

Na sua aplicação, vai utilizar fórmulas para criar, atualizar e manipular os registos e as tabelas. Provavelmente, vai ler e escrever dados numa origem de dados externa, que é uma tabela expandida. Além disso, pode criar uma ou mais tabelas internas, que são chamadas coleções.

Pode criar várias fórmulas que assumem o nome de uma tabela como argumento, da mesma forma que uma fórmula do Excel assume uma ou mais referências de células como argumentos. Algumas fórmulas do Power Apps devolvem uma tabela que reflete os outros argumentos que especificar. Por exemplo, pode criar uma fórmula:

  • para atualizar um registo numa tabela ao especificar essa tabela como um de múltiplos argumentos para a função Patch.
  • para adicionar, remover e mudar o nome das colunas de uma tabela ao especificar essa tabela como argumento para as funções AddColumns, DropColumns ou RenameColumns. Nenhuma destas funções modificada a tabela original. Em vez disso, a função devolve outra tabela com base nos outros argumentos que especificar.

Elementos de uma tabela

Registos

Cada registo contém, pelo menos, uma categoria de informações para uma pessoa, local ou coisa. O exemplo acima mostra um registo para cada produto (Chocolate, Bread [Pão] e Water [Água]) e uma coluna para cada categoria de informações (Price [Preço], Quantity on Hand [Quantidade Disponível] e Quantity on Order [Quantidade Encomendada]).

Numa fórmula, pode referir-se a um registo por si só, fora do contexto de uma tabela, mediante a utilização de chavetas. Por exemplo, o registo { Name: "Strawberries", Price: 7.99 } não está associado a uma tabela. Tenha em atenção que os nomes de campo, tais como Name (Nome) e Price (Preço) nesse exemplo, não estão entre aspas.

Campos

Os campos são pedaços de informação individuais nos registos. Pode ver este tipo de campo como um valor numa coluna relativamente a registos específicos.

Tal como sucede com os controlos, para fazer referência a um campo de um registo, utiliza o . operador no registo. Por exemplo,, First(Products).Name devolve o campo Name (Nome) do primeiro registo na tabela Products (Produtos).

Os campos podem conter outro registo ou tabela, como mostra o exemplo da função GroupBy. Pode aninhar tantos níveis de registos e tabelas quanto pretenda.

Colunas

As colunas referem-se ao mesmo campo de um ou mais registos numa tabela. No exemplo anterior, 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, apresentadas horizontalmente na parte superior:

  • Nome
  • Preço
  • Quantidade Em Stock
  • Quantidade em Encomenda

O nome da coluna reflete os campos na mesma.

Todos os valores numa coluna são do mesmo tipo de dados. No exemplo acima, a coluna "Quantity on Hand" contém sempre um número e não pode conter uma cadeia, como “12 unidades”, relativamente a um registo. O valor de qualquer campo também pode ser vazio.

É possível que se tenha referido às colunas como “campos” noutras ferramentas.

Nota

Para origens de dados do SharePoint e do Excel que contenham nomes de colunas com espaços, o Power Apps substitui-os por "_x0020_". Por exemplo, o "Nome da Coluna" no SharePoint ou no Excel aparecerá como "Column_x0020_Name" no Power Apps, quando apresentado no esquema de dados ou utilizado uma fórmula.

Table

As tabelas incluem um ou mais registos, cada qual com vários campos que têm nomes consistentes em todos os registos.

Qualquer tabela que seja armazenada numa origem de dados ou numa coleção tem um nome, que é utilizado para fazer referência a essa tabela e para a transmitir às funções que assumem tabelas como argumentos. As tabelas também podem ser resultado de uma função ou de uma fórmula.

Tal como no exemplo seguinte, pode exprimir uma tabela numa fórmula através da função Table com um conjunto de registos, que são expressos em chavetas:

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

Também pode definir uma tabela de coluna única com parênteses retos. Uma forma equivalente de escrever o anterior:

[ "Strawberry", "Vanilla" ]

Fórmulas de tabela

No Excel e no Power Apps vai utilizar fórmulas para manipular os números e as cadeias de texto de formas semelhantes:

  • No Excel, escreva um valor, como 42, na célula A1, e, depois, escreva uma fórmula, como A1+2, noutra célula, para mostrar o valor de 44.
  • No Power Apps defina a propriedade Default de Slider1 como 42, e defina a propriedade Text de uma etiqueta como Slider1.Value + 2 para mostrar o valor de 44.

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

Da mesma forma, pode utilizar fórmulas para aceder e manipular dados em tabelas e registos. Pode utilizar os nomes das tabelas como argumentos em algumas fórmulas, tais como Min(Catalog, Price), para mostrar o valor mais baixo na coluna Prices da tabela Catalog (Catálogo). Outras fórmulas disponibilizam tabelas completas como valores de retorno, como RenameColumns(Catalog, "Price", "Cost"), que devolve todos os registos da tabela Catalog, mas altera o nome da coluna Price para Cost (Custo).

Tal como com os números, as fórmulas que envolvem tabelas e registos são recalculadas automaticamente à medida que a tabela ou o registo subjacente é alterado. Se o custo de um produto na tabela Catalog baixar para além do mínimo anterior, o valor de retorno da fórmula Min altera-se automaticamente para corresponder ao mesmo.

Vamos orientá-lo através de alguns exemplos.

  1. Crie uma aplicação em branco para um telemóvel e adicione um controlo Galeria vertical que contém outros controlos.

    Por predefinição, o ecrã mostra texto de marcador de posição de uma tabela com o nome CustomGallerySample. A propriedade Items do controlo Galeria do ecrã é definida automaticamente para essa tabela.

    Nota

    Alguns controlos foram reorganizados e aumentados, para fins ilustrativos.

  2. Em vez de definir a propriedade Items como o nome de uma tabela, defina-o como uma fórmula que inclui o nome da tabela como argumento, tal como neste exemplo:

    Sort(CustomGallerySample, SampleHeading, Descending)

    Esta fórmula incorpora a função Sort, que assume o nome de uma tabela como o primeiro argumento e o nome de uma coluna dessa tabela como o segundo argumento. A função também suporta um terceiro argumento opcional, que estipula que pretende ordenar os dados por ordem descendente.

  3. Defina a propriedade Items como uma fórmula que assume a fórmula do passo anterior como argumento e devolve uma tabela, tal como neste exemplo:

    FirstN(Sort(CustomGallerySample, SampleHeading, Descending), 2)

    Nesta fórmula, vai utilizar a função FirstN para mostrar um determinado número de registos numa tabela. Pode utilizar a função Sort como o primeiro argumento para FirstN e um número (neste caso, 2) como o segundo argumento, que especifica a quantidade de registos que vão ser mostrados.

    A fórmula completa devolve uma tabela que contém os dois primeiros registos da tabela CustomGallerySample, ordenada pela coluna SampleHeading por ordem descendente.

Funções de tabelas e propriedades de controlos

Considere a função Lower. Se a variável Bem-vindo contiver a cadeia de texto "Olá, mundo", a fórmula Lower (bem-vindo) retornará "Olá, mundo". Esta função não faz, de qualquer forma, alterar o valor nessa variável. Lower é uma função pura na qual só processa a entrada e produz a saída. Isto é tudo; não tem efeitos colaterais. Todas as funções no Excel e a maior parte das funções no Power Apps são funções puras, que permitem que a pasta de trabalho ou a aplicação seja recalculada automaticamente.

O Power Apps oferece um conjunto de funções que operam em tabelas do mesmo modo. Estas funções tomam tabelas como entrada e filtro, ordenar, transformar, reduzir e resumir tabelas de dados inteiras. Na verdade, Lower e muitas outras funções que normalmente levam um único valor também podem pegar numa tabela de coluna única como entrada.

  • Sort, Filter - ordena e filtra registos.
  • FirstN, LastN - devolve os N primeiros ou N últimos registos da tabela.
  • Abs, Sqrt, Round, RoundUp, RoundDown - operações aritméticas em cada registo de uma tabela de coluna única, resultando numa tabela de coluna única de resultados.
  • Left, Mid, Right, Replace, Substitute, Trim, Lower, Upper, Proper - manipulações de cadeias em cada registo de uma tabela de coluna única, resultando numa tabela de coluna única de cadeias.
  • Len - numa coluna de cadeias, devolve uma tabela de coluna única que contém o comprimento de cada cadeia.
  • Concatenate - concatena múltiplas colunas de cadeias, resultando numa tabela de coluna única de cadeias.
  • AddColumns, DropColumns, RenameColumns, ShowColumns - manipulações de colunas da tabela, resultando numa tabela nova com colunas diferentes.
  • Distinct - remove registos duplicados.
  • Shuffle - mistura os registos numa ordem aleatória.
  • HashTags - procura hashtags numa cadeia.
  • Errors - disponibiliza informações de erro quando trabalha com origens de dados.

Muitas destas funções assumem uma tabela de coluna única como entrada. Se uma tabela inteira tiver apenas uma coluna, pode especificá-la por nome. Se uma tabela tiver várias colunas, pode especificar uma dessas colunas utilizando a sintaxe Table. Column. Por exemplo, Products.Name devolve a tabela de coluna única dos valores de nome apenas da tabela Produtos.

Pode remodelar completamente uma tabela mas, no entanto, pretende utilizar as funções AddColumns, RenameColumns, ShowColumns ou DropColumns. Novamente, estas funções alteram apenas a sua saída, e não a respetiva origem.

As propriedades dos controlos também podem ser tabelas:

  • Items - aplica-se a galerias, caixas de listagens e caixas de combinação. Esta propriedade define a tabela que a galeria ou a lista mostra.
  • SelectedItems - aplica-se a caixas de listagens e caixas de combinação. Esta propriedade define a tabela de itens que o utilizador selecionou se SelectMultiple estiver ativado.

Fórmulas comportamentais

Outras funções foram especificamente concebidas para modificar dados e ter efeitos colaterais. Uma vez que estas funções não são puras, tem de as criar com atenção, e não podem participar na recálculo automático dos valores na aplicação. Pode utilizar estas funções apenas em fórmulas comportamentais.

  • Collect, Clear, ClearCollect - cria coleções, limpa-as e adiciona-lhes dados.
  • Patch - modifica um ou mais campos num registo.
  • Update, UpdateIf - atualiza registos que correspondem a um ou mais critérios que especificar.
  • Remove, RemoveIf - elimina registos que correspondem a um ou mais critérios que especificar.

Fórmulas de registos

Também pode criar uma fórmula que calcule dados para um registo individual, assume um registo individual como argumento e fornece um registo individual como valor de retorno. Regressando ao exemplo da galeria acima, vamos utilizar a propriedade Gallery1.Selected para apresentar informações do registo que o utilizador selecionar nessa galeria.

  1. Adicione um Botão e defina a respetiva propriedade OnSelect a esta fórmula:
    Collect( SelectedRecord, Gallery1.Selected )

  2. Mantendo premida a tecla Alt, selecione o botão.

  3. No menu File (Ficheiro), selecione Collections (Coleções).

Esta fórmula devolve um registo que inclui não apenas os dados do registo atualmente selecionado na galeria, mas também cada controlo na mesma. Por exemplo, o registo contém uma coluna SampleText, que corresponde à coluna SampleText na tabela original, e uma coluna Subtitle1, que representa a etiqueta que mostra os dados dessa coluna. Selecione o ícone de tabela na coluna Subtitle1 para explorar esses dados.

Nota

A coluna Subtitle1 poderá ser denominada Subtitle2 ou algo semelhante se tiver adicionado elementos diferentes dos especificados neste tópico.

Agora que selecionou o registo, pode extrair campos individuais a partir do mesmo com o operador . operador.

  1. Adicione o controlo Etiqueta e, em seguida, mova-o para baixo da galeria e do botão.

  2. Defina a propriedade Text da etiqueta para esta expressão:
    "Selected: " & Gallery1.Selected.SampleHeading

Utilizou a propriedade Selected, que é um registo, e extraiu a propriedade SampleHeading da mesma.

Também pode utilizar registos como contentores para fins gerais para valores nomeados relacionados.

  • Se criar uma fórmula à volta das funções UpdateContext e Navigate, utilize um registo para recolher as variáveis de contexto que pretende atualizar.
  • Utilize a propriedade Updates (Atualizações) num controlo de Editar formulário para recolher as alterações que o utilizador fez a um formulário.
  • Utilize a função Patch para atualizar uma origem de dados, mas também para intercalar registos.

Nestes casos, o registo nunca fez parte de uma tabela.

Funções de registos e propriedades de controlos

Funções que devolvem registos:

  • FirstN, LastN - devolve o primeiro ou último registo ou registos da tabela.
  • Lookup - devolve o primeiro registo de uma tabela que corresponde a um ou mais critérios.
  • Patch - atualiza uma origem de dados ou intercala registos.
  • Defaults - devolve os valores predefinidos para uma origem de dados.

Propriedades que devolvem registos:

  • Selected - aplica-se a caixas de galerias e de listagens. Devolve o registo atualmente selecionado.
  • Updates - aplica-se a galerias. Reúne todas as alterações que um utilizador faça num formulário de entrada de dados.
  • Update -aplica-se a controlos de entrada, como controlos de introdução de texto e controlos de deslize. Configura as propriedade individuais da galeria, para serem reunidas em conjunto.

Âmbito do registo

Algumas funções funcionam através da avaliação de uma fórmula em todos os registos de uma tabela individualmente. O resultado da fórmula é utilizado de várias formas:

  • AddColumns - a fórmula fornece o valor do campo adicionado.
  • Average, Max, Min, Sum, StdevP, VarP - a fórmula fornece o valor a ser agregado.
  • Filter, Lookup - a fórmula determina se o registo deve ser incluído na saída.
  • Concat - a fórmula determina as cadeias que vão ser concatenadas.
  • Distinct - a fórmula devolve um valor, que é utilizado para identificar registos duplicados.
  • ForAll - a fórmula pode devolver qualquer valor, potencialmente com efeitos secundários.
  • Sort - a fórmula fornece o valor pelo qual ordenar os registos.
  • With - a fórmula pode devolver qualquer valor, potencialmente com efeitos secundários.

Dentro destas fórmulas, pode referenciar os campos do registo que está a ser processado. Cada uma destas funções cria um “âmbito de registo” no qual a fórmula é avaliada e onde os campos do registo estão disponíveis como identificadores de nível superior. Também pode referenciar as propriedades de controlo e outros valores em toda a aplicação.

Por exemplo, vejamos a tabela Products (Produtos):

Para criar esta tabela de exemplo na aplicação, introduza um botão, defina a Propriedade OnSelect para esta fórmula e, em seguida, selecione o botão (clique no mesmo enquanto mantém a tecla Alt pressionada Power Apps Studio):

Set( Products,
    Table(
        { Product: "Widget",    'Quantity Requested': 6,  'Quantity Available': 3 },
        { Product: "Gadget",    'Quantity Requested': 10, 'Quantity Available': 20 },
        { Product: "Gizmo",     'Quantity Requested': 4,  'Quantity Available': 11 },
        { Product: "Apparatus", 'Quantity Requested': 7,  'Quantity Available': 6 }
    )
)

Para determinar se as encomendas de um destes produtos foram superiores à quantidade disponível:

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

O primeiro argumento para Filter é a tabela de registos na qual operar e o segundo é uma fórmula. Filter cria um âmbito de registo para avaliar esta fórmula na qual os campos de cada registo estão disponíveis, este caso Product, Quantity Requested e Quantity Available. O resultado da comparação determina se cada registo deve ser incluído no resultado da função:

Acrescentando a este exemplo, podemos calcular a quantidade que deve ser encomendada de cada produto:

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

Aqui, adicionámos uma coluna calculado ao resultado. AddColumns tem o seu próprio âmbito de registo que utiliza para calcular a diferença entre o que foi encomendado e o que está disponível.

Por fim, podemos reduzir a tabela de resultados para apenas as colunas que quisermos:

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

Tenha em atenção que no exemplo acima utilizámos aspas duplas (") em algumas partes e plicas (') noutras. As plicas são necessárias para fazer referência ao valor de um objeto, como um campo ou uma tabela, no qual o nome do objeto contém um espaço. As aspas duplas são utilizadas quando não estamos a fazer referência ao valor de um objeto, mas sim a falar sobre o mesmo, especialmente em situações nas quais esse objeto ainda não existe, como é o caso de AddColumns.

Desambiguação

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

Se a tabela que está a ser utilizada for uma expressão, como Filter( Table, ... ), não é possível utilizar o operador de desambiguação. Só o âmbito de registo mais interno pode aceder a campos destas expressão de tabela ao não utilizar o operador de desambiguação.

Por exemplo, imagine a coleção X:

Pode criar esta coleção com ClearCollect( X, [1, 2] ).

E outra coleção Y:

Pode criar esta coleção com ClearCollect( Y, ["A", "B"] ).

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

Vamos juntar tudo. Neste contexto, a fórmula seguinte:

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

produz esta tabela:

O que está a acontecer aqui? A função ForAll mais externa define um âmbito de registo para X, permitindo o acesso ao campo Value de cada registo à medida que é processado. Para aceder ao valor, basta utilizar a palavra Value ou usar X[@Value].

A função ForAll mais interna define outro escopo de registo para Y. Uma vez que esta tabela também tem um campo de valor definido, a utilização de um valor aqui refere-se ao campo no registo de Y e deixa de ser a de X. Aqui, para aceder campo de valor de X, tem de utilizar a versão mais longa com o operador de desambiguação.

Uma vez que Y é o âmbito de registo mais interno, aceder aos campos desta tabela não requer desambiguação, permitindo-nos utilizar esta fórmula com o mesmo resultado:

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

Todos os âmbitos de registo ForAll substituem o âmbito global. A variável de contexto Value que definimos não está disponível por nome sem o operador de desambiguação. Para aceder a este valor, utilize [@Value].

Ungroup uniformiza o resultado, porque as funções ForAll aninhadas resultam numa tabela de resultados aninhada.

Tabelas de coluna única

Para operar numa única coluna a partir de uma tabela, utilize a função Iscolumns como neste exemplo:

ShowColumns( Products, "Product" )

Esta fórmula produz esta tabela de coluna única:

Para uma alternativa mais curta, especifique Table.Column, que extrai a tabela de coluna única apenas da coluna a partir da tabela. Por exemplo, esta fórmula produz exatamente o mesmo resultado que a utilização de ShowColumns.

Products.Product

Registos Inline

Para expressar registos, são utilizadas chavetas que contêm valores de campo nomeados. Por exemplo, pode expressar o primeiro registo da tabela no início deste tópico com esta fórmula:

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

Também pode incorporar fórmulas dentro de outras fórmulas, como este exemplo mostra:

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

Pode aninhar registos ao aninhar as chavetas, como este exemplo mostra:

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

Coloque entre plicas o nome de cada coluna que contém um caráter especial, como espaço ou dois pontos. Para utilizar uma plica dentro de um nome de coluna, duplique-a.

Repare que o valor da coluna Price não inclui símbolo de moeda, como um cifrão. Esta formatação vai ser aplicada quando o valor for apresentado.

Tabelas inline

Pode criar uma tabela com a função Table e um conjunto de registos. Pode expressar a tabela no início deste tópico com 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 } 
)

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 inline

Pode especificar valores em parênteses retos para criar tabelas de coluna única. A tabela resultante tem uma única coluna, com o nome Value.

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

Nota

Pode indicar-nos as suas preferências no que se refere ao idioma da documentação? Responda a um breve inquérito. (tenha em atenção que o inquérito está em inglês)

O inquérito irá demorar cerca de sete minutos. Não são recolhidos dados pessoais (declaração de privacidade).