// ===================================================================================== // MEDIDAS DAX — PAINEL DE RH DA FILIAL (FILIAL CENTRO) // Modelo de portfólio · dados fictícios · João Victor Soares // Base: Base_RH_Filial_Ficticia.xlsx · competências out/2025 a set/2026 · retrato em 22/10/2026 // ===================================================================================== // // COMO USAR ESTE ARQUIVO // 1. Tabelas calculadas (dCalendario, dSetor, dEtapaFunil): Modelagem › Nova tabela. // Cole o bloco inteiro, do nome da tabela até o fim da expressão. // 2. Medidas: crie uma tabela vazia "_Medidas" (Página Inicial › Inserir dados › nome // "_Medidas" › Carregar). Selecione-a e use Modelagem › Nova medida, colando UM bloco // por vez — do "Nome da Medida =" até a linha anterior ao próximo bloco. // Os comentários (//) dentro do bloco podem ir junto: o DAX aceita comentários. // Depois de criar a primeira medida, exclua a coluna "Coluna1" da tabela _Medidas. // 3. Separador de argumentos: vírgula; separador decimal nas fórmulas: ponto (1.5). // É o padrão do Power BI Desktop, inclusive em português. Só troque para ponto e // vírgula se a sua instalação estiver configurada para separadores DAX da localidade. // 4. "Formato" e "Pasta" nos comentários são sugestões para Ferramentas de medida // (formato do número) e para a Pasta de exibição (Exibição de modelo › Propriedades). // 5. Aplique um filtro de RELATÓRIO em dCalendario[Competência] de 01/10/2025 a 01/09/2026 // (o período coberto pela base). Sem ele, os meses de 2025 anteriores a outubro // aparecem com quadro incompleto, porque a base não traz quem saiu antes de out/2025. // // // ===================================================================================== // 1. MODELO — RELACIONAMENTOS (Exibição de modelo › Gerenciar relações) // ===================================================================================== // Todos com filtro em direção ÚNICA (do lado 1 para o lado *). // Confira as relações criadas automaticamente na importação e apague as que não // estiverem nesta lista. // // De (lado 1) Para (lado *) Card. Filtro Ativa? // --------------------------- ------------------------------- ----- ------ ------------- // dColaboradores[Matricula] fPonto[Matricula] 1:* Único Sim // dColaboradores[Matricula] fBancoHoras[Matricula] 1:* Único Sim // dColaboradores[Matricula] fFerias[Matricula] 1:* Único Sim // dColaboradores[Matricula] fAfastamentos[Matricula] 1:* Único Sim // dSetor[Setor] dColaboradores[Setor] 1:* Único Sim // dSetor[Setor] fVagas[Setor] 1:* Único Sim // dCalendario[Data] fPonto[Competencia] 1:* Único Sim // dCalendario[Data] fBancoHoras[Competencia] 1:* Único Sim // dCalendario[Data] fAfastamentos[DataInicio] 1:* Único Sim // dCalendario[Data] fVagas[DataAbertura] 1:* Único Sim // dCalendario[Data] fVagas[DataFechamento] 1:* Único NÃO (inativa) // dCalendario[Data] fChamados[DataAbertura] 1:* Único Sim // dCalendario[Data] fChamados[DataResolucao] 1:* Único NÃO (inativa) // dCalendario[Data] fFerias[LimiteConcessivo] 1:* Único NÃO (inativa) // // Observações de modelagem // • dColaboradores NÃO se relaciona com dCalendario. As medidas de quadro (Headcount, // Admissões, Desligamentos) leem o intervalo do calendário e comparam com // DataAdmissao/DataDesligamento. Assim não surgem dois caminhos de filtro até fPonto // (dCalendario → fPonto e dCalendario → dColaboradores → fPonto). // • Relações inativas são ligadas só dentro da medida, com USERELATIONSHIP // (Vagas Fechadas, Tempo Médio de Fechamento, Chamados Resolvidos, Férias com Limite // no Período). // • fFerias usa relação INATIVA com o calendário de propósito: os indicadores de férias // são um "retrato" na data de referência e não devem mudar com o filtro de período. // • fChamados não tem setor nem matrícula: a segmentação por setor não o filtra. // • Tipos (Power Query): datas como "Data" (não Data/Hora), Matricula como Número inteiro, // Salario como Número decimal fixo, colunas de horas como Número decimal. // // // ===================================================================================== // 2. TABELAS CALCULADAS (Modelagem › Nova tabela) // ===================================================================================== dCalendario = // Calendário de 01/01/2025 a 31/12/2026. // Depois de criar: Ferramentas de tabela › Marcar como tabela de datas › coluna Data. // Classificar por coluna: "Mês/Ano" por "AnoMês" e "Mês" por "Mês nº". // Se quiser enxergar limites concessivos de férias de 2027 em diante, amplie a data final. VAR Datas = SELECTCOLUMNS( CALENDAR(DATE(2025, 1, 1), DATE(2026, 12, 31)), "Data", [Date] ) VAR ComColunas = ADDCOLUMNS( Datas, "Ano", YEAR([Data]), "Mês nº", MONTH([Data]), "Mês", SWITCH( MONTH([Data]), 1, "jan", 2, "fev", 3, "mar", 4, "abr", 5, "mai", 6, "jun", 7, "jul", 8, "ago", 9, "set", 10, "out", 11, "nov", 12, "dez" ), "AnoMês", YEAR([Data]) * 100 + MONTH([Data]), "Competência", DATE(YEAR([Data]), MONTH([Data]), 1) ) RETURN ADDCOLUMNS( ComColunas, "Mês/Ano", [Mês] & "/" & RIGHT(FORMAT([Ano], "0"), 2) // ex.: "out/25" ) dSetor = // Dimensão de setor compartilhada: a mesma segmentação filtra colaboradores (e, por eles, // ponto, banco de horas, férias e afastamentos) e vagas. // DISTINCT (e não VALUES) evita erro de dependência circular ao criar as relações. // Alternativa, se preferir: criar esta lista no Power Query. DISTINCT( UNION( DISTINCT(dColaboradores[Setor]), DISTINCT(fVagas[Setor]) ) ) dEtapaFunil = // Tabela de apoio para o gráfico de Funil (sem relação com outras tabelas). // Classificar por coluna: "Etapa" por "Ordem". DATATABLE( "Etapa", STRING, "Ordem", INTEGER, { { "Inscritos", 1 }, { "Triados", 2 }, { "Entrevistados", 3 }, { "Aprovados", 4 }, { "Contratados", 5 } } ) // ===================================================================================== // 3. MEDIDAS AUXILIARES Pasta: 0 Auxiliares // ===================================================================================== Data de Referência = // Data do "retrato" da base fictícia. Usada por medidas de situação atual // (Afastados Hoje, Saldo a Vencer em 30 dias, Dias até o Limite Concessivo) e para // não projetar o quadro em meses que ainda não aconteceram. // EM PRODUÇÃO, substitua por TODAY(). Atenção: no serviço do Power BI, TODAY() usa UTC; // para o horário de Brasília use: // VAR Agora = UTCNOW() - TIME(3, 0, 0) RETURN DATE(YEAR(Agora), MONTH(Agora), DAY(Agora)) // Formato: Data (dd/mm/aaaa). DATE(2026, 10, 22) Data Fim do Período = // Último dia do período filtrado, limitado à Data de Referência. // Depende de: dCalendario (só leitura do intervalo). // Formato: Data (dd/mm/aaaa). MIN(MAX(dCalendario[Data]), [Data de Referência]) // ===================================================================================== // 4. QUADRO Pasta: 1 Quadro // Dependem de: dColaboradores (+ dSetor para a segmentação de setor). // Leem o intervalo de dCalendario sem relação física com dColaboradores. // ===================================================================================== Headcount = // Colaboradores ativos no ÚLTIMO dia do período selecionado: // admitidos até essa data E (sem desligamento OU desligados depois dela). // Usa as datas do cadastro, não a coluna Status (Status só vale para a data de hoje). // Meses posteriores à Data de Referência ficam em branco. // Formato: Número inteiro. VAR DataFim = [Data Fim do Período] VAR PeriodoFuturo = MIN(dCalendario[Data]) > [Data de Referência] RETURN IF( NOT PeriodoFuturo, CALCULATE( COUNTROWS(dColaboradores), dColaboradores[DataAdmissao] <= DataFim, ISBLANK(dColaboradores[DataDesligamento]) || dColaboradores[DataDesligamento] > DataFim ) ) Headcount Médio = // Média do headcount de fechamento de cada mês do período (até a Data de Referência). // É o denominador do turnover. Em um único mês, equivale ao headcount de fechamento. // Depende de: dCalendario[Competência]. // Formato: Número decimal, 1 casa. AVERAGEX( FILTER( VALUES(dCalendario[Competência]), dCalendario[Competência] <= [Data de Referência] ), [Headcount] ) Admissões = // Admissões com DataAdmissao dentro do período filtrado. // Formato: Número inteiro. VAR DataIni = MIN(dCalendario[Data]) VAR DataFim = MAX(dCalendario[Data]) RETURN CALCULATE( COUNTROWS(dColaboradores), dColaboradores[DataAdmissao] >= DataIni && dColaboradores[DataAdmissao] <= DataFim ) Desligamentos = // Desligamentos com DataDesligamento dentro do período filtrado (ativos ficam de fora, // pois DataDesligamento em branco não entra no intervalo). // Use com dColaboradores[TipoDesligamento] no eixo para ver "quem sai e por quê". // Formato: Número inteiro. VAR DataIni = MIN(dCalendario[Data]) VAR DataFim = MAX(dCalendario[Data]) RETURN CALCULATE( COUNTROWS(dColaboradores), dColaboradores[DataDesligamento] >= DataIni && dColaboradores[DataDesligamento] <= DataFim ) Desligamentos Voluntários = // Pedidos de demissão no período. "Acordo (art. 484-A)" é extinção por acordo entre as // partes e fica fora; inclua-o se a política da empresa o tratar como voluntário. // Formato: Número inteiro. CALCULATE( [Desligamentos], dColaboradores[TipoDesligamento] = "Pedido de demissão" ) Turnover % = // Rotatividade = ((Admissões + Desligamentos) / 2) / Headcount Médio. // Formato: Porcentagem, 1 casa decimal. DIVIDE( ([Admissões] + [Desligamentos]) / 2, [Headcount Médio] ) Turnover Voluntário % = // Rotatividade por iniciativa do colaborador = Desligamentos Voluntários / Headcount Médio. // Formato: Porcentagem, 1 casa decimal. DIVIDE([Desligamentos Voluntários], [Headcount Médio]) Tempo Médio de Casa (anos) = // Média de anos de empresa de quem está ativo no fim do período. // YEARFRAC com base 1 = dias reais / ano real. // Formato: Número decimal, 1 casa. VAR DataFim = [Data Fim do Período] RETURN AVERAGEX( FILTER( dColaboradores, dColaboradores[DataAdmissao] <= DataFim && ( ISBLANK(dColaboradores[DataDesligamento]) || dColaboradores[DataDesligamento] > DataFim ) ), YEARFRAC(dColaboradores[DataAdmissao], DataFim, 1) ) Prazo para Pagamento da Rescisão = // Para a tabela de desligamentos (uma linha por colaborador): término do contrato // + 10 dias corridos para pagar as verbas e entregar os documentos (CLT, art. 477, § 6º). // Considera DataDesligamento como término do contrato. // Formato: Data (dd/mm/aaaa). VAR Termino = MAX(dColaboradores[DataDesligamento]) RETURN IF( HASONEVALUE(dColaboradores[Matricula]) && NOT ISBLANK(Termino), Termino + 10 ) // ===================================================================================== // 5. PONTO Pasta: 2 Ponto // Dependem de: fPonto → dColaboradores (Matricula) e fPonto → dCalendario (Competencia). // ===================================================================================== Horas Previstas = // Formato: Número decimal, 1 casa. SUM(fPonto[HorasPrevistas]) Horas de Faltas = SUM(fPonto[HorasFaltas]) Horas de Atestados = SUM(fPonto[HorasAtestados]) Horas de Atrasos = SUM(fPonto[HorasAtrasos]) Horas de Ausência = // Faltas + atestados + atrasos (em horas). // Formato: Número decimal, 1 casa. [Horas de Faltas] + [Horas de Atestados] + [Horas de Atrasos] Absenteísmo % = // (Faltas + atestados + atrasos) / horas previstas. // Formato: Porcentagem, 1 casa decimal. DIVIDE([Horas de Ausência], [Horas Previstas]) Horas Extras 50% = SUM(fPonto[HorasExtras50]) Horas Extras 100% = SUM(fPonto[HorasExtras100]) Horas Extras Totais = // Formato: Número decimal, 1 casa. [Horas Extras 50%] + [Horas Extras 100%] HE % sobre Horas Previstas = // Peso da hora extra na jornada contratada. // Formato: Porcentagem, 1 casa decimal. DIVIDE([Horas Extras Totais], [Horas Previstas]) Horas de Adicional Noturno = SUM(fPonto[HorasAdicionalNoturno]) Custo Estimado de HE (sem encargos) = // ESTIMATIVA. Valor-hora = salário / 220 (jornada de 44 h semanais). // HE 50% = horas × valor-hora × 1,5 · HE 100% = horas × valor-hora × 2. // Não inclui encargos (INSS patronal, FGTS) nem reflexos (DSR, férias, 13º) e usa o // salário atual do cadastro (a base não guarda histórico salarial). // Depende de: relação ativa fPonto → dColaboradores (Matricula), exigida pelo RELATED. // Formato: Moeda R$, 2 casas. SUMX( fPonto, VAR ValorHora = RELATED(dColaboradores[Salario]) / 220 RETURN fPonto[HorasExtras50] * ValorHora * 1.5 + fPonto[HorasExtras100] * ValorHora * 2 ) // ===================================================================================== // 6. BANCO DE HORAS Pasta: 3 Banco de horas // Dependem de: fBancoHoras → dColaboradores (Matricula) e → dCalendario (Competencia). // ===================================================================================== Saldo Banco de Horas = // Saldo final (em horas) na ÚLTIMA competência do contexto. Medida semiaditiva: saldos de // meses diferentes não se somam. Em um gráfico mensal, cada mês mostra o seu saldo. // A última competência é buscada sem o filtro de colaborador/setor, para que quem já saiu // (sem lançamento no último mês) não entre no total. // Formato: Número decimal, 1 casa. VAR UltimaCompetencia = CALCULATE( MAX(fBancoHoras[Competencia]), REMOVEFILTERS(dColaboradores), REMOVEFILTERS(dSetor) ) RETURN CALCULATE( SUM(fBancoHoras[SaldoFinal]), fBancoHoras[Competencia] = UltimaCompetencia ) Saldo a Vencer em 30 dias = // Horas positivas do banco que vencem nos 30 dias seguintes à Data de Referência. // No banco de horas por acordo individual, a compensação deve ocorrer em até 6 meses // (CLT, art. 59, § 5º); a coluna VencimentoSaldo traz esse prazo para os créditos de // cada competência. // Lógica — compensação na ordem de chegada (créditos mais antigos são usados primeiro): // por colaborador, a parte do saldo atual que ainda pertence aos créditos que vencem = // mínimo entre (créditos que vencem) e (saldo atual − créditos lançados depois deles). // Medida de "retrato": ignora o filtro de período e respeita setor/colaborador. // Formato: Número decimal, 1 casa. VAR DataRef = [Data de Referência] VAR DataLimite = DataRef + 30 VAR UltimaCompetencia = CALCULATE( MAX(fBancoHoras[Competencia]), REMOVEFILTERS(dCalendario), REMOVEFILTERS(dColaboradores), REMOVEFILTERS(dSetor) ) RETURN SUMX( VALUES(dColaboradores[Matricula]), VAR SaldoAtual = CALCULATE( SUM(fBancoHoras[SaldoFinal]), REMOVEFILTERS(dCalendario), fBancoHoras[Competencia] = UltimaCompetencia ) VAR CompetenciaVencendo = CALCULATE( MAX(fBancoHoras[Competencia]), REMOVEFILTERS(dCalendario), fBancoHoras[VencimentoSaldo] >= DataRef && fBancoHoras[VencimentoSaldo] <= DataLimite ) VAR CreditosVencendo = CALCULATE( SUM(fBancoHoras[Creditos]), REMOVEFILTERS(dCalendario), fBancoHoras[VencimentoSaldo] >= DataRef && fBancoHoras[VencimentoSaldo] <= DataLimite ) VAR CreditosPosteriores = CALCULATE( SUM(fBancoHoras[Creditos]), REMOVEFILTERS(dCalendario), fBancoHoras[Competencia] > CompetenciaVencendo ) VAR SaldoDosCreditosAntigos = SaldoAtual - CreditosPosteriores RETURN IF( CreditosVencendo > 0 && SaldoDosCreditosAntigos > 0, MIN(CreditosVencendo, SaldoDosCreditosAntigos) ) ) // ===================================================================================== // 7. FÉRIAS Pasta: 4 Férias // Dependem de: fFerias → dColaboradores (Matricula). // A relação com dCalendario (LimiteConcessivo) é INATIVA: o filtro de período não altera // estes números. A coluna Situacao já vem calculada na data de referência da base. // ===================================================================================== Períodos de Férias = // Formato: Número inteiro. COUNTROWS(fFerias) Férias Vencidas = // Limite concessivo ultrapassado sem gozo: férias devidas em dobro (CLT, art. 137). // Formato: Número inteiro. CALCULATE( COUNTROWS(fFerias), fFerias[Situacao] = "Vencida" ) Férias Críticas = // Menos de 60 dias para o limite concessivo e ainda sem programação. // Formato: Número inteiro. CALCULATE( COUNTROWS(fFerias), fFerias[Situacao] = "Crítica (< 60 dias)" ) Férias a Programar = // Direito adquirido, sem data de gozo definida e fora da faixa crítica. // Formato: Número inteiro. CALCULATE( COUNTROWS(fFerias), fFerias[Situacao] = "A programar" ) % Férias em Dia = // Entre os períodos com direito adquirido (Situação diferente de "Em aquisição"), // a parcela que não está vencida nem crítica. // Formato: Porcentagem, 1 casa decimal. VAR PeriodosAdquiridos = CALCULATE( COUNTROWS(fFerias), fFerias[Situacao] <> "Em aquisição" ) VAR EmRisco = [Férias Vencidas] + [Férias Críticas] RETURN DIVIDE(PeriodosAdquiridos - EmRisco, PeriodosAdquiridos) Dias até o Limite Concessivo = // Para a tabela de férias (uma linha por período aquisitivo). Negativo = já vencido. // Formato: Número inteiro. VAR Limite = MAX(fFerias[LimiteConcessivo]) RETURN IF( HASONEVALUE(fFerias[InicioAquisitivo]) && NOT ISBLANK(Limite), DATEDIFF([Data de Referência], Limite, DAY) ) Férias com Limite no Período = // Períodos ainda não gozados cujo limite concessivo cai no período filtrado — agenda de // programação por mês. Liga a relação inativa dCalendario[Data] → fFerias[LimiteConcessivo]. // Formato: Número inteiro. CALCULATE( COUNTROWS(fFerias), USERELATIONSHIP(dCalendario[Data], fFerias[LimiteConcessivo]), NOT (fFerias[Situacao] IN { "Gozada", "Em aquisição" }) ) // ===================================================================================== // 8. AFASTAMENTOS Pasta: 5 Afastamentos // Dependem de: fAfastamentos → dColaboradores (Matricula) e → dCalendario (DataInicio). // As somas de dias são atribuídas ao mês de INÍCIO do afastamento. // Nunca leve CID para o modelo: a base guarda apenas o motivo genérico. // ===================================================================================== Afastamentos = // Formato: Número inteiro. COUNTROWS(fAfastamentos) Afastados Hoje = // Colaboradores com afastamento em curso na Data de Referência // (DataInicio <= data <= DataFim). Medida de "retrato": ignora o filtro de período. // Formato: Número inteiro. VAR DataRef = [Data de Referência] RETURN CALCULATE( DISTINCTCOUNT(fAfastamentos[Matricula]), REMOVEFILTERS(dCalendario), fAfastamentos[DataInicio] <= DataRef, fAfastamentos[DataFim] >= DataRef ) Dias de Afastamento = // Formato: Número inteiro. SUM(fAfastamentos[Dias]) Dias pagos pela Empresa = // Nos afastamentos por doença ou acidente, os 15 primeiros dias ficam com a empresa. // Na base, a licença-maternidade aparece com 0 dia empresa e 0 dia INSS, porque o // salário-maternidade é pago pela empresa e compensado nas contribuições previdenciárias. // Formato: Número inteiro. SUM(fAfastamentos[DiasEmpresa]) Dias INSS = // Dias a partir do 16º, cobertos por benefício do INSS (B31 ou B91). // Formato: Número inteiro. SUM(fAfastamentos[DiasINSS]) Com Estabilidade Acidentária = // Colaboradores com garantia de emprego de 12 meses após o fim do auxílio acidentário // (Lei 8.213/1991, art. 118), conforme a coluna FimEstabilidade da base. // Formato: Número inteiro. VAR DataRef = [Data de Referência] RETURN CALCULATE( DISTINCTCOUNT(fAfastamentos[Matricula]), REMOVEFILTERS(dCalendario), fAfastamentos[FimEstabilidade] >= DataRef ) // ===================================================================================== // 9. RECRUTAMENTO E SELEÇÃO Pasta: 6 Recrutamento // Dependem de: fVagas → dCalendario (DataAbertura ativa; DataFechamento inativa) // e fVagas → dSetor (Setor). // ===================================================================================== Vagas Abertas = // Vagas em aberto no último dia do período: abertas até a data e sem fechamento até ela. // Remove o filtro do calendário (a relação ativa por DataAbertura contaria só as vagas // abertas DENTRO do período) e aplica a regra pelas datas. // Formato: Número inteiro. VAR DataFim = [Data Fim do Período] RETURN CALCULATE( COUNTROWS(fVagas), REMOVEFILTERS(dCalendario), fVagas[DataAbertura] <= DataFim, ISBLANK(fVagas[DataFechamento]) || fVagas[DataFechamento] > DataFim ) Vagas Abertas no Período = // Vagas com DataAbertura no período (relação ativa). // Formato: Número inteiro. COUNTROWS(fVagas) Vagas Fechadas = // Vagas com DataFechamento no período. Liga a relação inativa por DataFechamento. // Formato: Número inteiro. CALCULATE( COUNTROWS(fVagas), USERELATIONSHIP(dCalendario[Data], fVagas[DataFechamento]), NOT ISBLANK(fVagas[DataFechamento]) ) Tempo Médio de Fechamento (dias) = // Dias corridos entre abertura e fechamento das vagas FECHADAS no período. // Liga a relação inativa por DataFechamento. // Formato: Número decimal, 1 casa. CALCULATE( AVERAGEX( FILTER(fVagas, NOT ISBLANK(fVagas[DataFechamento])), DATEDIFF(fVagas[DataAbertura], fVagas[DataFechamento], DAY) ), USERELATIONSHIP(dCalendario[Data], fVagas[DataFechamento]) ) Taxa de Conversão = // Contratados / Inscritos das vagas abertas no período (relação ativa por DataAbertura). // Vagas ainda em andamento puxam a taxa para baixo até serem fechadas. // Formato: Porcentagem, 1 casa decimal. DIVIDE(SUM(fVagas[Contratados]), SUM(fVagas[Inscritos])) Vagas por Fonte = // Vagas fechadas no período por fonte do candidato contratado. // Use com fVagas[Fonte] no eixo (vagas abertas ainda não têm fonte). // Formato: Número inteiro. CALCULATE( [Vagas Fechadas], NOT ISBLANK(fVagas[Fonte]) ) % Vagas por Fonte = // Participação de cada fonte no total de vagas fechadas no período. // Formato: Porcentagem, 1 casa decimal. DIVIDE( [Vagas por Fonte], CALCULATE([Vagas por Fonte], REMOVEFILTERS(fVagas[Fonte])) ) Candidatos na Etapa = // Para o gráfico de Funil: dEtapaFunil[Etapa] em Categoria e esta medida em Valores. // Considera as vagas abertas no período (relação ativa por DataAbertura). // Formato: Número inteiro. SWITCH( SELECTEDVALUE(dEtapaFunil[Etapa]), "Inscritos", SUM(fVagas[Inscritos]), "Triados", SUM(fVagas[Triados]), "Entrevistados", SUM(fVagas[Entrevistados]), "Aprovados", SUM(fVagas[Aprovados]), "Contratados", SUM(fVagas[Contratados]) ) // ===================================================================================== // 10. ATENDIMENTO DO RH Pasta: 7 Atendimento // Dependem de: fChamados → dCalendario (DataAbertura ativa; DataResolucao inativa). // ===================================================================================== Chamados = // Chamados abertos no período. // Formato: Número inteiro. COUNTROWS(fChamados) Chamados Dentro do SLA = // Formato: Número inteiro. CALCULATE( COUNTROWS(fChamados), fChamados[DentroSLA] = "Sim" ) % Dentro do SLA = // Formato: Porcentagem, 1 casa decimal. DIVIDE([Chamados Dentro do SLA], [Chamados]) Tempo Médio de Resolução (dias úteis) = // Formato: Número decimal, 1 casa. AVERAGE(fChamados[DiasUteisResolucao]) Chamados Resolvidos = // Chamados com DataResolucao no período. Liga a relação inativa por DataResolucao. // Formato: Número inteiro. CALCULATE( COUNTROWS(fChamados), USERELATIONSHIP(dCalendario[Data], fChamados[DataResolucao]) ) // ===================================================================================== // 11. FORMATAÇÃO CONDICIONAL Pasta: 8 Formatação // Uso: Formatação condicional › Cor de fundo (ou Cor da fonte) › Formatar estilo: // "Valor do campo" › escolha a medida. As cores são as de good/neutral/bad do tema. // Os limites de absenteísmo e SLA são ilustrativos: ajuste às metas da empresa. // ===================================================================================== Cor Situação Férias = SWITCH( SELECTEDVALUE(fFerias[Situacao]), "Vencida", "#D9452B", "Crítica (< 60 dias)", "#C98A0B", "Programada", "#1E8A5A", "Gozada", "#1E8A5A" ) Cor % SLA = VAR Valor = [% Dentro do SLA] RETURN SWITCH( TRUE(), ISBLANK(Valor), BLANK(), Valor >= 0.9, "#1E8A5A", Valor >= 0.8, "#C98A0B", "#D9452B" ) Cor Absenteísmo = VAR Valor = [Absenteísmo %] RETURN SWITCH( TRUE(), ISBLANK(Valor), BLANK(), Valor <= 0.025, "#1E8A5A", Valor <= 0.04, "#C98A0B", "#D9452B" ) // ===================================================================================== // 12. SEGURANÇA EM NÍVEL DE LINHA (RLS) — EXEMPLO // Modelagem › Gerenciar funções. Não são medidas: cada expressão vai no filtro da tabela. // Pré-requisito: tabela de mapeamento dAcessoGestor (Email, Gestor, Setor), sem relação // com as demais tabelas e oculta no relatório. // ===================================================================================== // // Função "Gestor" // Tabela dColaboradores: // [Gestor] IN // CALCULATETABLE( // VALUES(dAcessoGestor[Gestor]), // dAcessoGestor[Email] = USERPRINCIPALNAME() // ) // → o filtro desce para fPonto, fBancoHoras, fFerias e fAfastamentos pela Matricula. // // Tabela fVagas: // [Setor] IN // CALCULATETABLE( // VALUES(dAcessoGestor[Setor]), // dAcessoGestor[Email] = USERPRINCIPALNAME() // ) // // Tabela dAcessoGestor: // [Email] = USERPRINCIPALNAME() // // Função "RH": sem filtros (acesso total). // Teste em Modelagem › Exibir como. No serviço, associe os e-mails às funções em // Segurança do modelo semântico.