Feriados e calendário

M

1. Dia da semana: a numeração

fnNthWeekday, fnLastWeekday e o calendário usam 0 (segunda) a 6 (domingo) — a numeração de Date.DayOfWeek(data, Day.Monday).

OndeSegunda vale
Date.DayOfWeek(data, Day.Monday)0
Constante Day.Monday1 (Day.Sunday = 0)
DAX WEEKDAY(data, 2)1

Atenção Com essa numeração, fim de semana é >= 5 (sábado = 5, domingo = 6).

2. Tabela de feriados no modelo

As funções fnHolidaysInPeriod* já devolvem tabela tipada e ordenada; a consulta que as usa fica com um passo só:

M
// TabIntHolidayPT
let
    Fonte = fnHolidaysInPeriodPT(Date.From(DataInicioProjeto), Date.From(DataFimProjeto))
in
    Fonte

Date.From protege contra parâmetro do tipo Data/Hora: passar um datetime para um parâmetro as date dá erro de conversão.

3. Duas festas na mesma data

A Páscoa cai em 21/04 (Tiradentes) em 2030; a Ascension caiu em 01/05 em 2008. Mesclar a tabela de feriados direto no calendário duplica o dia e quebra o relacionamento 1:N com as fatos. Agrupe por data antes:

M
let
    FeriadosPT = Table.Group(TabIntHolidayPT, {"DateReference"}, {
        {"HolidayPT", each Text.Combine(List.Distinct([HolidayPT]), " / "), type text},
        {"IsNationalHolidayPT", each List.Contains([HolidayType], "Feriado nacional"), type logical}
    })
in
    FeriadosPT

4. Nomes reservados: RangeStart e RangeEnd

Não chame de RangeStart/RangeEnd as consultas que calculam o início e o fim do projeto. Esses nomes são dos parâmetros do Incremental Refresh, que precisam ser Parâmetros de Consulta do tipo Data/Hora. Se o modelo ganhar Incremental Refresh, os nomes colidem — e uma tabela de feriados filtrada pelos parâmetros do IR traria só os feriados de cada partição. Use nomes próprios, como DataInicioProjeto e DataFimProjeto.

Fontes

Conhecer a trilha Power BI ao vivo