Automatizando a Identificação de problemas de relacionamento no Power BI

Atualizado: 18 de mar.

Hoje o dataholic Rafael Barbosa vai te ajudar a entender de vez porque você tem valores “blank” no filtro do seu Dashboard no Power BI, usando advancend script no Tabular Editor. Boa leitura!

Problemas de relacionamento geram linhas em branco, isso acontece quando sua tabela fato possui registros que não existem na tabela de dimensão. O Power BI cria uma linha em branco e relaciona esses itens não entrados. Esse tipo de problema afeta na exibição dos dados e no desempenho do seu relatório como vocês pode ver no artigo do PHIL SEAMARK em Clean data = faster reports.


Então para resolver precisamos saber quais itens faltam na dimensão, para então adicioná-los. No entando, se você tiver 10 relacionamentos no seu modelo, será uma tarefa demorada, mas podemos utilizar o Tabular Editor para automatizar essa tarefa de forma simples.

Para isso vou utilizar o Advanced Script do Tabular Editor. Para montar essa solução eu peguei o script do Blog Elegant BI e incrementei um pouco mais o script que ele compartilhou, criando duas versões, mas antes vou ensinar como utilizar o Advanced Script do Tabular Editor.


Como rodar o script no Tabular Editor

1. Baixar e instalar o Tabular Editor.

2. Depois de instalado ele vai aparecer dentro do Power BI na aba “Ferramentas Externas”, ao clicar neste botão será aberto o Tabular Editor conectado no relatório atual.

3. Copie e cole o script dentro de Advanced Script.

4. Salve o script, para poder utilizar novamente depois.


4.1 Clique no botão “+”.

4.2 Informe o nome, você pode utilizar “\” barra para criar pastas para facilitar quando for chamar o script.

4.3 Escolha o contexto em que deve aparecer essa opção (neste caso marquei na opção “Model”).

4.4 Clique em OK.



6. Execute o Script clicando no play ou apertando F5.


7. Depois de salvo quando você precisar chamar o script novamente você pode acessar:


7.1 (Opção 1) - Clicando com o botão direito em cima do contexto escolhido, neste caso foi marcado “model” no item 5.

7.1 (Opção 2) Clicando em Samples.


Agora que você sabe como faz para executar o script, deu para ver que depois de configurar, a próxima vez será somente abrir o Tabular Editor e fazer o item 7.


Versão 1 - Encontrar linhas em branco resumo


O 1° Script é a versão resumida, ele tem o objetivo de trazer e identificar quais tabelas que estão com problema de relacionamento e identificar as colunas responsáveis.


Depois que você executar o script abaixo, ele vai retornar a essa janela com a relação dos problemas listados, só vai precisar clicar em “Copy to Clipboard”.


Depois é só colar em uma planilha do Excel, para ver o resultado como mostrado abaixo:

  • FromTable: Tabela que está sendo filtrada no relacionamento (tabela fato)

  • ToTable: Tabela que está filtrando no relacionamento (tabela dimensão)

  • BlankRowCount: Quantidade de linhas que a “FromTable” não entrou relacionamento direto com “ToTable”

  • FromTableColumn: Coluna de relacionamento da “FromTable”

  • ToTableColumn: Coluna de relacionamento da “ToTable”

  • DAX_Table: Medida DAX para criar uma tabela com a lista de itens que faltam na tabela dimensão para resolver o problema de relacionamento.

Encontrar linhas em branco resumo




foreach (var rin Model.Relationships.ToList())
{
bool   act = r.IsActive;
string fromTable = r.FromTable.Name;
string toTable = r.ToTable.Name;
string fromTableFull = r.FromTable.DaxObjectFullName;
string fromObject = r.FromColumn.DaxObjectFullName;
string toObject = r.ToColumn.DaxObjectFullName;
string dax;
string DAX_Table;

if (act)
    {
        dax ="SUMMARIZECOLUMNS(\"test\",CALCULATE(COUNTROWS("+fromTableFull+"),ISBLANK("+toObject+")))";
        DAX_Table ="SUMMARIZECOLUMNS("+fromObject+",\"Inserir "+toObject+"\",CALCULATE(COUNTROWS("+fromTableFull+"),ISBLANK("+toObject+")))";
    }
else
    {
        dax ="SUMMARIZECOLUMNS(\"test\",CALCULATE(COUNTROWS("+fromTableFull+"),USERELATIONSHIP("+fromObject+","+toObject+"),ISBLANK("+toObject+")))";
        DAX_Table ="SUMMARIZECOLUMNS("+fromObject+",\"Inserir "+toObject+"\",CALCULATE(COUNTROWS("+fromTableFull+"),USERELATIONSHIP("+fromObject+","+toObject+"),ISBLANK("+toObject+")))";
    }

var daxResult = EvaluateDax(DAX_Table);
string blankRowCount = EvaluateDax(dax).ToString();

if (blankRowCount !="Table" )
    {
        daxResult.Output();
    }
}



Depois de executar é só copiar e colar no Excel:



Versão 2 - Encontrar linhas em branco detalhado


Quando você roda o script anterior e segue para encontrar problemas de relacionamento no seu modelo, sucederá a próxima pergunta: Quais itens eu preciso adicionar na minha tabela de dimensão, para resolver esse problema de relacionamento?


Ao rodar o próximo script, retornará a 1° coluna a relação de itens que precisam ser adicionados na coluna da tabela dimensão “D_municipios[Municipio.id]”, e a na 2° coluna a quantidade de linhas que a tabela fato possui de cada item. Como no exemplo anterior você pode copiar o resultado e colar no Excel.


  • 1° Problema de relacionamento

Ao clicar em “Close” (Fechar) o Tabular Editor vai retornar à relação do próximo problema de relacionamento.


  • 2° Problema de relacionamento:


  • 3° Problema de Relacionamento:

Neste caso podemos ver que na tabela fato (Vacinação) possui 8 linhas em branco na coluna [paciente_racacor_codigo], neste caso o problema está na tabela fato que não está trazendo o código para essas 8 linhas.


Encontrar linhas em branco detalhado


//var sb =new System.Text.StringBuilder();
//string newline = Environment.NewLine;

foreach (var rin Model.Relationships.ToList())
{
bool   act = r.IsActive;
string fromTable = r.FromTable.Name;
string toTable = r.ToTable.Name;
string fromTableFull = r.FromTable.DaxObjectFullName;
string fromObject = r.FromColumn.DaxObjectFullName;
string toObject = r.ToColumn.DaxObjectFullName;
string dax;
string DAX_Table;

if (act)
    {
        dax ="SUMMARIZECOLUMNS(\"test\",CALCULATE(COUNTROWS("+fromTableFull+"),ISBLANK("+toObject+")))";
        DAX_Table ="SUMMARIZECOLUMNS("+fromObject+",\"Inserir "+toObject+"\",CALCULATE(COUNTROWS("+fromTableFull+"),ISBLANK("+toObject+")))";
    }
else
    {
        dax ="SUMMARIZECOLUMNS(\"test\",CALCULATE(COUNTROWS("+fromTableFull+"),USERELATIONSHIP("+fromObject+","+toObject+"),ISBLANK("+toObject+")))";
        DAX_Table ="SUMMARIZECOLUMNS("+fromObject+",\"Inserir "+toObject+"\",CALCULATE(COUNTROWS("+fromTableFull+"),USERELATIONSHIP("+fromObject+","+toObject+"),ISBLANK("+toObject+")))";
    }

var daxResult = EvaluateDax(DAX_Table);
string blankRowCount = EvaluateDax(dax).ToString();

if (blankRowCount !="Table" )
    {

        daxResult.Output();
    }

}

O que achou deste conteúdo? Nos conte nos comentários e deixe sua curtida para apoiar nossa produção. Compartilhe com os amigos!💙⚙️