Бизнес часы? как посчитать?

fedotxxl

Well-known member
09.11.2005
614
0
#1
Есть что-нить аналогичное функции @BusinessDays только в часах?
 

Omh

Lotus team
04.07.2007
2 210
1
#2
А если умножить на 24 :)
Что это за бред я написал почти год назад?
 

Kizarek86

Lotus team
20.07.2007
864
4
#5
непонятно что конкретно надо)
Получаем количество дней между датами, и умножаем на рабочий день.
Если нужен учет праздников и сокращенных дней то писать свою функцию.
 

fedotxxl

Well-known member
09.11.2005
614
0
#6
Нужно к 17:45 пятницы прибавить 3 рабочих часа и получить 12:45 понедельника, например
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#7
попробуй так подходит? :(

17-45 пятницы + 3 раб. часа:
StartDay - указанный день
Tdmax - поздняя границы времени указанного дня (т.е. пятница = 17-45, среда = 18-00, определяется из сетки рабочего времени по дням)
Td - указанное время указанного дня
Tdend - кол-во часов до окончания указанного дня
Ttoadd - кол-во часов, которое нужно добавить к указанному времени
Ttonewd - кол-во часов, которое нужно добавить к началу нового рабочего дня

Tdmax - Td = Tdend
Ttonewd = Ttoadd - Tdend
NewDay = StartDay
NewDay = nextworkdate(NewDay) (узнаем следующую рабочую дату от указанной)
NewDayWT = workhours(NewDay) (кол-во рабочих часов в новом дне, определяется из сетки рабочего времени по дням)
while Ttonewd > NewDayWT
Ttonewd = Ttonewd - NewDayWT
NewDay = nextworkdate(NewDay)
NewDayWT = workhours(NewDay)
end while
result = starttime(NewDay) + Ttonewd (starttime - начало рабочего дня в часах)
 
K

K-Fire

#8
В общем эта задача ИМХО решается правильно только наличием своей самописной функции, плюс специального справочника раб/выходных дней, плюс настройками раб. часов для каждого отдельного сотрудника. Ну и наверное я еще не все случаи вспомнил которые могут влиять на результат, так что еще могут какие-то настройки понадобится.


UDP Сразу не заметил что Akupaka написал. Похоже что мы одинаково думаем :)
 

fedotxxl

Well-known member
09.11.2005
614
0
#10
Да, ещё вопрос - есть ли какие штатные функции, которые используют Holidays (справочник, который забивается в names.nsf)?
 

fedotxxl

Well-known member
09.11.2005
614
0
#12
Поднимаю свою же тему
Вопрос прежний, не решенный =)
Да, ещё вопрос - есть ли какие штатные функции, которые используют Holidays (справочник, который забивается в names.nsf)?
Наверняка уже писали подобные функции... поделитесь =)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#13
ф-ция на пост выше - с ошибкой (при одинаковом дне)!
Код:
If numDays = 1 Then
seconds = endTime.TimeDifferenceDouble(startTime)
If seconds < 0 Then
BusinessHours = -1
Else
BusinessHours = (seconds / 60) / 60
End If
Exit Function
End If
это не будет работать, в нек. случаях
патеч:
Код:
''*не правильная предпосылка: If @BusinessDays returns the value 1, then the start day and end day are the same working day.
If numDays = 1 Then
'патч ошибки		
If(startTime.DateOnly = endTime.DateOnly) Then
'			seconds = endTime.TimeDifferenceDouble(startTime)
'			If seconds < 0 Then
'				BusinessMinutes = -1
'			Else
'				BusinessMinutes = (seconds / 60)
'			End If
BusinessMinutes=OneDayWithLunch(startTime, endTime)
Exit Function
End If
End If
я её правил и дорабатывал для учёта времени обеда, и переводил на минуты
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#14
и вот-така ф-ция вычисления холидаусов из НАБ
Код:
	Dim Holiday As Variant
'выходные и празники - из адрессной книги	
Holiday =Evaluate({@DbLookup ("Notes":"ReCache"; "} & Dbset .Server & {" :"names.nsf";"Holidays";"Russian";"RepeatStartDate")})

If Isarray(Holiday) Then
'set Holiday array as datetime array	
Dim dI As Integer
Forall d In Holiday
Redim Preserve dtHolidays(dI) As NotesDateTime
Set dtHolidays(dI)=New NotesDateTime(d)
dI=dI+1
End Forall
Else
''* loopback for server outage
Holiday_S = "01.01.2009"
Redim dtHolidays(0) As NotesDateTime
Set dtHolidays(0)=New NotesDateTime(Holiday_S)
End If
массивчег подаём на вход ф-ции выше
 

fedotxxl

Well-known member
09.11.2005
614
0
#15
lmike, (по первому посту) каким образом функция учитываем данные из names.nsf?
lmike, (по второму посту) насколько я понял, не учитывается информация, выходной это (free) или рабочий день (busy). Все дни, заведенные names.nsf считаются выходными... не подходит... + инструкции типа "Move to Nearest Weekday" не исполняются
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 567
263
#16
1 - подсовываем массив DT
2 - не понятно - что не подходит и причём здесь "Move to Nearest Weekday"