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

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 6 май 2009.

  1. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Есть что-нить аналогичное функции @BusinessDays только в часах?
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А если умножить на 24 :)
    Что это за бред я написал почти год назад?
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    А если мне нужна точность до часу?
     
  4. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Ручками считать. Нет такой функции.
     
  5. Kizarek86

    Kizarek86 Lotus team
    Lotus team

    Регистрация:
    20 июл 2007
    Сообщения:
    857
    Симпатии:
    5
    непонятно что конкретно надо)
    Получаем количество дней между датами, и умножаем на рабочий день.
    Если нужен учет праздников и сокращенных дней то писать свою функцию.
     
  6. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Нужно к 17:45 пятницы прибавить 3 рабочих часа и получить 12:45 понедельника, например
     
  7. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    попробуй так подходит? :(

    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 - начало рабочего дня в часах)
     
  8. K-Fire

    K-Fire Гость

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


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

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    ого! я о таком и не догадывался даже ))
    ну, это очень суръёзная организация должна быть, чтобы такое учитывать...
     
  10. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Да, ещё вопрос - есть ли какие штатные функции, которые используют Holidays (справочник, который забивается в names.nsf)?
     
  11. RAJ

    RAJ Well-Known Member

    Регистрация:
    17 янв 2007
    Сообщения:
    440
    Симпатии:
    0
  12. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Поднимаю свою же тему
    Вопрос прежний, не решенный =)
    Наверняка уже писали подобные функции... поделитесь =)
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    ф-ция на пост выше - с ошибкой (при одинаковом дне)!
    Код (Text):
    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
    это не будет работать, в нек. случаях
    патеч:
    Код (Text):
    ''*не правильная предпосылка: 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
    я её правил и дорабатывал для учёта времени обеда, и переводил на минуты
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    и вот-така ф-ция вычисления холидаусов из НАБ
    Код (Text):
        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
    массивчег подаём на вход ф-ции выше
     
  15. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    lmike, (по первому посту) каким образом функция учитываем данные из names.nsf?
    lmike, (по второму посту) насколько я понял, не учитывается информация, выходной это (free) или рабочий день (busy). Все дни, заведенные names.nsf считаются выходными... не подходит... + инструкции типа "Move to Nearest Weekday" не исполняются
     
  16. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    1 - подсовываем массив DT
    2 - не понятно - что не подходит и причём здесь "Move to Nearest Weekday"
     
Загрузка...

Поделиться этой страницей