Dates et jours ouvrables

Étiquetté : 

  • Dates et jours ouvrables

    Posté par Mick sur 27 mars 2023 à 15h53

    Bonjour la commu,

    Je cherche à calculer un délais de réponse sur une LSP, ( ça ça fonctionne) mais en tenant compte des jours ouvrables.

    Par exemple une demande le vendredi soir nécessite une réponse avant le mardi soir et pas le dimanche.

    Je n’ai rien trouvé sur internet pour gérer cette situation. Avez vous trouvé quelques chose pour tenir compte des weekends et jours fériés ?

    Merci d’avance.

    PostID=JOkQBIMfO7SBtxA

    Mick a répondu Il y a 11 mois, 4 semaines 1 Membre · 8 Réponses
  • 8 Réponses
  • Mick

    Membre
    27 mars 2023 à 15h57

    Souvent la réponse est dans la question.

    Si on est vendredi, j’ajoute deux jours a une variable.

    Pour les jours fériés, c’est moins facile.

    Il faudrait les lister et regarder les dates entre les différents délai pour ajouter des jours supplémentaires. 🤔

    CommentID=dBaagkhRnqQtG9e, PostID=JOkQBIMfO7SBtxA

  • DavidZed

    Membre
    27 mars 2023 à 16h43

    Bonjour,

    Pour les jours ouvrables, tu peux utiliser la formule ci-après (Dans l’exemple on calcule le nombre de jours entre deux date pickers, qui ne sont ni des samedi, ni des dimanches ) :

    With(n    {n        // Table of all dates between start and end daten        DateRange: ForAll(n            Sequence(DatePickerFin.SelectedDate - DatePickerDebut.SelectedDate + 1),n            DatePickerDebut.SelectedDate + Value - 1n        )n    },n    If(n        And(n            IsBlank(DatePickerDebut.SelectedDate),n            IsBlank(DatePickerFin.SelectedDate)n        ),n        // show nothing if any date pickers are blankn        0,n        // Count if Week day is from Monday to Fridayn        CountIf(n            DateRange,n            Weekday(Value,11) < 6n        )n    )n)

    Pour les jours fériés, le plus simple est de créer une liste sharepoint avec deux colonnes : ‘Titre’ et ‘Date’, et d’ajouter une condition dans le countIf à la fin :

    With(n    {n        // Table of all dates between start and end daten        DateRange: ForAll(n            Sequence(DatePickerFin.SelectedDate - DatePickerDebut.SelectedDate + 1),n            DatePickerDebut.SelectedDate + Value - 1n        )n    },n    If(n        And(n            IsBlank(DatePickerDebut.SelectedDate),n            IsBlank(DatePickerFin.SelectedDate)n        ),n        // show nothing if any date pickers are blankn        0,n        // Count if Week day is from Monday to Fridayn        CountIf(n            DateRange,n            Weekday(Value,11) < 6n            Not(Value in 'Liste Jours Fériés'.Date)n        )n    )n)

    CommentID=naN6Vm7ZLrwpwtR, PostID=JOkQBIMfO7SBtxA

  • Geoffroy

    Membre
    27 mars 2023 à 17h13

    J’avais trouvé il y a quelque temps une commande pas très simple qui est censé répondre à cette question. Je vous la vends comme je l’ai achetée, sans vérification exhaustive, ni garantie de résultat.
    En tout cas, elle ne cause pas de bug (c’est déjà ça) mais ne me demandez pas de vous l’expliquer 😉

    If(DateDiff(DateValue(Text(Today();”dd/mm/yyyy”;”Fr-fr”));DateValue(lbl_Date_Courante.Text;”Fr-fr”);TimeUnit.Days)>=-1;

    With(

    {

    dateMin:DateValue(Text(Today();”dd/mm/yyyy”;”Fr-fr”));// la date la plus ancienne

    dateMax:DateValue(lbl_Date_Courante.Text;”Fr-fr”) // la date la plus récente

    };

    CountIf(

    //Tous les jours de la période considérée

    ForAll(

    Sequence(

    DateDiff( dateMin ; dateMax ; TimeUnit.Days )+1;

    0;

    1

    );

    {jour:DateAdd(dateMin;Value;TimeUnit.Days)}

    );

    //on y retire…

    !Or(

    //…les weekends

    Weekday(jour;StartOfWeek.Monday) >= 6;

    //..et les jours fériés

    jour in

    //constitution de la totalité des congés sur les années couvertes par la période

    With(

    {

    outputTable: Ungroup(

    ForAll(

    Sequence( DateDiff(dateMin;DateAdd(dateMax;1;TimeUnit.Days);TimeUnit.Years)+1 ;Year(dateMin) ) As an;

    With(

    {

    Paques:

    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)

    };

    Table(

    {name:”Jour de l’an”;date:Date(an.Value;1;1)};

    //{name:”Pâques”;date:Paques};

    {name:”Lundi de Pâques”;date:Paques+1};

    {name:”Fête du travail”;date:Date(an.Value;5;1)};

    {name:”Victoire 1945″;date:Date(an.Value;5;8)};

    {name:”Ascension”;date:Paques+39};

    //{name:”Pentecôte”;date:Paques+49};

    {name:”Lundi de Pentecôte”;date:Paques+49+1};

    {name:”Fête Nationale”;date:Date(an.Value;7;14)};

    {name:”Assomption”;date:Date(an.Value;8;15)};

    {name:”Toussaint”;date:Date(an.Value;11;1)};

    {name:”Armistice 1918″;date:Date(an.Value;11;11)};

    {name:”Noël”;date:Date(an.Value;12;25)}

    )

    )

    );

    “Value”

    )/* Fusionne les tables en une unique sans suppression des doublons */

    };

    ShowColumns( //Affiche seulement les colonnes nécessaires

    GroupBy(

    outputTable;

    “date”;

    “Grouped”//Le dernier paramètre peut avoir n’importe quel nom, celui de la table enfant avec les données groupées

    );

    //les mêmes colonnes utilisées par le groupBy excepté celle de la table enfant

    “date”

    )

    )

    )

    )

    )

    )

    CommentID=N79N4H2OhEboySj, PostID=JOkQBIMfO7SBtxA

  • Mick

    Membre
    31 mars 2023 à 9h32

    Ca ressemble à usine à gaz, mais qui mérite d’être étudiée. Il faudra de toute façon gérer ce cas courant d’une manière ou d’une autre.

    Merci je vous tiens au courant.

    CommentID=whrj9UAYLzX9rZn, PostID=JOkQBIMfO7SBtxA

    • Alexandre

      Membre
      19 avril 2023 à 20h26

      Mais non ce n’est pas une usine à gaz (en tous cas quand je l’ai écrite ca ne l’était pas 😛 )
      Par contre j’ai eut aussi le besoin de calculer X jours ouvrés à partir d’une date et je m’y suis cassé les dents. Je n’ai pas réussi à trouvé un moyen de le faire… Mais je suis persuadé que c’est faisable alors courage !

      SubCommentID=EzkimxXUBnO0EUM, CommentID=whrj9UAYLzX9rZn, PostID=JOkQBIMfO7SBtxA

    • Mick

      Membre
      27 novembre 2023 à 15h31

      Bonjour Alexandre Perret,

      Du coup, sur la gestion des jours ouvrés, j’ai trouvé cette méthode ingénieuse qui fonctionne plutôt pas mal. Attention toutefois à la gestion au delà du nombre de jours ouvrés du tableau.

      ys to a date in a Power Automate Flow (tachytelic.net)

      J’ai testé, et j’approuve.
      Pour la liste des jours féries j’ai crée une Liste Sharepoint.
      Je ne sais pas si c’est la meilleur solution. Il est possible qu’un code complet faisant le calcul directement doit être plus efficace.
      Effectivement la difficulté réside dans la transposition de la formule de calcul bien connu dans Excel. Je vais étudier votre proposition qui semble fonctionner. A quel endroit faut-il la déposer pour qu’elle fonctionne ? J’ai tenté dans un message, mais bien qu’il ne me donner pas d’alerte, il calcule pas grand chose. 🤔

      Merci d’avance.

      SubCommentID=7b8pTCYCWdXmAAV, CommentID=whrj9UAYLzX9rZn, PostID=JOkQBIMfO7SBtxA

    • Alexandre

      Membre
      27 novembre 2023 à 22h18

      Cela commence à dater 🙂 mais je dirais de mémoire qu’il vous suffit de renseigner dateMin et dateMax dans le premier with, et que l’ensemble doit retourner le nombre de jours ouvrés ( https://ppfc.fr/bdc/post/compter-le-nombre-de-jours-ouvres-sur-une-periode-powerapps-V9o6ifeeaZrbsDP )

      SubCommentID=DmSQbhMPLfdM7EZ, CommentID=whrj9UAYLzX9rZn, PostID=JOkQBIMfO7SBtxA

  • Mick

    Membre
    28 novembre 2023 à 10h58

    C’est ce que je pensais c’est une approche PowerApps.
    Plutôt instructive au demeurant. J’avais dans l’idée de tenir à jour une LSP avec les dates des jours féries pour les exclure des calcules de délais de résolution. Je réfléchis à la manière dont je pourrai traduire ça en PowerAutomat.
    Ceci étant dit si le calcul se fait dans l’interface PowerAutomat directement ça évide de charger Automat inutilement.
    A réfléchir.

    Merci de ce lien.

    CommentID=fMc7mpzXFtHs2cY, PostID=JOkQBIMfO7SBtxA

Connectez-vous pour répondre.