Ajouter x nombre de jours ouvrables à une date dans une colonne personnalisée

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:

  1. Selon votre état initial, ajoutez 2 ou 3 jours
  2. Si cela se termine un samedi ou un dimanche, ajoutez 2 jours supplémentaires pour passer le week-end

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.