2024-06-05
A force d’écrire la même formule en DAX pour créer un calendrier. Je me suis dit qu’il etait temps de faire une version à peu près définitive !
Dans ce code je récupère le calendrier à proprement parler (la liste des jours) avec la fonction CALENDARAUTO
. On peut tout aussi bien utiliser CALENDAR
Je calcule le jour de Paques et les jours fériés qui en découlent avec la méthode de Butcher-Meeus.
Les jours ouvrés correspondent aux jours hors week-end et hors jours fériers.
Les colonnes Week-end et Ouvré sont des entiers plutôt que des booléens. Cela permet de compter plus rapidement le nombre de jours (en faisant une somme sur la colonne).
Calendrier = VAR _local = "fr-fr"
VAR _cal = CALENDARAUTO() // CALENDAR(DATE(2020, 1, 1), DATE(2030, 1, 1))
VAR _ann = DISTINCT(SELECTCOLUMNS(_cal, "Année", YEAR([Date])))
VAR _paq = ADDCOLUMNS(_ann
, "Date", VAR _n = MOD([Année], 19)
VAR _c = FLOOR(DIVIDE([Année], 100), 1)
VAR _u = MOD([Année], 100)
VAR _s = FLOOR(DIVIDE(_c, 4), 1)
VAR _t = MOD(_c, 4)
VAR _p = FLOOR(DIVIDE(_c + 8, 25), 1)
VAR _q = FLOOR(DIVIDE(_c - _p + 1, 3), 1)
VAR _e = MOD((19 * _n) + _c - _s - _q + 15, 30)
VAR _b = FLOOR(DIVIDE(_u, 4), 1)
VAR _d = MOD(_u, 4)
VAR _L = MOD((2 * _t) + (2 * _b) - _e - _d + 32, 7)
VAR _h = FLOOR(DIVIDE(_n + (11 * _e) + (22 * _L), 451), 1)
VAR _m = FLOOR(DIVIDE(_e + _L - (7 * _h) + 114, 31), 1)
VAR _j = MOD(_e + _L - (7 * _h) + 114, 31) + 1
RETURN DATE([Année], _m, _j)
)
VAR _fet = UNION(SELECTCOLUMNS(_paq, "Fete", "Paques", "Date", [Date])
, SELECTCOLUMNS(_paq, "Fete", "Lundi de Paques", "Date", [Date] + 1)
, SELECTCOLUMNS(_paq, "Fete", "Ascension", "Date", [Date] + 39)
, SELECTCOLUMNS(_paq, "Fete", "Pentecôte", "Date", [Date] + 49)
, SELECTCOLUMNS(_paq, "Fete", "Lundi de Pentecôte", "Date", [Date] + 50)
, SELECTCOLUMNS(_ann, "Fête", "Jour de l'an", "Date", DATE([Année], 1, 1))
, SELECTCOLUMNS(_ann, "Fête", "Fête du travail", "Date", DATE([Année], 5, 1))
, SELECTCOLUMNS(_ann, "Fête", "Victoire 1945", "Date", DATE([Année], 5, 8))
, SELECTCOLUMNS(_ann, "Fête", "Fête nationale", "Date", DATE([Année], 7, 14))
, SELECTCOLUMNS(_ann, "Fête", "Assomption", "Date", DATE([Année], 8, 15))
, SELECTCOLUMNS(_ann, "Fête", "Toussaint", "Date", DATE([Année], 11, 1))
, SELECTCOLUMNS(_ann, "Fête", "Armistice 1918", "Date", DATE([Année], 11, 11))
, SELECTCOLUMNS(_ann, "Fête", "Noël", "Date", DATE([Année], 12, 25))
)
RETURN ADDCOLUMNS(ADDCOLUMNS(_cal
, "Année", YEAR([Date])
, "Année-mois", EOMONTH([Date], 0) // afficher au format "mmmm yyyy"
, "Mois", FORMAT([Date], "mmmm", _local) // trier par [Mois (num)]
, "Mois (num)", MONTH([Date])
, "Semaine (num)", WEEKNUM([Date], 2) // la semaine 1 contient le premier jour de l'année
, "Semaine ISO (num)", WEEKNUM([Date], 21) // la semaine 1 contient le premier jeudi de l'année
, "Jour semaine", FORMAT([Date], "dddd", _local) // trier par [Jour semaine (num)]
, "Jour semaine (num)", WEEKDAY([Date], 2)
, "Début semaine", [Date] - WEEKDAY([Date], 2) + 1 // premier jour de la semaine
, "Passé", IF([Date] < TODAY(), 1, 0) // indique si la date est antérieure à aujourd'hui
, "Rang année", YEAR([Date]) - YEAR(TODAY()) // années passées en négatif, années futures en positif
, "Rang mois", DATEDIFF(EOMONTH(TODAY(), 0), EOMONTH([Date], 0), MONTH) // mois passés en négatif, Mois futurs en positif
, "Week-end", IF(WEEKDAY([Date], 2) > 5, 1, 0)
, "Fête", MINX(FILTER(_fet, [Date] = EARLIER([Date])), [Fete])
), "Ouvré", IF([Week-end] = 0 && ISBLANK([Fête]), 1, 0)
)