Почти реализация РАБДЕНЬ.МЕЖД()
#АнатомияФункций - custom
Всем привет!
Возник в чате вопрос по реализации экселевской РАБДЕНЬ.МЕЖД().
Соответственно, у меня возникло два вопроса.
Один к функции – «почему рабочие субботы не учитываем?!» - но это решаемо
или без Гены
Второй к вопрошающему – «а какого художника мы пытаемся экселевскую логику запихнуть в другой язык?!»
Потому как обычный код
Будет кратно быстрее
По этому поводу смотрим рутуб
или дзен
ну а с исходниками всё давно выложено на sponsr.ru
Лайк, коммент, подписка приветствуются )))
Надеюсь, было полезно.
Всех благ!
@buchlotnik
#АнатомияФункций - custom
Всем привет!
Возник в чате вопрос по реализации экселевской РАБДЕНЬ.МЕЖД().
Соответственно, у меня возникло два вопроса.
Один к функции – «почему рабочие субботы не учитываем?!» - но это решаемо
g=(ot,dn,vyh,pra,rab)=>
[ a=List.Buffer(Text.PositionOf(vyh,"1",Occurrence.All)),
b=(x)=>if List.Contains(pra,x) or (List.Contains(a,Date.DayOfWeek(x,Day.Monday)) and not List.Contains(rab,x)) then 0 else 1,
c=List.Generate(()=>[d=ot,p=0,i=p],
(x)=>x[i]<=dn,
(x)=>[d=Date.AddDays(x[d],1),p=b(d),i=x[i]+p],
(x)=>if x[p]=1 then x[d] else null),
d=List.Last(List.RemoveNulls(c))][d]
или без Гены
g=(ot,dn,vyh,pra,rab)=>
[ a=List.Buffer(Text.PositionOf(vyh,"1",Occurrence.All)),
b=(x)=>if List.Contains(pra,x) or (List.Contains(a,Date.DayOfWeek(x,Day.Monday)) and not List.Contains(rab,x)) then false else true,
c=List.Dates(ot+#duration(1,0,0,0),List.Count(pra)+Number.RoundUp(dn/(7-List.Count(a)))*List.Count(a)+dn,#duration(1,0,0,0)),
d=List.Select(c,b){dn-1}][d]
Второй к вопрошающему – «а какого художника мы пытаемся экселевскую логику запихнуть в другой язык?!»
Потому как обычный код
let
g=(ot,dn)=>slct{List.PositionOf(slct,ot,Occurrence.First,(c,v)=>c>v)+dn-1},
f=(x)=>List.Transform(Table.Column(Excel.CurrentWorkbook(){[Name=x]}[Content],x),Date.From),
pra = List.Buffer(f("Праздники")),
rab = List.Buffer(f("Рабочие")),
from = Excel.CurrentWorkbook(){[Name="Дата"]}[Content],
typ = Table.TransformColumnTypes(from,{"дата размещения", type date}),
lst = List.Buffer(typ[дата размещения]),
min = List.Min(lst),
max = List.Max(lst),
dates = List.Dates(min,Duration.TotalDays(max-min)+Number.RoundUp(List.Max(typ[Дней])/5)*2+List.Count(pra),#duration(1,0,0,0)),
slct = List.Buffer(List.Sort(List.Difference(List.Select(dates,(x)=>Date.DayOfWeek(x,Day.Monday)<5),pra)&rab)),
to = Table.AddColumn(typ,"дата выполнения",(x)=>g(x[дата размещения],x[Дней]))
in
to
Будет кратно быстрее
По этому поводу смотрим рутуб
или дзен
ну а с исходниками всё давно выложено на sponsr.ru
Лайк, коммент, подписка приветствуются )))
Надеюсь, было полезно.
Всех благ!
@buchlotnik