Neste artigo vou mostrar-te como podes corrigir um dos erros mais comuns em consultas (Queries) quando importas os teus dados para Microsoft Excel ou Power BI. Tradicionalmente no processo de importação de dados e quando utilizamos o Power Query, existem alguns passos criados automaticamente pela consulta, sendo que um deles, por ser explicito, causa problemas na consulta assim que mudamos alguma coisa na estrutura inicial dos dados, como por exemplo o nome de uma coluna, é isso que vamos analisar no artigo.
Começar por importar os dados para Excel
Vamos começar por importar os dados para o Microsoft Excel, mas se estiveres a usar Power BI a lógica é exatamente a mesma.

Escolhemos o ficheiro a importar…

Definimos a folha de cálculo que pretendemos exportar do ficheiro de Excel…

E temos a nossa consulta dentro do Power Query. Se fecharmos a consulta temos a tabela importada, sem transformações aplicadas de momento, uma vez que o nosso objetivo pode ser apenas importar a mesma sem realizar nenhuma transformação.
Contudo, se repararmos nos passos da consulta, foram criados alguns passos sem termos de fazer “nada”.
Destes passos existe um em especial – Tipo Alterado (Change Type) que deteta automaticamente para cada coluna da tabela o tipo de dados da mesma.

Neste cenário, quando é alterado algum detalhe numa das colunas de origem, como por exemplo o nome, ou mesmo caso seja adicionada alguma nova coluna, ou removida, diretamente na origem a consulta quebra automaticamente, uma vez que este passo. Tipo Alterado, procura os nomes das colunas explicitamente e caso não existam, dá erro!
No código é possível ver o que está a ser feito no passo pela consulta:
= Table.TransformColumnTypes(
Cabeçalhos,
{
{“Nome”, type text},
{“Departamento”, type text},
{“Data”, type date},
{“Vencimento”, Int64.Type},
{“Idade”, Int64.Type}
}
)
O nome de cada campo é colocado explicitamente e o seu tipo de dados é colocado também. Para melhor percepção do código, alterei o passo anterior de “Cabeçalhos Promovidos” apenas para “Cabeçalhos”.
Para podermos ver o exemplo em código, vamos aceder ao Editor Avançado [Advanced Editor].

Detetar os nomes das colunas
Para começarmos a tornar o processo mais dinâmico, vamos adicionar um novo passo na consulta, que permite recolher os nomes das colunas da consulta.
NomesColunas = Table.ColumnNames(Cabeçalhos)
No resultado do passo aplicado podemos ver uma lista com os nomes dos campos de cada uma coluna. Estes dados estão apresentados sobre a forma de uma Lista!

Identificar o tipo de dados da primeira linha da tabela
Este passo, é apenas um exemplo de um dos métodos que podem ser utilizados. Neste caso vamos perceber qual o valor que tem a primeira linha da tabela em cada coluna, para deste modo podermos indicar à consulta qual o tipo de dados que pretendemos para cada uma delas.
Para chegarmos a esse passo primeiro vamos obter a primeira linha da tabela:
= Table.FirstN(Cabecalhos, 1)

De seguida, vamos definir mais um passo, na continuação do anterior, para podermos obter uma lista de listas! Vamos verificar cada uma das colunas da tabela, que neste momento contem apenas 1 linha e o respetivo cabeçalho e para cada uma das colunas, vamos gerar uma lista que contem 2 valores (1 – o nome da coluna e 2 – o tipo de dados da coluna).
= Table.TransformColumns (PrimeiraLinha, List.Transform(NomesColunas, each {_, each Value.Type(_)}))

Desta forma conseguimos converter cada coluna (Table.TransformColumns) no seu tipo de dados. A expressão each _tem este propósito, de iterar cada elemento no contexto da fórmula, neste caso o contexto é cada coluna da tabela. A parte do código each Value.Type(_) permite identificar o tipo de dados de cada coluna.
Finalizar o processo – Precisamos de uma Lista!
Para finalizar o processo precisamos de uma lista. Se reparares no código inicial, o passo (Tipo Alterado) precisa de uma lista de valores. Mais especificamente uma lista de listas.
{ // Lista
{“Nome”, type text}, // Sub Lista
{“Departamento”, type text}, // Sub Lista
{“Data”, type date},
{“Vencimento”, Int64.Type},
{“Idade”, Int64.Type}
}
Neste momento temos uma tabela como resultado (output) e precisamos de uma lista. Para chegarmos a este resultado vamos converter a tabela numa lista.
Table.ToColumns (Table.DemoteHeaders(DetetarDadosColuna))
Este passo permite em primeiro lugar, converter uma tabela em coluna (Lista). Contudo na expressão podemos reparar na função Table.DemoteHeaders que permite, despromover o cabeçalho da tabela, e assim obtemos uma lista com 2 valores em cada linha (sub-lista). Os 2 valores são:
- Nome do campo
- Tipo de dados do campo

A tabela com o Output final será a tabela com os campos identificados de uma forma dinâmica. Neste caso o processo inicial utiliza a expressão Table.TransformColumnTypes o qual vamos repeti-lo, mas agora conseguindo detetar os campos da tabela e o seu tipo de dados de forma dinâmica.
Table.TransformColumnTypes(Cabecalhos, MostrarColunasComDados_EmLista)


Leave a Reply