Tabular Editor: Tutorial Completo com Cases para Ganhar Agilidade

Leonardo Karpinski

Leonardo Karpinski

Mestre do Power BI, criador do Curso Express de Power BI e Curso Completo de Power BI. Formou mais de 16 mil alunos nos últimos anos e participou de projetos em grandes empresas nacionais e multinacionais.

E aí, tudo bem com você!?

Hoje falarei sobre como ganhar agilidade utilizando o Tabular Editor junto com o Power BI.

Antes de começar, vou te passar o link onde deixo as melhores lives do canal para você maratonar:

– Playlist com lives antigas: https://powerbiexperience.com/pt/playlist-lives-semanais/

Tabular Editor

O Tabular Editor é Editor Offline de Modelos Tabulares para Power BI e Analysis Services.

Com essa ferramenta você pode manipular medidas, colunas calculadas, pastas, perspectivas e traduções.

Documentação:
https://docs.tabulareditor.com/

Instalação: https://github.com/otykier/TabularEditor/releases/tag/2.15.2

Vamos aos Cases!


Copiar medidas entre 2 modelos        

Após instalar o Tabular Editor, você precisará acessar o menu Ferramentas Externas e clicar em Tabular Editor do arquivo .pbix de origem e de destino (onde colaremos as medidas).

Figura1: Tabular Editor no Power BI

Agora basta você selecionar todas as medidas que você você quer copiar e colar no .pbix de destino:

Figura 2: Copiando e colando medidas

Vê se não esquece de clicar em Salvar na janela onde você colou as medidas, hein!

Figura 3: Salvando alterações no Tabular Editor

Dica:
Sempre tenha um backup do arquivo .PBIX que estiver trabalhando porque se quebrar o modelo você consegue recuperar alguma coisa.

Bora para a próxima aplicação!

Cria uma medida de soma para cada coluna

Basicamente vamos utilizar esse código em C#. Copie ele e cole em Advanced Scripting.

foreach(var c in Selected.Columns)
{
    var newMeasure = c.Table.AddMeasure(
        "Soma de " + c.Name, // Name
        "SUM(" + c.DaxObjectFullName + ")",// DAX expression
        c.DisplayFolder  // Display Folder
    );
    
    // Set the format string on the new measure:
    newMeasure.FormatString = "0.00";

    // Provide some documentation:
    newMeasure.Description = "This measure is the sum of column " + c.DaxObjectFullName;

    // Hide the base column:
    c.IsHidden = true;
}

Repare que no final do código tem um “cIsHidden = true”. Isso faz com que a coluna que você tiver utilizando para criar a medida de Soma fique oculta no arquivo PBIX. Isso evita que você a utilize sem querer no seu modelo. Se precisar que ela apareça, basta ir no arquivo PBIX e exibi-la novamente.

Figura 4: Colando código C#

Agora que já colou o código no Advanced Scripting, vem a mágica! Selecione na esquerda com a tecla “CTRL” ativada todas as colunas que você precisa ter uma medida de soma associada e em seguida clique em RUN. Veja o o resultado abaixo:

Figura 5: Gerando medidas de soma com o Tabular Editor

Incrível, né?!

Formatar medidas

Imagine que você tenha criado as medidas com pressa e escreveu de qualquer jeito, sem usar as boas práticas de identação e quebra de linhas por exemplo.

Tem um jeito de consertar isso de uma vez só!

Vamos ao exemplo! Veja a medida bagunçada:

Figura 6: Medida antes

Volte no Tabular Editor, cole o código abaixo em Advanced Scripting e clique em RUN (não esqueça de salvar também):

Model.AllMeasures.FormatDax();
Figura 7: Script para organizar medida

Veja como ficou! ?

Figura 8: Medidas após rodar o Scrip

Está gostando?! Bora continuar!

Incluir fórmula na descrição de medidas

Neste exemplo vamos rodar um script para colocar na descrição das medidas a sua própria fórmula.

Para isso, basta copiar o código a seguir, colar em Advanced Scripting e rodar:

foreach (var m in Model.AllMeasures) {
m.Description = m.Expression;
}

Veja o resultado:

Figura 9: Descrição das medidas automática

Essa funcionalidade é especialmente útil quando você está criando um relatório em cima de um Conjunto de dados. É que ao importar um Conjunto de dados as medidas ficam disponíveis para você utilizá-las nos no seu modelo mas não aparece o código de cada uma delas não. Com esse truque você vai conseguir conseguir ver a fórmula de cada uma delas porque elas estarão na descrição!

Mover colunas para uma pasta específica

Nós sempre criamos uma pasta chamada “Medidas” para deixá-las num lugar fácil de acharmos, certo?! Mas existe também a opção de movermos todas as colunas de cada tabela para uma Pasta. Assim, somente as medidas ficarão fora dessa pasta.

Nesse caso vamos chamar essa pasta de “_Colunas”. Mesmo esquema agora: copie o código abaixo, cole no Advanced Scripting.

foreach (var c in Model.AllColumns) {
c.DisplayFolder = "_Colunas";
}

Agora basta clicar em RUN e Salvar para refletir as mudanças no arquivo PBIX!

Figura 10: Criando Pasta e movendo colunas

Olha como ficou:

Figura 11: Criando Pasta e movendo colunas

Próximo case!

Esconder colunas utilizadas em relacionamentos

Uma boa prática é ocultar as colunas da tabela fato utilizadas em relacionamentos.

O código que faz isso é esse:

foreach (var r in Model.Relationships) {
r.FromColumn.IsHidden = true;
}

Adivinha o que precisa fazer agora?! Copiar, colar, rodar e salvar!

Figura 12: Rodando script

Resultado com as colunas ocultas:

Figura 13: Resultado do script que oculta colunas

Mostrar Filtros aplicados

Muitas vezes o usuário do seu relatório não conhece com funciona o Power BI e você precisa mostrar os filtros aplicados nos visuais. O código abaixo faz isso.

Copie esse código aqui embaixo e cole no Advanced Scripting do Tabular Editor:

var dax = "VAR MaxFilters = 3 RETURN ";
var dumpFilterDax = @"IF (
ISFILTERED ( {0} ),
VAR ___f = FILTERS ( {0} )
VAR ___r = COUNTROWS ( ___f )
VAR ___t = TOPN ( MaxFilters, ___f, {0} )
VAR ___d = CONCATENATEX ( ___t, {0}, "", "" )
VAR ___x = ""{0} = "" & ___d
& IF(___r > MaxFilters, "", … ["" & ___r & "" items selected]"") & "" ""
RETURN ___x & UNICHAR(13) & UNICHAR(10)
)";
// Loop through all columns of the model to construct the complete DAX expression:
bool first = true;
foreach(var column in Model.AllColumns)
{
if(!first) dax += " & ";
dax += string.Format(dumpFilterDax, column.DaxObjectFullName);
if(first) first = false;
}
// Add the measure to the currently selected table:
Selected.Table.AddMeasure("DumpFilters", dax);


Selecione uma tabela e rode o script:

Figura 14: DumpFilters


Lá no Power BI você precisará colocar a medida que acabamos de criar no Tabular Editor (DumpFilters) como Tooltip do Visual, veja:

Figura 15: Resultado do DumpFilters

Dica:
Para ver outros exemplos, dê uma olhada aqui.


Calculation Groups


Chega de criar medidas que são exatamente iguais e só mudam o primeiro argumento! Retrabalho nunca mais! Vamos aos exemplos práticos!

Medidas de inteligência de tempo

Vá no Tabular Editor, em Tables, e siga os passos abaixo:

Figura 16: Criando grupos de medidas


Criaremos quatro Calculation Items com nomes: Atual, PY, YoY e YoY %.

Em cada item você precisará inserir a medida abaixo no Expression Editor do Tabular Editor:

  • Atual: é o valor atual da medida
SELECTEDMEASURE()

  • PY: é o ano anterior daquela medida
CALCULATE ( 
    SELECTEDMEASURE(), 
    SAMEPERIODLASTYEAR ( Data[DataID] ) 
)

  • YoY: representa diferença entre ano atual e o ano anterior
VAR vCurrent = SELECTEDMEASURE()
VAR vPY = 
CALCULATE ( 
    SELECTEDMEASURE(), 
    SAMEPERIODLASTYEAR ( Data[DataID] ) 
)
VAR vResult =
    IF ( vPY && vCurrent, vCurrent - vPY )
RETURN
    vResult

  • YoY %: representa a variação percentual do ano atual sobre o ano anterior
VAR vCurrent = SELECTEDMEASURE()
VAR vPY = 
CALCULATE ( 
    SELECTEDMEASURE(), 
    SAMEPERIODLASTYEAR ( Data[DataID] ) 
)
VAR vYoY =
    IF ( vPY && vCurrent, vCurrent - vPY )
RETURN
    DIVIDE(
        vYoY,
        vPY
    )


Após salvar, volte no Power BI Desktop e veja como iremos utilizar esse grupo de medidas:

Figura 17: Calculation Groups

Para utilizarmos isso numa matriz por exemplo, devemos colocar a medida principal (ex: Faturamento) em Valores e a medida do Calculation Groups em Colunas.

Ah, um detalhe! Para o valor de YoY% ficar em percentual você precisa especificar o formato assim:

Figura 18: Formatando a expressão

Quando tiver medidas com diferentes formatos, por exemplo: reais, inteiro e decimal, você pode criar uma expressão para especificar esses formatos com base no nome da medida, veja:

Figura 19: Formatando todas as medidas


Múltiplos pequenos

Um outro exemplo de aplicação do Calculation Groups é quando utilizamos o recurso de Múltiplos Pequenos.

Vamos inserir um gráfico de barras empilhadas e adicionar “Medidas” em Múltiplos Pequenos:

Figura 20: Múltiplos Pequenos


Para deixar os gráficos em três colunas separados por linha tracejada basta editar a formatação do gráfico assim:

Figura 21: Formatando gráfico com múltiplos pequenos


Medidas Diversas

Repita exatamente o mesmo que fizemos para criar as medidas de inteligência de tempo e crie um novo Calculation Group, clicando com o botão direito em Tables e escreva “Medidas Diversas” em seu nome.

Os itens que você precisa criar são esses:

  • Atual
SELECTEDMEASURE()

  • Média diária
AVERAGEX(
VALUES('Data'[DataID]),
SELECTEDMEASURE()
)

  • Máximo diário
Máximo diário=
MAXX(
VALUES('Data'[DataID]),
SELECTEDMEASURE()
)

  • Mínimo diário

Mínimo Diário=
MINX(
VALUES('Data'[DataID]),
SELECTEDMEASURE(
)

  • Top 5 dias
Top 5 dias =
CALCULATE(
SELECTEDMEASURE(),
TOPN(
5,
VALUES('Data'[DataID]),
SELECTEDMEASURE()
)
)

Veja um exemplo do que podemos fazer com esses grupos de medidas:

Figura 22: Utilizando grupos de medidas em matriz e filtros


Repare que utilizei os dois grupos de medidas que criamos anteriormente nos visual de filtro ali no topo. O primeiro está com seleção obrigatória e única. O filtro debaixo está livre.

Olhe que bacana a matriz fica se você tiver mais de uma medida no campo Valores:

Figura 23: Duas medidas em na matriz

Ah, uma coisa importante! Defina a ordem de precedência de cada Calculation Group aqui:

Figura 24: Calculation Group Precedence

Um valor mais alto significa uma maior precedência de aplicação; o Calculation Group com a precedência mais alta é aplicado primeiro.

Coloque o primeiro grupo com precedência “1” e o segundo com “0”.

Vamos para o próximo exemplo!


Medidas Diferentes Datas

Vamos supor que a gente precise criar medidas que considerem outras datas além de DataEmissao. Veja que temos 2 relacionamentos inativos no modelo:

Figura 25: Relacionamentos

Crie o Calculation Group chamado: “Medidas Diferentes Datas” e depois adicione os itens abaixo:

  • DataEmissao
SELECTEDMEASURE()

  • DataVencimento
CALCULATE(
    SELECTEDMEASURE(),
    USERELATIONSHIP(
        'Vendas'[DataVencimento],
        'Data'[DataID]
    )
)

  • DataVisita

HTML clipboard

CALCULATE(
    SELECTEDMEASURE(),
    USERELATIONSHIP(
        'Vendas'[DataVisita],
        'Data'[DataID]
    )
)

Para não confundir com os demais Calculation Groups que criamos antes (e tinha o nome “Medida”), vou renomear para “Data Utilizada”:

Figura 26: Editando o nome


Vamos dar uma olhada como ficará nossa matriz utilizando Data Utilizada em Colunas:

Figura 27: Exemplo de uso

Vamos para o nosso último case!

Medidas para Comparação

Vamos supor que você quer que usuário escolha a medida que ele vai adicionar no gráfico para realizar a comparação com outra variável que já estará no gráfico.

Crie o Calculation Group chamado: “Medidas para Comparação” e depois adicione os itens abaixo:

  • Cobertura Clientes
IF(
    SELECTEDMEASURENAME() = "Faturamento",
    [Faturamento],
    [Cobertura Clientes]
)

  • SKUs Vendidos
IF(
    SELECTEDMEASURENAME() = "Faturamento",
    [Faturamento],
    [SKUs Vendidos]
)

  • Notas Emitidas
IF(
    SELECTEDMEASURENAME() = "Faturamento",
    [Faturamento],
    [Notas Emitidas]
)

Por fim, adicione uma medida com nome “KPI Selecionado”:

Figura 28: Criando medida no Tabular Editor


Agora basta você inserir um filtro no topo da página utilizando “KPI” em Valores. Depois adicione um Gráfico de colunas agrupadas e linhas com “Faturamento” em Valores de Coluna e “KPI Selecionado” em Valores de Linha. Confira abaixo:

Figura 29: Visual final

Agora dica final: teste você mesmo!

A melhor forma de verificar se você compreendeu mesmo o que foi apresentado aqui é colocando a mão na massa!


Espero que tenha gostado do conteúdo! Ele foi baseado na live #58. Comenta aqui embaixo se você gosta desse tipo de conteúdo e sua sugestão para a próxima live.

Lembretes finais:
– Nosso encontro ocorre toda terça-feira às 19h aqui: Lives Semanais.
– Para não perder nenhuma novidade acesse o Canal do Telegram: Clique aqui

Abraços,
Leonardo.

Compartilhe este post:
Compartilhar no facebook
Compartilhar no linkedin
Compartilhar no twitter
Compartilhar no pinterest