Ir para conteúdo
  • 0

Alerta de Conflito de Serviços


Fernando Santos
Ir para solução Solucionado por Erick Oliveira ,

Pergunta

  • Alunos

Olá meu amigos.
Estou com um problemão.

Eu tenho uma tabela "Pauta" que se relaciona com as tabelas "Serviço Impactante" e "Serviço Impactado" (Relacionamento "muitos para muitos) é esperado;

Criei um Painel que ao posicionar o mouse sobre um determinado Serviço, (campo Serviço da tabela Pauta), ele me exibe uma lista flutuante (Dica de Ferramenta) me exibindo os Serviços Impactantes e Impactados).  Onde cada Serviço possui uma data de execução. Até aí tudo bem;

O que eu preciso agora, é que tanto o Serviço Impactante quanto o Impactado, consulte a tabela "Pauta" e caso ele encontre o Serviço de mesmo nome, verifique se este está com o mesma data do Serviço "Pauta" selecionado, caso positivo ele crie um alerta ou mude de cor.

Pauta da Semana.pbix

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0
  • Alunos
  • Solução

Boa noite Fernando;

Verifique se a solução em anexo te atende. Precisei fazer alguma s alterações na base para verificar se a solução estava funcionando.

Basicamente a medida abaixo procura a Sigla da fPautas na tabela "Impactado" e retorna uma tabela com serviços Impactantes, depois verifica se esses serviços Impactantes estão na tabela fPautas com a mesma data. O mesmo é feito para a tabela "Impactante". Caso encontre alguma ocorrência em qualquer uma das tabelas, ele irá pintar a linha de vermelho.

 

Formatar Linha = 
VAR tTabelaBase =
    SUMMARIZE(
        fPauta,
        fPauta[SIGLA],
        fPauta[Início]
    )
VAR tTabelaImpactante =
    SELECTCOLUMNS(
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(auxPauta,fImpactante),
                    fImpactante[Sigla Serviço Impactante],
                    auxPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(auxPauta) )
                ),
                [Possui Pauta] = 1
            ),
            USERELATIONSHIP(auxPauta[SIGLA], fImpactante[Sigla Serviço Impactado]),
            ALL(fPauta)
        ),
        "Serviço Impactante",
        fImpactante[Sigla Serviço Impactante],
        "Início",
        auxPauta[Início]
    )
VAR vResultadoImpactante = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactante))
VAR tTabelaImpactado =
    SELECTCOLUMNS(
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(auxPauta,fImpactado),
                    fImpactado[Sigla Serviço Impactado],
                    auxPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(auxPauta) )
                ),
                [Possui Pauta] = 1
            ),
            USERELATIONSHIP(auxPauta[SIGLA], fImpactado[Sigla Serviço Impactante]),
            ALL(fPauta)
        ),
        "Serviço Impactado",
        fImpactado[Sigla Serviço Impactado],
        "Início",
        auxPauta[Início]
    )
VAR vResultadoImpactado = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactado))
VAR vResultado =
    IF(
        OR(vResultadoImpactante > 0, vResultadoImpactado > 0),
        "Red"
    )
RETURN
vResultado

 

Pauta da Semana - 20230227.pbix

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Boa noite Fernando;
Segue uma solução, verifique se a mesma lhe atende.

Como não sabia a data a ser considerada como selecionada, criei uma medida "Data Pauta" que pode ser ajustada a sua preferência (valor selecionado pelo usuário ou utilizar função TODAY).
A lógica para formatar a linha foi, verificar se o serviço "Pauta" possui valores nas duas tabelas (Impactante e Impactado). Além disso verifica também se a data desse serviço é igual a "Data Pauta". Caso as duas condições seja satisfeitas, ele pintará a linha de vermelho.

 

Formatar Linha = 
 VAR vPossui_Impactado_e_Impactante = INT( NOT OR(ISEMPTY(Impactante),ISEMPTY(Impactado)) ) // 1 se possui, 0 se não possui
 VAR vData_Pauta = INT( MAX(Pauta[Data Início]) = [Data Pauta] ) // 1 para sim, 0 para não
 RETURN
 IF(
     AND(vPossui_Impactado_e_Impactante = 1, vData_Pauta = 1),
     "Red"
 )

 

Pauta da Semana.pbix

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
10 horas atrás, Erick Oliveira disse:

Boa noite Fernando;
Segue uma solução, verifique se a mesma lhe atende.

Como não sabia a data a ser considerada como selecionada, criei uma medida "Data Pauta" que pode ser ajustada a sua preferência (valor selecionado pelo usuário ou utilizar função TODAY).
A lógica para formatar a linha foi, verificar se o serviço "Pauta" possui valores nas duas tabelas (Impactante e Impactado). Além disso verifica também se a data desse serviço é igual a "Data Pauta". Caso as duas condições seja satisfeitas, ele pintará a linha de vermelho.

 

Formatar Linha = 
 VAR vPossui_Impactado_e_Impactante = INT( NOT OR(ISEMPTY(Impactante),ISEMPTY(Impactado)) ) // 1 se possui, 0 se não possui
 VAR vData_Pauta = INT( MAX(Pauta[Data Início]) = [Data Pauta] ) // 1 para sim, 0 para não
 RETURN
 IF(
     AND(vPossui_Impactado_e_Impactante = 1, vData_Pauta = 1),
     "Red"
 )

 

Pauta da Semana.pbix 199.93 kB · 0 downloads

Erick.  Bom dia.  Primeiramente obrigado pela ajuda.

É quase isso, mas o problema é que as tabelas "Impactante e Impactado", não possuem data.

Os Serviços podem aparecer em qualquer uma das tabelas.  A lógica que eu preciso verificar é:
Verificar se o Serviço "Pauta", possui algum Serviço "Impactante" (ou "Impactado);

Caso tenha, verificar se este Serviço também consta na tabela "Pauta";

Caso tenha, verificar se os dois estão com a mesma data.

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 24/02/2023 em 00:04, Erick Oliveira disse:

Teria alguém exemplo do resultado esperado?

Veja o seguinte cenário.

Se você escolher Segunda e Terça, alguns Serviços serão listados, dentre eles o "MEU INSS";

Repare que o "MEU INSS" tem agendamento para segunda e terça;

"Se você posicionar o mouse sobre "MEU INSS" (tanto segunda quanto terça), ele vai exibir uma janela flutuante com as informações dos serviços IMPACTANTES e IMPACTADOS;

"MEU INSS - MPOG" é um serviço IMPACTANTE do "MEU INSS", só que "MEU INSS - MPOG" só possui agendamento para segunda e não possui para terça;

Eu queria que assim que eu colocasse o mouse em "MEU INSS" de segunda, ele alertasse na janela flutuante, que "MEU INSS - MPOG" está com conflito de agendamento, mas o mesmo NÃO pode ocorrer quando coloco o mouse na terça, pois não possui conflito.
Não sei se você vai entender agora.  Obrigado.

P.S.:  Se precisar de mais informação, qualquer um de vocês podem me contactar pelo ZAP: (21)98689-0367.

Pauta da Semana - 20230227.pbix

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 27/02/2023 em 20:57, Erick Oliveira disse:

Boa noite Fernando;

Verifique se a solução em anexo te atende. Precisei fazer alguma s alterações na base para verificar se a solução estava funcionando.

Basicamente a medida abaixo procura a Sigla da fPautas na tabela "Impactado" e retorna uma tabela com serviços Impactantes, depois verifica se esses serviços Impactantes estão na tabela fPautas com a mesma data. O mesmo é feito para a tabela "Impactante". Caso encontre alguma ocorrência em qualquer uma das tabelas, ele irá pintar a linha de vermelho.

 

Formatar Linha = 
VAR tTabelaBase =
    SUMMARIZE(
        fPauta,
        fPauta[SIGLA],
        fPauta[Início]
    )
VAR tTabelaImpactante =
    SELECTCOLUMNS(
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(auxPauta,fImpactante),
                    fImpactante[Sigla Serviço Impactante],
                    auxPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(auxPauta) )
                ),
                [Possui Pauta] = 1
            ),
            USERELATIONSHIP(auxPauta[SIGLA], fImpactante[Sigla Serviço Impactado]),
            ALL(fPauta)
        ),
        "Serviço Impactante",
        fImpactante[Sigla Serviço Impactante],
        "Início",
        auxPauta[Início]
    )
VAR vResultadoImpactante = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactante))
VAR tTabelaImpactado =
    SELECTCOLUMNS(
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(auxPauta,fImpactado),
                    fImpactado[Sigla Serviço Impactado],
                    auxPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(auxPauta) )
                ),
                [Possui Pauta] = 1
            ),
            USERELATIONSHIP(auxPauta[SIGLA], fImpactado[Sigla Serviço Impactante]),
            ALL(fPauta)
        ),
        "Serviço Impactado",
        fImpactado[Sigla Serviço Impactado],
        "Início",
        auxPauta[Início]
    )
VAR vResultadoImpactado = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactado))
VAR vResultado =
    IF(
        OR(vResultadoImpactante > 0, vResultadoImpactado > 0),
        "Red"
    )
RETURN
vResultado

 

Pauta da Semana - 20230227.pbix 271.26 kB · 1 download

Erick,  parece que atendeu sim, ficou até melhor a apresentação.

Me tire uma dúvida.  A tabela auxPauta que você criou, é necessária ou posso corrigir o DAX para a tabela fPauta?
Ficou muito bom, muito obrigado!!!!!

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Agora, Fernando Santos disse:

Erick,  parece que atendeu sim, ficou até melhor a apresentação.

Me tire uma dúvida.  A tabela auxPauta que você criou, é necessária ou posso corrigir o DAX para a tabela fPauta?
Ficou muito bom, muito obrigado!!!!!

Agora vou entender melhor a Medida que você criou.  Valeu!!!!!

Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos

Opa Fernando;

Realmente não necessita da auxPauta, na ideia inicial achei que seria necessário, pode-se alcançar o mesmo resultado sem ela, segue o código comentado explicado o que foi feito:

 

Formatar Linha = 
VAR tTabelaBase = // Tabela com a sigla e o dia que servirá para o impactante e o impactado
    SUMMARIZE(
        fPauta,
        fPauta[SIGLA],
        fPauta[Início]
    )
VAR tTabelaImpactante =
    SELECTCOLUMNS( // Para utilizar a função INTERSECT, as tabelas utilizadas precisam ter as mesmas colunas, por isso a selectcolumns
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(fPauta,fImpactante), 
                    // Faz um Produto cartesiano entre a tabela pauta e a impactante e insere uma coluna virtual com o valor “1” para as linhas da tabela impactante que estão na tabela fPautas
                    fImpactante[Sigla Serviço Impactante],
                    fPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(fPauta) )
                ),
                [Possui Pauta] = 1
            ),
            ALL(fPauta)
        ),
        "Serviço Impactante",
        fImpactante[Sigla Serviço Impactante],
        "Início",
        fPauta[Início]
    )
VAR vResultadoImpactante = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactante)) 
VAR tTabelaImpactado =
    SELECTCOLUMNS(
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(fPauta,fImpactado),
                    fImpactado[Sigla Serviço Impactado],
                    fPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(fPauta) )
                ),
                [Possui Pauta] = 1
            ),
            ALL(fPauta)
        ),
        "Serviço Impactado",
        fImpactado[Sigla Serviço Impactado],
        "Início",
        fPauta[Início]
    )
VAR vResultadoImpactado = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactado))
VAR vResultado =
    IF(
        OR(vResultadoImpactante > 0, vResultadoImpactado > 0),
        "Red"
    )
RETURN
vResultado

 

Fiz a medida apenas para formatar a linha caso encontre 1 ou mais valores. Se deseja contabilizar quantas serviços tem, basta utilizar as variáveis vResultadoImpactado ou vResultadoImpactado.

  • Like 1
Link para o comentário
Compartilhar em outros sites

  • 0
  • Alunos
Em 04/03/2023 em 00:48, Erick Oliveira disse:

Opa Fernando;

Realmente não necessita da auxPauta, na ideia inicial achei que seria necessário, pode-se alcançar o mesmo resultado sem ela, segue o código comentado explicado o que foi feito:

 

Formatar Linha = 
VAR tTabelaBase = // Tabela com a sigla e o dia que servirá para o impactante e o impactado
    SUMMARIZE(
        fPauta,
        fPauta[SIGLA],
        fPauta[Início]
    )
VAR tTabelaImpactante =
    SELECTCOLUMNS( // Para utilizar a função INTERSECT, as tabelas utilizadas precisam ter as mesmas colunas, por isso a selectcolumns
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(fPauta,fImpactante), 
                    // Faz um Produto cartesiano entre a tabela pauta e a impactante e insere uma coluna virtual com o valor “1” para as linhas da tabela impactante que estão na tabela fPautas
                    fImpactante[Sigla Serviço Impactante],
                    fPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(fPauta) )
                ),
                [Possui Pauta] = 1
            ),
            ALL(fPauta)
        ),
        "Serviço Impactante",
        fImpactante[Sigla Serviço Impactante],
        "Início",
        fPauta[Início]
    )
VAR vResultadoImpactante = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactante)) 
VAR tTabelaImpactado =
    SELECTCOLUMNS(
        CALCULATETABLE(
            FILTER(
                SUMMARIZE(
                    CROSSJOIN(fPauta,fImpactado),
                    fImpactado[Sigla Serviço Impactado],
                    fPauta[Início],
                    "Possui Pauta",
                    INT ( NOT ISEMPTY(fPauta) )
                ),
                [Possui Pauta] = 1
            ),
            ALL(fPauta)
        ),
        "Serviço Impactado",
        fImpactado[Sigla Serviço Impactado],
        "Início",
        fPauta[Início]
    )
VAR vResultadoImpactado = COUNTROWS(INTERSECT(tTabelaBase,tTabelaImpactado))
VAR vResultado =
    IF(
        OR(vResultadoImpactante > 0, vResultadoImpactado > 0),
        "Red"
    )
RETURN
vResultado

 

Fiz a medida apenas para formatar a linha caso encontre 1 ou mais valores. Se deseja contabilizar quantas serviços tem, basta utilizar as variáveis vResultadoImpactado ou vResultadoImpactado.

Depois só me explique como a Medidada é chamada por favor.

Link para o comentário
Compartilhar em outros sites

Faça login para comentar

Você vai ser capaz de deixar um comentário após fazer o login



Entrar Agora
×
×
  • Criar Novo...