J'essaie d'append une colonne personnalisée dans Power Query qui ajoute 3 jours ouvrables si une condition est remplie, sinon, append 2 jours ouvrables.
Je peux l'append conditionnellement des jours sans problème, mais j'ai du mal à append des journées de travail à la place. Je sais que cela se fait facilement dans Excel en utilisant =IF X = 1,WORKDAY([REFERENCE],3),WORKDAY([REFERENCE],2)
mais comment puis-je faire la même chose qu'une colonne personnalisée dans l'éditeur de requêtes?
Voici ce que j'ai, ce qui fait des jours, y compris les week-ends:
=if [REF]="1" then Date.AddDays([ETA],3) else Date.AddDays([ETA],2)
J'ai écrit une fonction personnalisée qui résout ce problème, à less que vous ne deviez prendre en count les vacances. C'est un peu universel, il fonctionne avec 2 ou 200 ou 2000 jours supplémentaires. Equals =WORKDAY(date;days)
dans Excel.
C'est ici:
(startDate, days) => let Step1 = List.Dates(Date.AddDays(startDate, 1), days + Number.RoundUp(days/7*3+4,0), #duration(1,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays Step3 = List.FirstN(Step2, days), //select required number of workdays Output = if days <= 0 then startDate else List.Last(Step3) in Output
Vous pouvez l'save en tant que requête, nommez-la, par exemple, AddWorkdays
, et utilisez-la comme ceci:
YourStepName = Table.AddColumn(yourTable, "CustomColumnName", each AddWorkdays([ETA], if [REF]="1" then 3 else 2) //note that [REF]="1" filters a text value, not number!
Sinon, vous pouvez insert cette fonction dans votre code comme
fnAddWorkdays = (startDate, days) => let Step1 = List.Dates(Date.AddDays(startDate, 1), days + Number.RoundUp(days/7*3+4,0), #duration(1,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays Step3 = List.FirstN(Step2, days), //select required number of workdays Output = if days <= 0 then startDate else List.Last(Step3) in Output,
Une solution est de le split en 2 composants:
Vous avez déjà mis en œuvre l'étape 1.
Vous devez maintenant implémenter l'étape 2, qui consiste à append les 2 jours supplémentaires si nécessaire. Vous pouvez utiliser la fonction DayOfWeek pour déterminer l'endroit où vous avez commencé, pour déterminer si vous aurez besoin de 2 jours supplémentaires:
Si vous ajoutez 3 jours ouvrés, vous devrez append 2 jours supplémentaires si le jour initial est le mercredi, le jeu ou le vendredi:
if Date.DayOfWeek([ETA], Day.Wednesday) <= 2 then {Add 2 more days}
Si vous ajoutez 2 jours ouvrés, vous devrez append 2 jours supplémentaires si le premier jour est le jeudi ou le vendredi:
if Date.DayOfWeek([ETA], Day.Thursday) <= 1 then {Add 2 more days}
Vous pouvez les incorporer dans votre déclaration initiale.