2017-02-07 24 views
0

Я пытаюсь добавить настраиваемый столбец в Power Query, который добавляет 3 рабочих дней, если условие выполнено, иначе добавьте 2 рабочих дня.Добавить x количество рабочих дней до даты в настраиваемом столбце

У меня есть возможность условно добавлять дни без проблем, но вместо этого мне приходится добавлять рабочие дни. Я знаю, что это легко сделать в excel, используя =IF X = 1,WORKDAY([REFERENCE],3),WORKDAY([REFERENCE],2), но как я могу сделать то же самое, что и пользовательский столбец в редакторе запросов?

Ниже то, что я имею, который делает дни, включая выходные дни:

=if [REF]="1" then Date.AddDays([ETA],3) else Date.AddDays([ETA],2)

ответ

1

Решение состоит в том, чтобы разбить его на 2-х компонентов:

  1. Основываясь на своем первоначальном состоянии, добавить 2 или 3 дня
  2. Если это закончится в субботу или воскресенье, добавьте еще 2 дня, чтобы пропустить выходные

Вы уже реализовали Шаг 1.

Теперь вам нужно реализовать Шаг 2, который должен добавить 2 дополнительных дня, если потребуется. Вы можете использовать функцию DayOfWeek, чтобы определить, где вы начали, чтобы определить, нужны ли вам дополнительные 2 дня:

Если вы добавляете 3 рабочих дня, вам нужно добавить еще 2 дня, если в начальный день Ср, Чт или Пт:

if Date.DayOfWeek([ETA], Day.Wednesday) <= 2 then {Add 2 more days} 

Если вы добавляете 2 рабочих дней, то вам необходимо добавить 2 дополнительных дней, если первоначальный день чт или пт:

if Date.DayOfWeek([ETA], Day.Thursday) <= 1 then {Add 2 more days} 

You могут включить их в ваше первоначальное утверждение.

+0

Michael, ваш код обеспечивает неправильное решение. 1, среда + 2 рабочих дня = пятница. 2nd, 'Date.DayOfWeek ([ETA], Day.Wednesday) <= 3' означает * wendesday - суббота *. В-третьих, есть случаи, когда нужно добавить 2 или 3 дня, это требует различной обработки. – Eugene

+0

Я уточнил свой ответ. Я просто предлагаю решение добавить еще 2 дня, если потребуется, чтобы обработать выходные. Я также предположил, что OP может справиться с модификацией кода для дополнительного случая. Им просто нужно добавить строку кода, разработанную OP. – Michael

+0

Это была не единственная проблема. 'Date.DayOfWeek (#date (2017,2,15), Day.Wednesday) равно 0'. 'Date.DayOfWeek (#date (2017,2,18), Day.Wednesday) равно 3'. Оба попали в ваше состояние 'if Date.DayOfWeek ([ETA], Day.Wednesday) <= 3'. – Eugene

1

Я написал пользовательскую функцию, которая решает эту проблему, если вам не нужно учитывать праздники. Он немного универсален, он работает с 2 или 200 или 2000 добавленными днями. Equals =WORKDAY(date;days) функция в Excel.

Здесь:

(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 

Вы можете сохранить его в качестве запроса, назовите его, скажем, AddWorkdays, и использовать, как это:

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! 

В противном случае вы можете вставить эту функцию в код в качестве

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,