Gérer les week-ends et les jours fériés d'un record dans sharepoint

Étiquetté : 

  • Gérer les week-ends et les jours fériés d'un record dans sharepoint

    Posté par Thika sur 15 décembre 2021 à 13h59

    Bonjour la communauté,

    Je suis novice en powerapps. J’ai crée une apps qui me permet d’enregistrer la même donnée mais a des dates différentes selon la date de début et de fin que je renseigne dans un formulaire.

    Grâce a @Didier Gbenou et @R3dKap que je remercie encore. J’ai utilisé la solution avec les timer. Ce que je voudrais c’est gérer les wek-end et jours fériés. Je voudrais qu’il n’y ait aucun record pour les week-end et jours fériés. Par ex si je crée un enregistrement du 15 déc. au 20 déc., qu’il n’y ai aucun enregistrement pour le weekend soit le 11 déc. et le 12 dec. Même chose pour les jours fériés. J’ai regardé ici et la des solutions mais je n’arrive a pas a l’adapté a mon problème. Ce que je sais au moins, c’est que je dois crée une table avec les jours férié.

    Dans OnTimerEnd du timer1, ajouter la date uniquement si ce n’est pas un week-end ou un jour férié dans la collection ?

    Voici mon code

    Timer 1

    On select

    Set(var;0);;nClear(colDates);;n

    OnTimerEnd

    Collect(colDates;{date : DateAdd (DataCardValue5.SelectedDate;var;Days)});; Set(var;var+1);;n

    Repeat

    If ( var < DateDiff(DataCardValue5.SelectedDate; DatePicker4.SelectedDate);true;false)n

    Timer2

    OnTimerEnd

    ForAll(colDates; n       Patch(GestionList; Defaults(GestionList); n       {Staff: DataCardValue3.Selected; n        Assiduite: DataCardValue4.Selected; n        DateP: ThisRecord.date} )n       );;n

    J’ai un formulaire qui me permet de saisir

    Le nom (Staff), l’assiduité (Bureau par ex), DateP (date de début) et date de fin(date de fin) et une liste SharePoint avec 3 champs Staff, Assiduite, DateP

    Votre aide serait appréciée.

    Merci

    PostID=PGGF2dlzyKLdZ63

    Thika a répondu Il y a 11 mois, 3 semaines 1 Membre · 14 Réponses
  • 14 Réponses
  • Thika

    Membre
    15 décembre 2021 à 19h12

    Dans mon time2

    OnTimerEnd, j’ai rajouté cette instruction. Mais ca ne fais rien du tout. Merci !

    RemoveIf (colDates;Weekday(date)=1,7);;nForAll(colDates; n       Patch(GestionList; Defaults(GestionList); n       {Staff: DataCardValue3.Selected; n        Assiduite: DataCardValue4.Selected; n        DateP: ThisRecord.date} )n       );;n

    CommentID=qC5LwMiM48nwIfz, PostID=PGGF2dlzyKLdZ63

  • Theophile CHIN-NIN

    Membre
    16 décembre 2021 à 9h02

    Bonjour,

    Je comprend pas bien l’utilisation du timer.

    Vous avez un formulaire avec 2 champs Date de début et Date de fin et vous voulez créer autant de Record que de jour entre ces 2 dates sauf pour les samedi dimanche, c’est bien ca ?

    Théo

    CommentID=aFiuDjyiDWnOk9O, PostID=PGGF2dlzyKLdZ63

  • R3dKap

    Membre
    16 décembre 2021 à 10h42

    @Theophile CHIN-NIN voir son post précédent :

    @Thika n’hésite pas à continuer à poser tes questions dans le même post d’origine pour que l’ensemble des informations soient rassemblées au même endroit… 😉

    Sinon, sans vouloir absolument te faire changer d’avis, mais je trouve vraiment la solution du timer beaucoup plus compliqué que simplement le bout de code que j’avais proposé… mais bon… 😉 Y’à qu’à voir la réaction de @Theophile CHIN-NIN d’ailleurs… 😊

    Pour ce qui est d’exclure les samedis, dimanches et jours fériés, effectivement il te faut créer une table des jours fériés. Ensuite, l’idée de base n’est pas de supprimer les enregistrements que tu aurais créés en trop mais plutôt de faire le travail en amont, dans le Timer1, au moment de la construction de la liste des dates qui va servir au Timer2.

    C’est à dire que dans le OnTimerEnd de Timer1, il faudrait que tu écrives quelque chose comme ceci :

    Set(n    newDate; n    DateAdd(n        DataCardValue5.SelectedDate;n        var;n        Daysn    )n);;nIf(n    WeekDay(// Exclusion du dimanchen        newDate;n        StartOfWeek.Sundayn    ) <> 1 &&n    WeekDay(// Exclusion du samedin        newDate;n        StartOfWeek.Sundayn    ) <> 7 &&n    IsBlank(// Exclusion des jours fériésn        LookUp(n            JoursFériés;n            DateJourFérié = newDaten        )n    );n    Collect(n        colDates;n        {n            date: newDaten        }n    )n);;nSet(var;var+1);;n

    JourFériés c’est ta liste des jours fériés dans laquelle tu as une colonne DateJourFérié qui contient la date du jour férié.

    Voilà, n’hésite pas si tu coinces sur quelque chose…

    CommentID=gTLjFbVtZvEkITJ, PostID=PGGF2dlzyKLdZ63

    • Thika

      Membre
      16 décembre 2021 à 23h50

      @R3dKap

      Merci pour le retour. JE m’excuse pour les multiples posts.

      J’ai donc suivi vos conseils. J’ai changé mon formulaire pour des comboBox. En effet ca fonctionne très bien.

      J’ai crée ma liste JourFériés avec une colonne DateJourFérié

      J’essaie d’intégrer le code que tu m’as suggéré, j’ai juste bpc d’erreur lorsque j’essaie d’intégré la condition IF.

      Voici le code de mon bouton submit

      OnSelect

       ClearCollect(n    colGestionList; Defaults(GestionList)n);;nSet(newDate;DateAdd(DatePickerDebut.SelectedDate;var;Days));;nnClear(colGestionList);;nForAll(n    Sequence(n        DateDiff(n            DatePickerDebut.SelectedDate;n            DatePickerFin.SelectedDaten        ) + 1n    );n    Collect(n        colGestionList;n        Defaults(GestionList)n    );;n    Update(n        colGestionList;n        Last(colGestionList);n        {n              Staff: ComboBoxNom.Selected;n             Assiduite:  ComboBoxAssiduite.Selected;n         n            DateP: DateAdd(n                DatePickerDebut.SelectedDate;n                Value - 1n            )n        }n    )n);;nPatch(GestionList; colGestionList);;n

      SubCommentID=eqG8BwLoEEcEeBq, CommentID=gTLjFbVtZvEkITJ, PostID=PGGF2dlzyKLdZ63

  • Theophile CHIN-NIN

    Membre
    16 décembre 2021 à 10h58

    Hello,

    Comme dit Manu, le timer n’est pas optimal.

    Voici une formule pour générer une collection qui comprend 1 ligne par jour hors Samedi/Dimanche et jours fériés contenu dans une collection de jours fériés, entre deux dates :

    ClearCollect(n colDaysBeetweenDates,n Filter(n AddColumns(n Sequence(n DateDiff(n StartDate,n EndDaten ),n 0,n 1n ),n "Date",n DateAdd(n StartDate.SelectedDate,n Valuen )n ),n Weekday(Date,StartOfWeek.Monday) <> 6 n && Weekday(Date,StartOfWeek.Monday) <> 7n && !(Date in colJourFerie.date)n )n)n

    CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • Thika

      Membre
      16 décembre 2021 à 23h51

      @Theophile CHIN-NIN

      Merci pour le retour, j’ai enlevé les timer pour un bouton submit.

      Voir mon code plus haut.

      SubCommentID=JaNPAaO6fJDYFbs, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • Thika

      Membre
      17 décembre 2021 à 17h42

      @Theophile CHIN-NIN

      Merci pour ton code.

      J’utilise maintenant un bouton a la place du timer.

      J’ai crée une liste SharePoint JoursFériés avec une colonne DateJourFérié.

      J’ai essayé d’intégré ton code mais j’ai l’ erreur suivante : 1 argument ont été reçus, 2 étaient attendus

      Mon formulaire

      OnSelect de mon bouton.

      ClearCollect(colDaysBeetweenDates;Filter( AddColumns(Sequence( DateDiff(DatePickerDebut.SelectedDate;  DatePickerFin.SelectedDate);0;1);"Date"; DateAdd(DatePickerDebut.SelectedDate;StartOfWeek.Monday) <> 6 && Weekday(Date;StartOfWeek.Monday) <> 7 && !(Date in JoursFériés.DateJourFérié) ) );;n// pour remplir ma listenClear(colGestionList);;nForAll(n    Sequence(n        DateDiff( DatePickerDebut.SelectedDate;  DatePickerFin.SelectedDate) + 1);n        Collect(colGestionList;Defaults(GestionList));;nn    Update(n        colGestionList;n        Last(colGestionList);n        {n          Staff: ComboBoxNom.Selected;n          Assiduite: ComboBoxAssiduite.Selected;n          DateP: DateAdd(n                DatePickerDebut.SelectedDate;n                Value - 1n            )n        }n    )n);;nPatch(GestionList; colGestionList);;n

      SubCommentID=gfgeJDoKik6E15F, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • R3dKap

      Membre
      20 décembre 2021 à 10h15

      Salut @Thika ,

      Voici le code corrigé auquel j’ai rajouté un DropColumns() pour retirer la colonne Value qui a servi à générer les dates :

      ClearCollect(n    colDaysBetweenDates,n    DropColumns(n        Filter(n            AddColumns(n                Sequence(n                    DateDiff(n                        DatePickerDebut.SelectedDate;n                        DatePickerFin.SelectedDaten                    );n                    0;n                    1n                );n                "Date";n                DateAdd(n                    DatePickerDebut.SelectedDate;n                    Valuen                )n            );n            Weekday(n                Date;n                StartOfWeek.Mondayn            ) <> 6 && Weekday(n                Date;n                StartOfWeek.Mondayn            ) <> 7 && !(Date in JoursFériés.DateJourFérié)n        ),n        "Value"n    )n)n

      Voici ce que ça donne :

      @Thika : autre chose… si jamais tu as des erreurs dans une formule, pour nous aider à mieux la pister fait une capture de l’erreur avec la souris qui survole l’erreur (à l’endroit où c’est souligné en rouge plus foncé), comme ceci :

      SubCommentID=h1tq2ufcwoj0Atq, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • R3dKap

      Membre
      20 décembre 2021 à 10h28

      @Thika, du coup, à la suite du code ci-dessus (attention je l’ai modifié récemment, prends bien la dernière version en rafraîchissant la page), tu devrais avoir le code suivant pour boucler la boucle :

      Clear(colGestionList);;nForAll(n    colDaysBewteenDates;n    Collect(n        colGestionList;n        Defaults(GestionList)n    );;n    Update(n        colGestionList;n        Last(colGestionList);n        {n            Staff: ComboBoxNom.Selected;n            Assiduite:  ComboBoxAssiduite.Selected;         n            DateP: Daten        }n    )n);;nPatch(GestionList; colGestionList);;n

      SubCommentID=hIPQROx25udT5ks, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • Thika

      Membre
      20 décembre 2021 à 13h36

      @R3dKap

      Salut, merci encore pour ton aide, c’est très apprécier. Ca fonctionne sauf que j’ai deux problèmes :

      1. Par ex : du 29 dec au 05 janv, le record du 05 janvier ne se crée pas. Je n’ai aucun message d’erreur. Toujours aucun enregistrement le dernier jour.
      2. Il ne considère pas la collection de jours fériés. J’ai ds l’idée que c’est peut-être le format de date. Mais dans mon sélecteur de date j’ai le format jj/mm/aaaa. C’est le même format que j’ai reproduit ds la collection de dates.

      ma collection

      OnStart de l’appli.

      ClearCollect(colHolidays;n             Split("25-12-2021,27-12-2021,31-12-2021,01-01-2022, 03-01-20222";n                   ","n             )n)nn

      OnSelect de mon bouton

      ClearCollect(colDaysBeetweenDates;DropColumns(Filter(AddColumns(Sequence(nnDateDiff(DatePickerDebut_1.SelectedDate;DatePickerFin_1.SelectedDate);0;1);"Date";nnDateAdd(DatePickerDebut_1.SelectedDate;Value));nnWeekday(Date;StartOfWeek.Monday) <> 6 && Weekday(Date;StartOfWeek.Monday) <> 7 && !(Date in colHolidays.Result));"Value"));;nnClear(colGestionList);;nnForAll(n    colDaysBeetweenDates;n    Collect(colGestionList;n        Defaults(GestionList)n    );;n    Update(n        colGestionList;n        Last(colGestionList);n        {n            Staff: ComboBoxNom_1.Selected;n            Assiduite:  ComboBoxAssiduite_1.Selected; n               n            DateP: Daten        }n    )n);;nPatch(GestionList; colGestionList);;  n

      SubCommentID=l55vL76G5WiGLvb, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • R3dKap

      Membre
      20 décembre 2021 à 15h32

      @Thika s’il ne fait jamais le dernier jour, alors il faut juste rajouter un “+1” juste après la parenthèse fermante du DateDiff() :

      DateDiff(DatePickerDebut_1.SelectedDate;DatePickerFin_1.SelectedDate);0;1)+1;"Date";n

      Et c’est normal que les jours fériés ne marchent pas. Le tiret “-” est le séparateur des dates au format américain. C’est le slash “/” qui doit être utilisé pour les dates françaises. Mais malgré cela, je ne suis pas sûr que le ClearCollect() que tu fais avec des chaînes (dates entre des guillements) te crée vraiment des dates au final dans ta collection :

      ClearCollect(n    colHolidays;n    Split(n        "25-12-2021,27-12-2021,31-12-2021,01-01-2022, 03-01-20222";n        ","n    )n)n

      Du coup 2 solutions…

      1) Tu remplaces les “-” par des “/” dans ton code ci-dessus et il faut que tu modifies ta condition sur les jours fériés comme ceci :

      && !(Text(Date, DateTimeFormat.ShortDate, "fr-FR") in colHolidays.Result)n

      2) Tu modifies la manière dont tu remplis ta collection colHolidays pour y mettre de vraies dates comme ceci (et du coup rien d’autre à changer) :

      ClearCollect(n    colHolidays;n    DateValue("25/12/2021", "fr-FR"),n    DateValue("27/12/2021", "fr-FR"),n    DateValue("31/12/2021", "fr-FR"),n    DateValue("01/01/2022", "fr-FR"),n    DateValue("03/01/2022", "fr-FR")n)n

      Y’a sûrement moyen de faire plus élégant ou plus optimisé, mais ça ça devrait déjà marcher… 😊

      SubCommentID=z3w17I7weBnKx9s, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • Thika

      Membre
      21 décembre 2021 à 17h22

      @R3dKap

      Merci encore de ton aide.

      Lorsque j’essaie d’ajouter +1 a datediff, ca me donne des messages d’erreurs sur la fonction

      Merci !

      SubCommentID=EEjJzOjGTrKpzqy, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • R3dKap

      Membre
      21 décembre 2021 à 17h52

      @Thika pardon je me suis trompé d’emplacement pour le +1 :

      DateDiff(DatePickerDebut_1.SelectedDate;DatePickerFin_1.SelectedDate)+1;0;1);"Date";n

      SubCommentID=7ck0aNYtG32n7Z3, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

    • Thika

      Membre
      21 décembre 2021 à 18h11

      @R3dKap Je te dit grand merci. Je suis a 20 minutes de ma présentation. Tout fonctionne a merveille.

      SubCommentID=9bVxySSaZMJK0wN, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63

Connectez-vous pour répondre.