Formação
Módulo
Aprenda a criar uma fórmula básica que usa tabelas e registros em um aplicativo de tela do Power Apps.
Este browser já não é suportado.
Atualize para o Microsoft Edge para tirar partido das mais recentes funcionalidades, atualizações de segurança e de suporte técnico.
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.
No Microsoft Power Fx, pode escrever uma fórmula que acede a informações no Microsoft Excel, SharePoint, SQL Server e várias outras origens que armazenam dados em registos e tabelas. Para trabalhar de forma mais eficaz com estes tipos de dados, reveja os conceitos subjacentes a estas estruturas.
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 Fx devolvem uma tabela que reflete os outros argumentos que especificar. Por exemplo, pode criar uma fórmula:
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.
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.
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:
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.
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" ]
No Excel e no Power Fx vai utilizar fórmulas para manipular os números e as cadeias de texto de formas semelhantes:
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.
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. Inferior é uma função pura na medida em que apenas 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 Fx são funções puras, que permitem que a pasta de trabalho ou a aplicação seja recalculada automaticamente.
O Power Fx 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.
Muitas funções pegam numa tabela de coluna única como a 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.
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.
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:
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, pegue numa tabela de Produtos colocada numa variável global:
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. O filtro cria um escopo de registro para avaliar essa fórmula no qual os campos de cada registro estão disponíveis, neste caso Produto, Quantidade solicitada e Quantidade disponível. 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 seu próprio escopo de registro que 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 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.
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:
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].
Desagrupar nivela o resultado porque as funções ForAll aninhadas resultam em uma tabela de resultados aninhada.
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
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.
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 } )
}
)
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:
Formação
Módulo
Aprenda a criar uma fórmula básica que usa tabelas e registros em um aplicativo de tela do Power Apps.