Estoy tratando de agregar una columna personalizada en Power Query que agrega 3 días hábiles si se cumple una condición; de lo contrario, agregue 2 días hábiles.
Puedo hacer que agregue días condicionalmente sin problema, pero tengo problemas para agregar días laborables en su lugar. Sé que esto se hace fácilmente en Excel, =IF X = 1,WORKDAY([REFERENCE],3),WORKDAY([REFERENCE],2)pero ¿cómo puedo hacer lo mismo que una columna personalizada en el editor de consultas?
A continuación se muestra lo que tengo, que hace días, incluidos los fines de semana:
=if [REF]="1" then Date.AddDays([ETA],3) else Date.AddDays([ETA],2)
,
Escribí una función personalizada que resuelve este problema, a menos que también necesite tener en cuenta las vacaciones. Es un poco universal, funciona con 2 o 200 o 2000 días añadidos. Función igual =WORKDAY(date;days)en excel.
ACTUALIZACIÓN: Bibake Uppal sugirió que debería admitirse la resta. Resta añadida para negativo days.
Aquí está:
1 
2 
3 
4 
5 
6 
7 
8 
9
  | (startDate, days) =>
    let
        Sign = if days < 0 then -1 else 1, //add a multiplier to enable negative 'days' to be subtracted rather than added
        Step1 = List.Dates(Date.AddDays(startDate, Sign), Sign*days + Number.RoundUp(Sign*days/7*3+4,0), #duration(Sign,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day; This is a bit over-provisioning, but ensures the list is long enough.
        Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays
        Step3 = List.FirstN(Step2, Sign*days), //select required number of workdays
        Output = if days = 0 then startDate else List.Last(Step3)
    in
        Output
  | 
Puede guardarlo como una consulta, nombrarlo, decir, AddWorkdaysy usarlo así:
1 
2 
3
  | 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!
  | 
De lo contrario, puede insertar esta función en su código como
1 
2 
3 
4 
5 
6 
7 
8 
9
  | fnAddWorkdays = (startDate, days) =>
let
    Sign = if days < 0 then -1 else 1, //add a multiplier to enable negative 'days' to be subtracted rather than added
    Step1 = List.Dates(Date.AddDays(startDate, Sign), Sign*days +  Number.RoundUp(Sign*days/7*3+4,0), #duration(Sign,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day; This is a bit over-provisioning, but ensures the list is long enough.
    Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays
    Step3 = List.FirstN(Step2, Sign*days), //select required number of workdays
    Output = if days = 0 then startDate else List.Last(Step3)
in
    Output
  | 
,
Una solución es dividirlo en 2 componentes:
- Según su condición inicial, agregue 2 o 3 días
 - Si esto termina un sábado o domingo, agregue 2 días adicionales para omitir el fin de semana
 
Ya ha implementado el Paso 1.
Ahora solo necesita implementar el Paso 2, que es agregar los 2 días adicionales si es necesario. Puede usar la función DayOfWeek para determinar dónde comenzó, para determinar si necesitará los 2 días adicionales:
Si agrega 3 días hábiles, deberá agregar 2 días adicionales si el día inicial es miércoles, jueves o viernes:
1
  | if Date.DayOfWeek([ETA], Day.Wednesday) <= 2 then {Add 2 more days}
  | 
Si agrega 2 días hábiles, deberá agregar 2 días adicionales si el día inicial es el jueves o el viernes:
1
  | if Date.DayOfWeek([ETA], Day.Thursday) <= 1 then {Add 2 more days}
  | 
Puede incorporarlos en su declaración inicial.
,
Ligera mejora en la respuesta de Eugene para permitir también la sustracción de días laborales.
1 
2 
3 
4 
5 
6 
7 
8 
9
  | = (startDate, days) =>
let
    Step1 = if days >= 0 then List.Dates(Date.AddDays(startDate, 1), days + Number.RoundUp(days/7*3+4,0), 
            else 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, Number.Abs(days)), //select required number of workdays
    Output = List.Last(Step3)
in
    Output
  | 
Simplemente ingrese un valor negativo para days.
 
 
0 Comentarios