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.

Demonstrativo de Resultado (DRE) com DAX Avançado

Fala, pessoal! Cansou daquela tabela padrão de DRE na sua empresa? Quer aprimorar seus conhecimentos em DAX e construir uma matriz inteligente no Power Bi de forma que você consiga comparar o realizado e orçado mês a mês e também expandir os níveis das contas? Hoje mostraremos como fazer isso e muito mais!

Nosso objetivo final será chegar nessa página:

Figura 1: Objetivo final

Dados de entrada

Temos um arquivo em Excel composto pelas seguintes abas/tabelas:

1. Aba Plano de Contas (dPlanoContas): contém a estruturação do plano de contas da empresa, com nome da conta, código contábil e nível das contas (hierarquias/agrupamentos). Note que a coluna cdConta possui valores distintos.

Figura 2: Dados de Entrada – Plano de Contas

2. Aba Realizado (fRealizado): possui o valor realizado para cada cdConta e Data. Veja que a granularidade é diária e os valores da coluna cdConta se repetem várias vezes.

Figura 3: Dados de entrada – Realizado

3. Aba Orçado (fOrçado): contém os valores de orçamento para cada cdConta e Mês/ano. Nessa tabela a granularidade é mensal e os valores de cdConta também se repetem em várias linhas.

Figura 4: Dados de Entrada – Orçado

4. Aba Máscara DRE (dPlanoGerencial): possui o Nível 1 das contas bem como a classificação Subtotal. Esta, quando se tratar de uma conta que é resultado da soma de outras, aparecerá o valor 1, caso contrário aparecerá o valor 0. Veja que também há uma coluna Ordem e ela é responsável por indicar o ordenamento correto das contas. – sem isso, nossa soma acumulada linha a linha poderá ter problemas. Daqui a pouco você descobrirá que ela será fundamental na nossa medida DAX.

Figura 5: Dados de Entrada – Máscara DRE

Veja na figura acima que a nossa ideia é poder somar os valores das linhas acima de uma conta que é subtotal (Subtotal = 1). Veja que a linha GROSS PROFIT deve ser o resultado da soma de NET REVENUES, COSTS OF GOOD SALES e LOGISTISC. E assim sucessivamente até o final da tabela, beleza?!

Importando as tabelas

Para importar as tabelas do nosso arquivo em Excel, basta ir Página Inicial → Obter Dados → Excel → Selecione o arquivo.

Figura 6: Importando arquivo em Excel

Assim que clicar para abrir aparecerá uma janela para você selecionar as Abas / Tabelas de interesse como essa daqui:

Figura 7: Importando tabelas

Você deve estar estranhando… Por que apareceram mais dados que aquelas 4 abas que mostramos quando falamos de cada aba do arquivo de entrada? É que os dados estavam formatados como Tabela no Excel, então o Power Bi mostra a lista de Abas e de Tabelas (mesmo que, na prática, elas possuam a mesma informação), entendeu?! Vamos selecionar as tabelas destacadas em vermelho na figura, ok?!

Precisamos relacionar a tabela dPlano Gerencial com dPlanoContas através da coluna Nível 1. Mas veja que a chance de possuir alguma linha escrita de forma diferente na tabela dPlanoGerencial (nossa máscara DRE) é bem grande, afinal essa máscara dificilmente será um arquivo que você exportará de um sistema (ou seja, deverá ser criada por você) – no nosso exemplo ela foi criada manualmente. Vamos precisar fazer o nosso ETL (Extract, Transform, Load)!

ETL

Podemos diminuir a chance de erros em relacionamentos entre as colunas Nível 1 das tabelas dPlanoGerencial e dPlanoContas separando o código do texto, em ambas as tabelas. Faremos isso adicionando uma nova coluna.

Como essa ação é um padrão “fácil” do Power Bi identificar, então usaremos a Coluna de Exemplos para extrair a parte textual da coluna Nível 1. Veja:

Etapas:
Selecione a coluna Nível 1 na tabela dPlanoGerencial → Adicionar Coluna →   Coluna de Exemplos → Da Seleção → Digite o valor que se deseja extrair (no nosso caso é o texto) → Se o autopreenchimento foi realizado corretamente, clique Ok → Renomeie para Conta Gerencial a Coluna 1 → Enter.
Figura 8: Extraindo texto de coluna através de Coluna de Exemplos

Agora vamos transformar a coluna Nível 1 de forma que só fique a parte numérica nela (código) e vemos que o que separa o código do nome da conta (texto) é um ponto seguido de um espaço em branco. Veja:

Etapas:
Selecione a coluna Nível 1 na tabela dPlanoGerencial → Transformar → Extrair → Texto Antes do Delimitador → Delimitador → Digite um ponto seguido de um espaço em branco → Ok.
Figura 9: Extraindo texto antes do delimitador

Na tabela dPlanoContas só faremos a transformação na própria coluna, isto é, não precisaremos dos nomes porque já temos isso na tabela dPlanoGerencial (relacionaremos ambas depois através do Nível 1). Da mesma forma que fizemos na figura 8, seguiremos as etapas abaixo:

Etapas:
Selecione a coluna Nível 1 na tabela dPlanoContas → Transformar → Extrair → Texto Antes do Delimitador → Delimitador → Digite um ponto seguido de um espaço em branco → Ok.

Se, após verificar os tipos de dados nas tabelas, estiver tudo certo (data como Date, valores numéricos com Decimal, etc), clique em Fechar e Aplicar.

Relacionamentos

Assim que a aplicar as transformações, você verá no modelo que alguns relacionamentos foram identificados automaticamente no Power Bi e esse modelo é do tipo Snowflake, veja:

Figura 10: Relacionamento entre Tabelas

Medidas DAX

Construindo a dCalendário com DAX

Sabemos que em todo modelo é importante ter uma tabela de calendário. Faremos essa tabela ser dinâmica, isto é, ter uma data de início e fim com base nos nossos dados de entrada usando DAX.

Para criar uma tabela em DAX, basta ir em Modelagem, clicar no botão abaixo em destaque e digitar a seguinte fórmula:

Figura 11: Criando tabela dCalendario em DAX

dCalendario =
VAR varDataMinFato =
    MIN ( fRealizado[Data] )
VAR varDataMaxFato =
    MAX ( fRealizado[Data] )
VAR varAnoMin =
    YEAR ( varDataMinFato )
VAR varAnoMax =
    YEAR ( varDataMaxFato )
VAR varDataMin =
    DATE ( varAnoMin0101 )
VAR varDataMax =
    DATE ( varAnoMax1231 )
RETURN
    CALENDAR ( varDataMinvarDataMax )

Após dar o enter na fórmula acima, você notará que será criada na tabela dCalendario uma coluna chamada Date, com a lista de datas compreendidas entre varDataMin e varDataMax. Lembre-se de mudar a formatação dessa coluna (dd/mm/yyyy) e renomeie essa coluna para Data.

Figura 12: Formatando a coluna de data da tabela dCalendario

Caso não esteja aparecendo Ferramentas da tabela e Ferramentas de coluna na Faixa de Opções do Power Bi, você precisará ativá-las assim:

Etapas:
(1) File → (2) Opções e Configurações → (3) Opções → (4) Recursos de visualização →  (5) Marque Faixa de opções atualizada → (6) Ok.
Figura 13: Ativando a faixa de opções atualizada

Agora, vamos adicionar as colunas de Mês, Ano e Nome do Mês. Ainda com a tabela dCalendario selecionada, clique em Ferramenta da tabelaNova Coluna e digite as três fórmulas a seguir, uma para cada coluna:

Mês =
MONTH ( dCalendario[Data] )

Ano =
YEAR ( dCalendario[Data] )

Nome do Mês =
FORMAT ( dCalendario[Data]; “mmmm” )

Figura 14: Adicionando colunas na tabela dCalendario

Por fim, vamos ordenar a coluna Nome do Mês de acordo com o número do mês (coluna Mês) da seguinte forma:

Etapas:  
Selecione a coluna Nome do Mês → Classificar por → Mês
Figura 15: Ordenando coluna Nome do Mês

Voltando para o Modelo, precisamos conectar a dCalendario e fazer os devidos relacionamentos. Basta arrastar as colunas Data entre a dCalendario e cada tabela fato (fOrçado e fRealizado), veja:

Figura 16: Relacionando a dCalendario

Calculando o valor Realizado

Nossa primeira medida será o total Realizado:

Realizado =
SUM ( fRealizado[Valor] )

Quando utilizamos uma matriz para visualizar a medida criada (Realizado) junto da coluna Contas Gerenciais (da tabela dPlanoGerencial), vemos que o ordenamento das contas não parece estar correto, veja:

Figura 17: Matriz com Realizado por Conta Gerencial

Para corrigir isso, vamos ordenar a coluna Conta Gerencial através da coluna Ordem.

Figura 18: Ordenando as contas gerenciais

Note que, apesar de termos conseguido ordenar corretamente as contas, aquelas contas que são subtotais não vieram (GROSS PROFIT e EBITDA não estão na nossa matriz – à esquerda):

Figura 19: Subtotais ausentes

Vamos mudar esse visual para Tabela rapidamente para conseguir ver as contas que faltaram (adicione a coluna Subtotal na tabela, no campo Valores):

Figura 20: Mudando o Visual para Tabela

Veja que ainda não aparecem as linhas de contas com Subtotal igual a 1. Precisamos clicar na seta referente à coluna que está em Valores desse visual (Conta Gerencial) e selecionar a opção Mostrar itens sem dados, veja:

Figura 21: Mostrando itens sem dados

Veja que agora apareceram aquelas contas com Subtotal igual a 1.

Figura 22: Mostrando tabela com valor em branco

Agora vamos precisar preencher essas linhas com valores em branco. Antes disso, arraste a coluna Ordem para que ela apareça na tabela também. Assim que arrastá-la, lembre se clicar com o botão direito na setinha da coluna Ordem (em Valores do visual selecionado) e selecionar Não resumir:

Figura 23: Não resumir coluna com valores numéricos

O resultado será essa tabela:

Figura 24: Tabela com o valor de Ordem (sem resumir)

Agora veremos como será importante essa coluna Ordem. Observe que a linha EBITDA é uma linha totalizadora (Subtotal = 1) e portanto seu valor deve corresponder à soma de todas as linhas acima dela. Essas linhas acima dela possuem o valor de Ordem inferior a ela, certo?! Sim! Então basta somar todas as linhas da tabela até chegar na linha 14? Não!

Além disso, precisamos levar em consideração a coluna Subtotal também. A soma das linhas anteriores deve ocorrer somente até chegar na primeira conta com Subtotal = 1. Ou seja, nesse exemplo vamos somar os valores das linhas que possuem Ordem entre 4 e 13 (4 <= Ordem < 13). Ou podemos também somar todas as linhas antes da linha 14, exceto as linhas com Subtotal = 1. Essa segunda opção parece ser mais fácil, certo?! Vamos por partes…

Primeiro, acumularemos os valores de cada linha. Veja:

Realizado Subtotais =
VAR varOrdemContexto =
    MAX ( dPlanoGerencial[Ordem] )
RETURN
    CALCULATE (
        SUM ( fRealizado[Valor] );
        FILTER ( ALL ( dPlanoGerencial ); dPlanoGerencial[Ordem] <= varOrdemContexto )
    )

Com essa fórmula veremos o seguinte resultado:

Figura 25: Calculando subtotais

Ah, uma observação! Você poderia imaginar que ao colocarmos MAX( dPlanoGerencial [Ordem] ) em varOrderContexto, teríamos como resultado o total da ordem da tabela toda (= 23), mas lembre-se que a fórmula será aplicada no contexto em que ela estiver (não estamos usando a Calculate para alterar seu contexto, por exemplo). Então, em cada linha o valor de varOrderContexto será o valor máximo do contexto em que se está realizando o cálculo. Entendido?!

Bom, voltando ao que estávamos fazendo, veja que temos duas medidas: Realizado e Realizado Subtotal e agora precisamos uní-las numa só, ou seja, precisamos preencher os campos vazios sem valor da medida Realizado com o valor da medida Realizado Subtotal. A lógica é: sempre que tiver no nível de Subtotal, vou usar a medida Realizado Subtotal, caso contrário vou usar a medida Realizado.

Realizado =
VAR varSubtotal =
    SELECTEDVALUE ( dPlanoGerencial[Subtotal] )
VAR varOrdemContexto =
    MAX ( dPlanoGerencial[Ordem] )
VAR varValor =
    SUM ( fRealizado[Valor] )
VAR varValorSubtotal =
    CALCULATE (
        SUM ( fRealizado[Valor] );
        FILTER ( ALL ( dPlanoGerencial ); dPlanoGerencial[Ordem] <= varOrdemContexto )
    )
RETURN
    SWITCH (
        TRUE ();
        varSubtotal = 0varValor;
        varSubtotal = 1
            && NOT ( ISINSCOPE ( dPlanoContas[Nível 2] ) )varValorSubtotal;
        BLANK ()
    )

Veja como fico na nossa tabela após adicionar Realizado Correto em Valores:

Figura 26: Tabela com a medida completa

Voltando para nosso visual Matriz deixaremos Conta Gerencial e Realizado Correto. Adicionaremos o Nível 2 nas Linhas para ativar o Drill Down. Lembre-se de clicar na seta ao lado de Conta Gerencial para remover as linhas em branco (Others), veja:

Figura 27: Matriz com Drill Down no Nível 2

Mas temos um probleminha… Quando expandimos o GROSS PROFIT (que é uma conta subtotal), vemos que aparecem todas as contas que já tinham em outras aberturas mas deveria aparecer somente a própria linha, veja só:

Figura 28: Problema com Drill Down de conta Subtotal

Vamos resolver isso utilizando a função ISINSCOPE, veja:

EstaNoContexto =
ISINSCOPE ( dPlanoContas[Nível 2] )

Figura 29: Utilizando a função ISINSCOPE

Agora, vamos adicionar essa função na medida Realizado Correto.

Realizado Correto =
VAR varSubtotal =
    SELECTEDVALUE ( dPlanoGerencial[Subtotal] )
RETURN
    SWITCH (
        TRUE ();
        varSubtotal = 0; [Realizado];
        varSubtotal = 1
            && NOT ( ISINSCOPE ( dPlanoContas[Nível 2] ) ); [Realizado Subtotais];
        BLANK ()
    )

Pronto! Agora não teremos a abertura no Drill Down do Nível 2 em contas que são subtotais.

Vamos mover todas as medidas com cálculo do Realizado para uma só (chamaremos de Realizado)! No final, lembre-se de deletar aquelas medidas antigas que não usaremos mais (porque transformamos elas em variáveis)! Veja como ficou nossa medida Realizado no final:

Realizado =
VAR varSubtotal =
    SELECTEDVALUE ( dPlanoGerencial[Subtotal] )
VAR varOrdemContexto =
    MAX ( dPlanoGerencial[Ordem] )
VAR varValor =
    SUM ( fRealizado[Valor] )
VAR varValorSubtotal =
    CALCULATE (
        SUM ( fRealizado[Valor] ),
        FILTER ( ALL ( dPlanoGerencial ), dPlanoGerencial[Ordem] <= varOrdemContexto )
    )
RETURN
    SWITCH (
        TRUE (),
        varSubtotal = 0varValor,
        varSubtotal = 1
            && NOT ( ISINSCOPE ( dPlanoContas[Nível 2] ) )varValorSubtotal,
        BLANK ()
    )

Calculando o valor Orçado

Vamos aproveitar e já criar a medida Orçado. É exatamente a mesma coisa que a Realizado, mas precisamos realizar a mudança apenas onde aparece o nome da tabela fRealizado (trocar para fOrçado). Ficou assim:

Orçado =
VAR varSubtotal =
    SELECTEDVALUE ( dPlanoGerencial[Subtotal] )
VAR varOrdemContexto =
    MAX ( dPlanoGerencial[Ordem] )
VAR varValor =
    SUM ( fOrcado[Valor] )
VAR varValorSubtotal =
    CALCULATE (
        SUM ( fOrcado[Valor] );
        FILTER ( ALL ( dPlanoGerencial ); dPlanoGerencial[Ordem] <= varOrdemContexto )
    )
RETURN
    SWITCH (
        TRUE ();
        varSubtotal = 0varValor;
        varSubtotal = 1
            && NOT ( ISINSCOPE ( dPlanoContas[Nível 2] ) )varValorSubtotal;
        BLANK ()
    )

Calculando o Desvio

O desvio será a diferença entre o Realizado e o Orçado, certo?! Essa é mole!

Desvio =
[Realizado] – [Orçado]

Já o desvio percentual será calculado utilizando a função DIVIDE assim:

Desvio % =
DIVIDE ( [Desvio]; ABS ( [Orçado] ) )

A função ABS serve para deixar o valor Orçado absoluto (sinal positivo).

Visuais

Para chegarmos naquela página que mostrei no início do artigo precisamos adicionar alguns ícones na nossa coluna Desvio % da matriz. Para isso, basta seguir:

Formatação:
Formato → Formatação condicional → Seleção da medida Desvio % no dropdown → Ativar Ícones → Controles Avançados → Configurar os ícones conforme imagem (desvio negativo será vermelho e positivo será verde).
Figura 30: Adicionando ícones na matriz

Ah, vamos adicionar também a coluna Descrição da Conta da tabela dPlanoContas nas linhas da matriz. Dê duplo clique para renomeá-la para Conta Contábil. Adicione também Nome do Mês nas colunas.

Para finalizar, vamos adicionar um filtro para escolha do mês, veja:

Figura 31: Adicionando filtro através do visual Segmentação de Dados

Finalmente, chegamos ao visual que queríamos, após formatar a tabela, adicionar um título na página e mudar o background… Veja como ficou:

Figura 32: Resultado Final

Viu? Com apenas 4 medidas conseguimos montar nossa Matriz DRE com Drill Down de Níveis de Contas, ícones com base no valor % do desvio e totalmente dinâmica e que também é responsiva ao filtro de mês e demais seleções! Incrível, né?!

Ficamos por aqui, pessoal! Espero que tenham gostado do conteúdo de hoje! Ele foi baseado na Live 3 Workshop #1 Power BI – Dashboard Demonstrativo de Resultado (DRE Contábil) com DAX Avançado.

Abraços,
Leonardo.

COMPARTILHE ESSE POST

Compartilhar no facebook
Compartilhar no linkedin
Compartilhar no twitter
Compartilhar no pinterest