DEV Community

loading...
Cover image for Carga de api paginada para powerbi com logic app e storage account - exemplo omie

Carga de api paginada para powerbi com logic app e storage account - exemplo omie

Lucas Silvério
dotnetcore + angular + dachshund
・8 min read

Oi Pessoal!

Ao pesquisar sobre como consumir api's páginadas no powerbi encontrei alguns exemplos que utilizam a linguagem M, como no vídeo do colega Raphael Pacheco.

Esse post é uma alternativa a solução direta no powerbi utilizando M.

Minha motivação é diminuir a carga cognitiva do processo, visto que não sou um especialista em powerbi e não conheço muito M. Vamos isolar o powerbi apenas como a camada de montagem de painéis. Toda a lógica de integração fica em uma outra camada (logic app), os dados prontos para consumo ficam no storage account e disponibilizado através de uma url.

É provável que seja possível fazer o mesmo processo com o Power Automate.

Arquitetura

post-integracao-logic-app-omie

Vou focar na camada central que é a extração e preparação de dados, e partir do pressuposto que você já tenha algum conhecimento prévio em API's e Powerbi.

Recursos

Fonte Bruta - Api da Omie

Faça o download do postman.
Entre no site da omie e faça o cadastro.
Vamos usar a api de lista de produtos para esse exemplo.

Por algum motivo não conseguimos fazer a requisição conforme é apresentado na tela.
Ao inspecionar a requisição (aperte F12 no navegador), é possível ver que a requisição tem um parâmetro a mais, url, e temos que incluir esse para parâmetro para reproduzir em nossa aplicação.

omie-request

Preencha a requisição no postman conforme as imagens abaixo:

postman-request

params-request

A parte da resposta que contém a lista de produtos está em "response"
postman-response

Por hora é isso, depois voltamos aqui.

Storage Account | Container - Azure

Vá até o portal do azure e crie um novo grupo de recursos.
Recomendo que você siga os nomes que vou atribuir aos recursos, ao menos pra esse tutorial.
Crie todos recursos desse tutorial dentro desse grupo de recursos.

new-gr
gr-name

Agora vamos criar um storage account.

add-rsrc

select-st-acc

Nessa estapa substitua o conteúdo de Storage account name
de nomeomie por {seunome}omie, pra evitar conflitos com a url.
config-st

created-rsrc

create-container

Nessa etapa eu dei o nome de container de 'fonte-preparada' e configurei a camada de acesso como pública, para focarmos no processo de integração, mas em produção fique atento nas questões de segurança.
create-container

Nosso container para receber os dados está pronto.

Logic App

Volte até o grupo de recursos OMIE e clique novamente para adicionar um novo recurso.
Repare que o nosso storage já se encontra listado.

create-logic-app

create-logic-app2

extracao-produtos

go-to-rsrc

BlankLogicApp

Recorrência

Na tela de designer, vamos definir a primeira etapa que é como esse procedimento será iniciado. Vamos escolher o método de recorrência e definir que ele seja repetido de 5 em 5 minutos. Estou definindo esse intervalo curto, pra podermos analisar os resultados em uma janela menor de tempo, mas faça como fizer sentido para você.

schedule-search

schedule-recurrency

schedule-frequency

Dados da paginação

A próxima etapa é obter os dados da paginação de forma dinâmica. Para isso vamos fazer uma requisição a api, reservar os dados da página atual e total de páginas e desprezar o restante das respostas.

Esses são os dados que vamos reservar.

data-page

No nosso designer acrescente na sequencia uma etapa do tipo HTTP.

step-http-page

action-http-page

Configure essa etapa conforme fizemos no postman e a renomeie para "ObterDadosDaPagina", importante dizer o que estamos fazendo.

obter-dados-da-pagina-http

Propriedades da paginação

A próxima etapa é mapear a resposta da api, para que possamos usar suas propriedades como variáveis nas etapas a seguir.

Para isso vamos utilizar o método Parse Json.

data-operations

parse-json

Em content vamos utilizar o output Body da etapa anterior, que é o corpo da resposta da api.

content-parse-json

Em Schema, clique em "Use sample payload to generate schema".

use-sample-payload

Agora copie e cole a reposta do postman na janela que vai abrir.
copy-response

past-payload

Esse procedimento vai auto mapear os nomes e tipos das propriedades da resposta.

Renomeie essa etapa como PropriedadesDaPagina

propriedades-da-pagina-rename

Variáveis

Na próxima etapa vamos definir as variáveis que vamos utilizar para as próximos métodos.

Produtos

Essa variável é do tipos lista e será iniciada como vazia, ela será responsável por armazenar as respostas das requisições.

Para isso vamos utilizar o método Variables.

variables

produtos

Página

Agora vamos declarar a variável Pagina que será responsável por armazenar o número da página a ser requisitada.

Dessa vez vamos iniciar essa variável com o valor da propriedade pagina, obtida no output do método PropriedadesDaPagina.
pagina-dynamic

Total de páginas

Vamos declarar a variável TotalDePaginas que será responsável por armazenar o número total de páginas a serem requisitadas.

Vamos iniciar essa variável com o valor da propriedade total_de_paginas, obtida no output do método PropriedadesDaPagina.
total-de-paginas

Recursão

Nessa etapa vamos declarar um método de recursão. A lógica aqui é fazer a requisição da página X, armazenar a resposta na variável produto, e repetir esse processo na página X + 1 até que o número total de páginas tenha sido requisitado.

Para isso vamos utilizar o método Until.

control

until

A lógica utilizada nesse laço de repetição é executar as tarefas a seguir até que o Total de páginas for menor que o valor da página.

logic-until

Obter Produtos

Agora sim vamos fazer a requisição onde vamos o obter os valores para alimentar nossa resposta.

Dentro do laço vamos adicionar novamente o método HTTP, e configurá-lo quase igual a primeira vez que o fizemos. Porém dessa vez no body da requisição vamos substituir o valor da página que até então era 1 para o valor da variável página.

ObterProdutos

Propriedades Do Produto

Na sequência vamos executar novamente o método Parse Json para analisar a resposta da requisição feita na etapa anterior.

propriedades-do-produto

Em Schema, clique em "Use sample payload to generate schema" e vamos copiar e colar a reposta do postman na janela que vai abrir.
Esse procedimento vai auto mapear os nomes e tipos das propriedades da resposta. Porém dessa vez teremos que fazer uma alteração no mapeamento.

As propriedades peso_bruto e peso_liq tem que ter seu type substituído de integer para um array de tipos:

peso_bruto

peso_liq

Isso deve ser feito sempre que um campo pode obter valores inteiros ou decimais.

Preencher Produtos

A próxima etapa é preencher a variável produtos com o valor da propriedade response anteriormente mapeada pelo método Propriedades do produto.

Para isso vamos utilizar o método Append to array variable.

append-to-array-variable

pre-append-to-array-variable

preencher-produtos

Incrementar Página

Agora pra finalizar o laço vamos incrementar a variável página, fazendo com o que o seu valor seja X + 1.

Para isso vamos utilizar o método Increment Variable.

pre-increment-variable

increment-pagina

Criar arquivo

Agora vamos criar a última etapa dentro do logic app que é enviar a resposta como um arquivo no formato json para dentro do container no storage account.

Para isso vamos utilizar o método Create blob.

blob

create-blob

A primeira parte é criar uma conexão com o storage.

create-connection

A segunda parte é configurar o blob, informar em qual container ele será salvo, seu nome seguido da extensão e o seu conteúdo. Infelizmente o Dynamic content não reconhece a variável Produtos como um valor elegível para o campo content, de forma que temos que incluí-la com uma expressão:

create-product

Ao final o processo terá o visual abaixo, após salvar vamos executar e ver o resultado.
final

Depois de executar, se tudo der certo o resultado será esse:
success

Confira indo até o storage account.

product-storage

Agora você pode obter o link e abrir no powerbi.

copy-link
power-json
open-json
para-a-tabela
produtos-power
fim

Algumas considerações.

Esse post segue o caminho feliz.
Não foi analisado escala.
Não foi considerado segurança.
Não foi utilizado tratamento de erros.
Não foi considerado cargas incrementais, de forma que o arquivo é sempre substituído como o todo.

Espero que isso te ajude!

Discussion (1)

Collapse
marco_bueno profile image
Marco Bueno

Olá Lucas, agradeço pelo tutorial aqui funcionou perfeitamente, agora preciso fazer melhorias de incluir os movimentos de contas a pagar e receber e colocar mais de um aplicativo do OMIE em minha consulta!