
Gérer les week-ends et les jours fériés d'un record dans sharepoint
Étiquetté : powerapps
Gérer les week-ends et les jours fériés d'un record dans sharepoint
Posté par Thika sur 15 décembre 2021 à 13h59Bonjour 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 1 année, 3 mois 1 Membre · 14 Réponses- 14 Réponses
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
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
@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
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
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
Merci pour le retour, j’ai enlevé les timer pour un bouton submit.
Voir mon code plus haut.
SubCommentID=JaNPAaO6fJDYFbs, CommentID=D49VMrVm3p9mWkf, PostID=PGGF2dlzyKLdZ63
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
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
@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
Salut, merci encore pour ton aide, c’est très apprécier. Ca fonctionne sauf que j’ai deux problèmes :
- 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.
- 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
@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
Connectez-vous pour répondre.