trouver le nombre de jour ouvré sans les feriés

Accueil – Le CFO masqué Forums Power Query trouver le nombre de jour ouvré sans les feriés

Mots-clés : 

  • Ce sujet contient 5 réponses, 3 participants et a été mis à jour pour la dernière fois par Antoine Fixary, le il y a 1 année et 6 mois.
6 sujets de 1 à 6 (sur un total de 6)
  • Auteur
    Articles
  • #100995
    patrickblancseau
    Participant

    Bonjour j’essais d’associer plusieurs requêtes dans power query
    mon but et de compte le nombre de jour ouvré et d’enlevé les ferié
    si quelqu’un a une idée je suis preneur
    Cordialement

    –>la premiere trouve les le weekends

    (DATE_DEBUT as date, DATE_FIN as date) as number =>
    let
        Liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN - DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
        Weekend = List.Select(Liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
        Supprimer_Weekend = List.RemoveItems(Liste_De_Date, Weekend),
        Nombre_De_Jours = List.Count(Supprimer_Weekend)
    in
        Nombre_De_Jours

    –>la deuxieme trouve les jours feriés

    let
        Source = (date) =>
    let
      annee = Date.Year(date),
      jour = Date.Day(date),
      mois = Date.Month(date),
      paques = fnJourPaques(annee),
      paquesLundi = Date.AddDays(paques, 1),
      ascension=Date.AddDays(paques, 39),
      pentecote=Date.AddDays(paques, 49),
      pentecoteLundi = Date.AddDays(pentecote, 1),
      estFerié =
        if (mois=1 and jour=1) then 1
        else if (mois=5 and jour=1) then 1
        else if (mois=5 and jour=8) then 1
        else if (mois=7 and jour=14) then 1
        else if (mois=8 and jour=15) then 1
        else if (mois=11 and jour=1) then 1
        else if (mois=11 and jour=11) then 1
        else if (mois=12 and jour=25) then 1
        //else if (date = paques) then 1
        else if (date = paquesLundi) then 1
        else if (date = ascension) then 1
        //else if (date = pentecote) then 1
        else if (date = pentecoteLundi) then 1
        else 0
    in
      estFerié
    in
        Source

    recherche du jour de paques

    let
        Source = (annee)=>
    let
      g = Number.Mod(annee,19),
      c = Number.IntegerDivide(annee,100),
      c4 = Number.IntegerDivide(c,4),
      e=Number.IntegerDivide((8*c+13),25),
      h=Number.Mod((19*g+ c-c4-e+15),30),
      h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
      k=Number.IntegerDivide(h2,28),
      p=Number.IntegerDivide(29,(h2+1)),
      q=Number.IntegerDivide((21-g),11),
      i=(k*p*q-1)*k+h2,
      b=Number.IntegerDivide(annee,4)+annee,
      j1=b+i+2+c4-c,
      j2=Number.Mod(j1,7),
      r=28+i-j2,
      jourDePaquesSTR="01/03/"&Text.From(annee),
      jourDePaquesDate = Date.FromText(jourDePaquesSTR),
      jourDePaques=Date.AddDays(jourDePaquesDate, r-1)
    in
      jourDePaques
    in
        Source
    #101125
    Stéphane Lorin
    Participant

    Bonjour
    ça me parait bien compliqué.
    Personnellement j’aurai une liste de jour fériés dans une table manuelle (ce sont des données figées, variables suivant les pays/régions)

    ensuite je préfère sélectionner les jours du lundi au vendredi plutôt que de retirer les WE et ensuite retirer les jours fériés

    (DATE_DEBUT as date, DATE_FIN as date) as number =>
    let
    Liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
    Hors_Weekend = List.Select(Liste_De_Date, each Date.DayOfWeek(_, Day.Monday) <= 5),
    #”Supprimer_Fériés” = List.RemoveItems(Liste_De_Date, Jours_Fériés),
    Nombre_De_Jours = List.Count(#”Supprimer_Fériés”)
    in
    Nombre_De_Jours

    #101251
    patrickblancseau
    Participant

    Bonjour stephaen,
    j’y avais pensé, mais je me suis dit que cela est encore une table en plus
    mais vu la complexité et le temps, j’ai choisis ta solution
    merci

    #127168
    Antoine Fixary
    Participant

    Bonjour, je viens après la guerre, mais jamais le même problème et les codes ci*dessus m’ont permis de le résoudre.

    Ci-joint, mon humble contribution.

    Fonction fnJoursOuvresAnnee

    A utiliser si l’on est certain que la période ne concerne toujours qu’une seule année :
    [code]
    // Calcul le nombre de jours ouvrées (hors week-end et jours fériés)

    (DATE_DEBUT as date, DATE_FIN as date) as number =>
    let
    annee = Date.Year(DATE_DEBUT),

    ////////////////////////////////
    // Calcul du jour du dimanche de Pâques (nécessaire pour calcul des jours fériés)
    ////////////////////////////////
    g = Number.Mod(annee,19),
    c = Number.IntegerDivide(annee,100),
    c4 = Number.IntegerDivide(c,4),
    e=Number.IntegerDivide((8*c+13),25),
    h=Number.Mod((19*g+ c-c4-e+15),30),
    h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
    k=Number.IntegerDivide(h2,28),
    p=Number.IntegerDivide(29,(h2+1)),
    q=Number.IntegerDivide((21-g),11),
    i=(k*p*q-1)*k+h2,
    b=Number.IntegerDivide(annee,4)+annee,
    j1=b+i+2+c4-c,
    j2=Number.Mod(j1,7),
    r=28+i-j2,
    jourDePaquesSTR=”01/03/”&Text.From(annee),
    jourDePaquesDate = Date.FromText(jourDePaquesSTR),
    paques=Date.AddDays(jourDePaquesDate, r-1),

    ////////////////////////////////
    // Création de la liste des jours fériés
    ////////////////////////////////
    jourDeLAn = #date(annee,1,1),
    paquesVendredi = Date.AddDays(paques, -2),
    paquesLundi = Date.AddDays(paques, 1),
    feteTravail = #date(annee,5,1),
    victoire1945 = #date(annee,5,8),
    ascension=Date.AddDays(paques, 39),
    pentecote=Date.AddDays(paques, 49),
    pentecoteLundi = Date.AddDays(pentecote, 1),
    feteNationale = #date(annee,7,14),
    assomption = #date(annee,8,15),
    toussaint = #date(annee,11,1),
    armistice1918 = #date(annee,11,11),
    noel = #date(annee,12,25),
    saintEtienne = #date(annee,12,26),
    joursFeries = {jourDeLAn} & {paquesVendredi} & {paques} & {paquesLundi} & {feteTravail} & {victoire1945} & {ascension} & {pentecote} & {pentecoteLundi} & {feteNationale} & {assomption} & {toussaint} & {armistice1918} & {noel} & {saintEtienne},

    ////////////////////////////////
    // Calcul du nombre de jours ouvrés entre 2 dates d’une même année
    ////////////////////////////////
    liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
    weekend = List.Select(liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
    supprimer_Weekend = List.RemoveItems(liste_De_Date, weekend),
    supprimer_JoursFeriés = List.RemoveItems(supprimer_Weekend, joursFeries),
    nombre_De_Jours = List.Count(supprimer_JoursFeriés)
    in
    nombre_De_Jours
    [/code]

    Fonction fnJoursOuvresMultiAnnee à utliser si la période peut courir sur ou
    ans (nécessite fnJoursOuvresAnnee)

    [code]
    // Calcul le nombre de jours ouvrées (hors week-end et jours feriés) jusqu’a des dates espacées de 2 ans.

    (DATE_DEBUT as date, DATE_FIN as date) as number =>
    let
    anneeDebut = Date.Year(DATE_DEBUT),
    anneeFin = Date.Year(DATE_FIN),
    nombre_De_Jours = if anneeFin – anneeDebut = 0 then
    fnJoursOuvresAnnee(DATE_DEBUT,DATE_FIN)
    else if anneeFin – anneeDebut = 1 then
    fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
    else if anneeFin – anneeDebut = 2 then
    fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeDebut+1,1,1),#date(anneeDebut+1,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
    else
    error “Ecart de plus de 2 ans entre les dates”
    in
    nombre_De_Jours
    [/code]

    Ces codes ne sont pas nécessairement optimisés, mais ils font le job.

    Belle journée

    #127189
    Antoine Fixary
    Participant

    Bonjour,

    n’ayant pas trouvé le moyen de modifié mon post précédent, ci-dessous mon code légèrement amélioré.

    Si quelqu’un connait la syntaxe pour intégré du code sur ce forum, je suis intéressé, par ce n’est pas du BBcode à priori.

    Toujours 2 fonctions en fonction des besoins :

    Fonction fnJoursOuvresAnnee – A utiliser si l’on est certain que la période ne concerne toujours qu’une seule année :

    // Calcul le nombre de jours ouvrées (hors week-end et jours fériés)

    (DATE_DEBUT as date, DATE_FIN as date) as number =>
    let
    annee = Date.Year(DATE_DEBUT),

    ////////////////////////////////
    // Calcul du jour du dimanche de Pâques (nécessaire pour calcul des jours fériés)
    ////////////////////////////////
    g = Number.Mod(annee,19),
    c = Number.IntegerDivide(annee,100),
    c4 = Number.IntegerDivide(c,4),
    e=Number.IntegerDivide((8*c+13),25),
    h=Number.Mod((19*g+ c-c4-e+15),30),
    h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
    k=Number.IntegerDivide(h2,28),
    p=Number.IntegerDivide(29,(h2+1)),
    q=Number.IntegerDivide((21-g),11),
    i=(k*p*q-1)*k+h2,
    b=Number.IntegerDivide(annee,4)+annee,
    j1=b+i+2+c4-c,
    j2=Number.Mod(j1,7),
    r=28+i-j2,
    paques=Date.AddDays(#date(annee,3,1), r-1),

    ////////////////////////////////
    // Création de la liste des jours fériés
    ////////////////////////////////
    joursFeries = {#date(annee,1,1), // Jour de l’an
    Date.AddDays(paques, -2), // Vendredi saint (férié en Alsace Moselle)
    Date.AddDays(paques, 1), // Dimanche de Pâques
    #date(annee,5,1), // Fête du travail
    #date(annee,5,8), // Victoire 1945
    Date.AddDays(paques, 39), // Ascension
    Date.AddDays(paques, 49), // Pentecote
    Date.AddDays(paques, 50), // Lundi de pentecote
    #date(annee,7,14), // Fête nationale
    #date(annee,8,15), // Assomption
    #date(annee,11,1), // La Toussaint
    #date(annee,11,11), // Armistice 1918
    #date(annee,12,25), // Noel
    #date(annee,12,26)}, // Saint-Etienne (férié en Alsace Moselle)

    ////////////////////////////////
    // Calcul du nombre de jours ouvrés entre 2 dates d’une même année
    ////////////////////////////////
    liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
    weekend = List.Select(liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
    supprimer_Weekend = List.RemoveItems(liste_De_Date, weekend),
    supprimer_JoursFeriés = List.RemoveItems(supprimer_Weekend, joursFeries),
    nombre_De_Jours = List.Count(supprimer_JoursFeriés)
    in
    nombre_De_Jours

    Fonction fnJoursOuvresMultiAnnee à utiliser si la période peut courir sur 1 ou
    2 ans (nécessite fnJoursOuvresAnnee)

    // Calcul le nombre de jours ouvrées (hors week-end et jours feriés) jusqu’a des dates espacées de 2 ans.

    (DATE_DEBUT as date, DATE_FIN as date) as number =>
    let
    anneeDebut = Date.Year(DATE_DEBUT),
    anneeFin = Date.Year(DATE_FIN),
    nombre_De_Jours = if anneeFin – anneeDebut = 0 then
    fnJoursOuvresAnnee(DATE_DEBUT,DATE_FIN)
    else if anneeFin – anneeDebut = 1 then
    fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
    else if anneeFin – anneeDebut = 2 then
    fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeDebut+1,1,1),#date(anneeDebut+1,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
    else
    error “Ecart de plus de 2 ans entre les dates”
    in
    nombre_De_Jours

    Belle journée à tous.

    #127190
    Antoine Fixary
    Participant

    Encore une petite coquille (pourquoi on ne peut pas modifier ces posts ?)

    Nouveau code à changer pour le calcul du la liste “joursFeries”, erreur mineure pour Pâques :
    ////////////////////////////////
    // Création de la liste des jours fériés
    ////////////////////////////////
    joursFeries = {#date(annee,1,1), // Jour de l’an
    Date.AddDays(paques, -2), // Vendredi saint (férié en Alsace Moselle)
    paques, // Dimanche de Pâques
    Date.AddDays(paques, 1), // Lundi de Pâques
    #date(annee,5,1), // Fête du travail
    #date(annee,5,8), // Victoire 1945
    Date.AddDays(paques, 39), // Ascension
    Date.AddDays(paques, 49), // Pentecote
    Date.AddDays(paques, 50), // Lundi de pentecote
    #date(annee,7,14), // Fête nationale
    #date(annee,8,15), // Assomption
    #date(annee,11,1), // La Toussaint
    #date(annee,11,11), // Armistice 1918
    #date(annee,12,25), // Noel
    #date(annee,12,26)}, // Saint-Etienne (férié en Alsace Moselle)

6 sujets de 1 à 6 (sur un total de 6)
  • Vous devez être connecté pour répondre à ce sujet.