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).
| Onde | Segunda vale |
|---|---|
Date.DayOfWeek(data, Day.Monday) | 0 |
Constante Day.Monday | 1 (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ó:
// 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:
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.