Compter le nombre de jours ouvrés sur une période (PowerApps)

Étiquetté : , ,

  • Compter le nombre de jours ouvrés sur une période (PowerApps)

    Posté par Alexandre sur 22 mai 2022 à 13h57

    Bonjour à tous

    Récemment je me suis challengé tout seul à une “blague” d’un collègue proposant de compter le nombre de jours ouvrés sur une période.

    Alors je vous propose simplement une formule prête à l’emploi pour obtenir le nombre de jours ouvrés.

    Vous y trouverez également un calcul des jours fériés, ce qui peut bien évidemment être très utile.

    Celle ci utilise en entrée 2 contrôles date picker pour charger des variables dateDebut et dateFin dans un with. Mais bien entendu vous pourrez indiquer les dates de votre choix. Attention à respecter l’antériorité des dates, celle de début étant la plus antérieure (min), et celle de fin la plus postérieure (max).

    Pour vérifier mes calculs, je me suis servi d’un calendrier en ligne ( http://www.calendriergratuit.fr/calendrier-2023.htm sans lien car je ne suis absolument pas affilié à ce site…)

    With(n    {n        dateMin:Min(dtpDebut.SelectedDate;dtpFin.SelectedDate);// la date la plus anciennen        dateMax:Max(dtpDebut.SelectedDate;dtpFin.SelectedDate) // la date la plus récenten    };n    CountIf(n        //Tous les jours de la période considéréen        ForAll(n            Sequence(n                DateDiff( dateMin ; dateMax ; Days )+1;n                0;n                1n            );n            {jour:DateAdd(dateMin;Value;Days)}n        );n        //on y retire...n        !Or(n            //...les weekendsn            Weekday(jour;StartOfWeek.Monday) >= 6;n            //..et les jours fériésn            jour in n                //constitution de la totalité des congés sur les années couvertes par la périoden                With(n                    {n                        outputTable: Ungroup( n                            ForAll(n                                Sequence( DateDiff(dateMin;DateAdd(dateMax;1;Days);Years)+1 ;Year(dateMin) ) As an;n                                With(n                                    {n                                        Paques:n                                        22+Mod((19*Mod(an.Value;19))+24;30)+Mod((Mod(an.Value;4)*2)+(Mod(an.Value;7)*4)+(Mod((19*Mod(an.Value;19))+24;30)*6)+5;7)-1+Date(an.Value;3;1)n                                    };n                                    Table(n                                        {name:"Jour de l'an";date:Date(an.Value;1;1)};n                                        //{name:"Pâques";date:Paques};n                                        {name:"Lundi de Pâques";date:Paques+1};n                                        {name:"Fête du travail";date:Date(an.Value;5;1)};n                                        {name:"Victoire 1945";date:Date(an.Value;5;8)};n                                        {name:"Ascension";date:Paques+39};n                                        //{name:"Pentecôte";date:Paques+49};n                                        {name:"Lundi de Pentecôte";date:Paques+49+1};n                                        {name:"Fête Nationale";date:Date(an.Value;7;14)};n                                        {name:"Assomption";date:Date(an.Value;8;15)};n                                        {name:"Toussaint";date:Date(an.Value;11;1)};n                                        {name:"Armistice 1918";date:Date(an.Value;11;11)};n                                        {name:"Noël";date:Date(an.Value;12;25)}n                                    )n                                )n                            );n                            "Value"n                        )/* Fusionne les tables en une unique sans suppression des doublons */n                    };n                    ShowColumns( //Affiche seulement les colonnes nécessairesn                        GroupBy(n                            outputTable;n                            "date";n                            "Grouped"//Le dernier paramètre peut avoir n'importe quel nom, celui de la table enfant avec les données groupéesn                        );n                        //les mêmes colonnes utilisées par le groupBy excepté celle de la table enfantn                        "date"n                    )n                )n            n        )n    ) & " jours ouvrés"n)n

    PostID=V9o6ifeeaZrbsDP

    Geoffroy a répondu Il y a 7 mois, 3 semaines 1 Membre · 3 Réponses
  • 3 Réponses
  • Geoffroy

    Membre
    23 mai 2022 à 6h37

    Bonjour Alexandre,

    Bravo pour cette prouesse “calendaristique” !

    J’ai essayé de l’intégrer dans une appli en mettant Today() pour dateMin et la valeur d’une étiquette contenant une date postérieure à aujourd’hui pour dateMax. Mais j’ai un message d’erreur “Le premier argument de Sequence doit être compris entre 0 et 50 000”.

    Aurais-tu une idée de l’origine du problème ?

    CommentID=ZoX2483JpPLwapn, PostID=V9o6ifeeaZrbsDP

    • Alexandre

      Membre
      23 mai 2022 à 7h07

      Pour la date de ton étiquette tu dois transformer un texte représentant une date en un objet date.

      Pour cela tu peux faire un DateValue(monlabel.Text;”Fr-fr”)

      Ensuite il faut vraiment que la dateMin soit antérieure à la dateMax. Si besoin réemploi mes astuces avec les fonctions min() et max()

      SubCommentID=6knZPaJ9de4EglF, CommentID=ZoX2483JpPLwapn, PostID=V9o6ifeeaZrbsDP

    • Geoffroy

      Membre
      23 mai 2022 à 8h49

      Merci, ça marche ! 🙂

      SubCommentID=YWdIG70Flbxuunk, CommentID=ZoX2483JpPLwapn, PostID=V9o6ifeeaZrbsDP

Connectez-vous pour répondre.