Skip to main content
27 novembro 2023
Follow Us

Queries DAX para Power Automate: como preencher documentos Word com dados do Power BI

Por vezes, é necessário redigir um relatório sob o formato de texto, em Word, por exemplo, que contém dados referentes a um determinado indicador. O processo mais comum é redigir o texto separadamente dos valores numéricos, preenchendo-se os dados manualmente, ou através de “copy-paste” no documento. Não seria ótimo se nos ligássemos a um conjunto de dados do Power BI e inseríssemos os valores diretamente num documento? É o que veremos neste post.

Modelo de dados semântico do Power BI

O primeiro requisito é dispor de um conjunto de dado do Power BI, agora denominado de modelo de dados semântico. Para este exemplo, vamos usar a demo “Competitive Marketing Analysis Report”:

queries0

O relatório contém várias páginas e nelas podemos ver que existem diversos indicadores interessantes, como vendas, unidades vendidas, margens, preços, assim como outros não financeiros, como o score de sentimento dos clientes.

O modelo de dados é um “star schema” com duas tabelas transacionais: a Sentiment e a SalesFact:

queries1

O template Word

Para combinarmos o texto com os dados deste modelo semântico, precisamos de um “template”, um modelo em Word que terá uma base fixa, redigida em texto, e alguns “placeholders” onde guardaremos os dados do Power BI.

Este processo consiste em criar um novo documento Word e definir em que partes do texto pretendemos inserir os dados numéricos. É um processo algo aborrecido porque tem uma série de detalhes que podem fazer todas a diferença:

  • Primeiro, será necessário ativar-se o menu “Developer” do Microsoft Word, nas opções do Word
  • Nesse menu vamos inserir um objeto “Plain Text Content Control”, que se encontra no grupo “Controls”
  • Esse objeto será colocado algures no meio do texto que estamos a redigir, como nos interessar.

Por exemplo, ao redigir o Relatório e Contas da Empresa “DemoAutomation”, teríamos o seguinte parágrafo inicial:

queries2

O placeholder “vendas” figura mesmo antes da vírgula e é onde os dados serão colocados. Na definição das propriedades do mesmo, podemos verificar a “tag” que será reconhecida no Power Automate:

queries3

Depois de completado primeiro parágrafo, poderíamos chegar a algo do género:

queries4

O documento Word ficará guardado num document folder do SharePoint, por exemplo, “Templates Word para Power Automate”, e vamos preencher as tags a partir de um Power Automate.

Criação de um fluxo de automação de teste

No Power Automate, vamos criar um fluxo com um trigger manual e acrescentar uma ação do tipo “Populate  a Microsoft Word Template”:

queries5

Os três primeiros campos são simplesmente a identificação do documento Word utilizado como template, e os restantes são as tags nele criadas com os dados a inserir.

Executando este flow, veremos que corre sem erros, mas que o template Word permanece inalterado. Isto acontece porque o template é suposto ser apenas usado como tal e se pretendemos um documento preenchido, teremos de criar um novo ficheiro Word estático com os valores das tags preenchidas.

Assim, termos de acrescentar uma nova ação no Power Automate:

queries6

Os dois primeiros argumentos deste step são respetivamente a localização do site SharePoint e o diretório onde será criado o ficheiro. O terceiro, o nome do ficheiro a criar e o último será o conteúdo do step anterior.

Correndo este fluxo, vejamos os resultados:

queries6b

Aparentemente, o ficheiro foi preenchido corretamente, e colocado no document folder pretendido. Abrindo-o, podemos ver o seguinte:

queries7

Pesquisar os dados no modelo de dados semântico do Power BI

Claro que não queremos preencher os dados manualmente, mas sim a partir do dataset do Power BI. O primeiro passo consiste em publicá-lo no Power BI Service, para que possa ser pesquisável a partir do Power Automate.

Deste modo, vamos dar um passo atrás e começar o nosso fluxo por executar uma pesquisa no modelo de dados semântico. O primeiro passo, logo após o trigger, será “Run query against a dataset”:

queries8

As duas primeiras caixas contêm, respetivamente, a workspace onde está guardardo o dataset, e a segunda, o próprio dataset. A parte mais difícil é redigir a DAX que pretendemos obter do Power BI.

Para nos ajudar a resolver este problema, podemos voltar ao Power BI Desktop e acrescentar uma página onde visualizamos os dados a importar.

Por exemplo, a página para o ano de 2013, poderia conter as seguintes visualizações:

queries9

Nela, temos um slicer, no topo, a selecionar o ano, e três cartões, onde a DAX é definida da seguinte forma:

  • Sales $:
    = SUM([Revenue])
  • SalesGrowthRate:
    = DIVIDE([Sales $], CALCULATE([Sales $], SAMEPERIODLASTYEAR('Date'[Date]))) - 1
  • Crescimento:
    = IF([SalesGrowthRate] >= 0, "Crescimento", "Decrescimento")

Para obtermos a query a enviar para o Power Automate, podemos ativar o “Performance Analyzer” do Power BI Desktop, a partir do friso superior:

queries10

Antes de utilizarmos o Performance Analyzer, vamos mudar a página do relatório para forçar o “refresh” das visualizações. O Performance Analyzer permite gravar todas as interações do utilizador com o relatório e, quando mudamos de página, recria todas as visualizações.

Depois de abrir outra página, vamos ativar no painel do lado direito, a gravação das ações do utilizador, a partir do botão “Start recording”:

queries11

Quando voltamos à página que contém os indicadores que nos interessa, verificamos que este painel contém agora uma série de detalhes sobre cada um dos elementos visuais:

queries12

Vamos clicar em “Stop” para parar a gravação do Performance Analyzer e abrir o primeiro cartão:

queries13

Como vemos, ele diz respeito ao indicador “Crescimento”. Do lado direito do Performance Analyzer é possível verificar a duração em milissegundos que demorou a ser produzido. A parte que nos interessa mais é a que está no link “Copy query”. Vamos clicar nesse link e a sintaxe da DAX é copiada para a memória da nossa máquina.

Se a colarmos num bloco de notas, temos:

// DAX Query

DEFINE VAR __DS0FilterTable =

                TREATAS({2014}, 'LocalDateTable_a1cd3d03-2df1-466a-bea5-79b9463a9397'[Year])

EVALUATE

                SUMMARIZECOLUMNS(__DS0FilterTable, "Crescimento", IGNORE('Medidas'[Crescimento]))

Esta é a DAX que podemos introduzir no passo “Run a query against a dataset” no Power Automate:

queries14

Se procedermos da mesma forma para os outros indicadores, teremos as seguintes expressões DAX:

Sales $:

// DAX Query

DEFINE VAR __DS0FilterTable =

                TREATAS({2014}, 'LocalDateTable_a1cd3d03-2df1-466a-bea5-79b9463a9397'[Year])

EVALUATE

                SUMMARIZECOLUMNS(__DS0FilterTable, "Sales__", IGNORE('SalesFact'[Sales $]))

SalesGrowthRate:

// DAX Query

DEFINE VAR __DS0FilterTable =

                TREATAS({2014}, 'LocalDateTable_a1cd3d03-2df1-466a-bea5-79b9463a9397'[Year])

EVALUATE

                SUMMARIZECOLUMNS(__DS0FilterTable, "SalesGrowthRate", IGNORE('Medidas'[SalesGrowthRate]))

E o flow estaria agora assim:

queries15  

queries16

Os resultados são devolvidos pelo Power BI sem formatação, o que para a redação do Relatório e Contas não serve. Assim, vamos acrescentar os seguintes steps para formatar os dados em texto, valor percentual e divisa.

Comecemos por inicializar variáveis para guardar os resultados:

queries17

A definição da variável “Crescimento” em formato de texto normal pode ser feita com os seguintes steps:

queries18

A expressão dentro do step “Append to string variable” é a seguinte:

items('Apply_to_each')?['[Crescimento]']

Note-se que este step está dentro de um loop “Apply to each”, pois o resultado da query ao dataset Power BI é uma tabela (array) que pode conter uma ou várias linhas. Para o caso é indiferente, pois estamos à procura de um valor único (escalar).

No entanto, no caso das restantes variáveis, temos de ter algum cuidado com a formatação. E para estes casos, uma ação “Compose” adicional será útil para nos ajudar.

No caso da variável Sales, temos:

queries19

Sendo a expressão no step “Increment variable” a seguinte:

items('Apply_to_each_2')?['[Sales__]']

Como referido, neste caso, vamos acrescentar uma ação “Compose” para formatar o valor numérico. Note-se que a formatação de dados no Power Automate é um pouco difícil e a ação “Format data by examples” ajuda a ultrapassar as principais barreiras:

queries20

Como podemos ver acima, fornecendo alguns exemplos ao algoritmo, é possível obter a expressão desejada no passo seguinte:

queries21

A última variável poderá ser tratada de forma semelhante:

queries22

A expressão na ação “Append to string variable 2” é a seguinte:

items('Apply_to_each_3')?['[SalesGrowthRate]']

E a formatação atavés de exemplos, poderia ser feita da seguinte forma:

queries23

Tal como no caso da variável anterior, vamos acrescentar uma ação “Compose” para lidar com a variável “SalesGrowth”:

queries24

Finalmente, para terminarmos esta demonstração, voltaríamos à ação “Populate a Microsoft Template” e substituiríamos os valores dos dados introduzidos manualmente para os resultados de cada ação “Compose”:

queries25

E como seria de esperar, quando voltamos ao nosso Relatório e Contas já devidamente preenchido, os dados figuram no documento Word com os resultados provenientes do Power BI:

queries26

Claro que poderíamos remover as caixas à volta de cada uma das tags e apresentar o relatório com exatamente o mesmo formato de um texto redigido manualmente.

Sabendo um pouco de DAX, muitas outras possibilidades se abririam: por exemplo, como faríamos para obter os valores dos mesmos indicadores para um ano diferente? Como deixar o utilizador escolher o ano para o qual deseja ver os resultados?

Assine a nossa newsletter e receba o nosso conteúdo diretamente no seu email