Eu tenho um controle seletor de data. Quando o uso seleciona uma data, quero que um textbox dê 30 dias úteis depois, excluindo finais de semana e feriados. Isso é o que tenho no momento.
Switch (CountIf(BankHolidayDates, BankHolidayDate >=
StartDate.SelectedDate, BankHolidayDate <= DateAdd(StartDate.SelectedDate,
Value(gvDaysToDeadline) +
RoundDown(gvDaysToDeadline / 5, 0)*2+
Switch(Weekday(StartDate.SelectedDate),5,If(Mod( gvDaysToDeadline , 5)>0,2,0),
4,If(Mod( gvDaysToDeadline , 5)>1,2,0),
3,If(Mod( gvDaysToDeadline , 5)>2,2,0),
2,If(Mod( gvDaysToDeadline , 5)>3,2,0),
1,If(Mod( gvDaysToDeadline , 5)>4,2,0))
)),0,DateAdd(StartDate.SelectedDate,
Value(gvDaysToDeadline) +
RoundDown(gvDaysToDeadline / 5, 0)*2+
Switch(Weekday(StartDate.SelectedDate),5,If(Mod( gvDaysToDeadline , 5)>0,2,0),
4,If(Mod( gvDaysToDeadline , 5)>1,2,0),
3,If(Mod( gvDaysToDeadline , 5)>2,2,0),
2,If(Mod( gvDaysToDeadline , 5)>3,2,0),
1,If(Mod( gvDaysToDeadline , 5)>4,2,0))
),1,DateAdd(StartDate.SelectedDate,
Value(gvDaysToDeadline+1) +
RoundDown((gvDaysToDeadline+1) / 5, 0)*2+
Switch(Weekday(StartDate.SelectedDate),5,If(Mod( gvDaysToDeadline+1 , 5)>0,2,0),
4,If(Mod( gvDaysToDeadline+1 , 5)>1,2,0),
3,If(Mod( gvDaysToDeadline+1 , 5)>2,2,0),
2,If(Mod( gvDaysToDeadline+1 , 5)>3,2,0),
1,If(Mod( gvDaysToDeadline+1 , 5)>4,2,0))
),2,DateAdd(StartDate.SelectedDate,
Value(gvDaysToDeadline+2) +
RoundDown((gvDaysToDeadline+2) / 5, 0)*2+
Switch(Weekday(StartDate.SelectedDate),5,If(Mod( gvDaysToDeadline+2 , 5)>0,2,0),
4,If(Mod( gvDaysToDeadline+2 , 5)>1,2,0),
3,If(Mod( gvDaysToDeadline+2 , 5)>2,2,0),
2,If(Mod( gvDaysToDeadline+2 , 5)>3,2,0),
1,If(Mod( gvDaysToDeadline+2 , 5)>4,2,0))
))
Você pode usar algo semelhante à expressão abaixo:
Onde bankHolidays é uma coleção/tabela de coluna única com as datas dos feriados.
Se houver a possibilidade de mais de 15 feriados em qualquer período de 9 semanas, você precisará aumentar o número de dias para antecipar.