Обсуждение:Функция определения - рабочий ли день
5 (1)
Обсуждение:Функция определения - рабочий ли день ( Обсуждение примера 17.08.2007 17:03 )
0(0)Функция определения - рабочий ли день через список с инвертированными праздничными днями через хэш.
идея такая - если выходной день выпадает на пн-пт, то заносим его в хэш.
если сб или вс объявлен рабочим - то тоже добавляем.
создается инвертированный список.
где пригодится - сами знаете
Посмотреть пример
>> Ответитьзаданы 2006 год и 2007, остальные года - смотрим в консультанте/гаранте и добавляем ( KaMPiLeR 17.08.2007 17:04 )
0(0)+++
>> Ответитьда, забыл - нужен Sets немного поправленный ( KaMPiLeR 17.08.2007 17:43 )
0(0)добавить нужно AtX, там же где и At.
MACRO AtX( _Key: string) /* Возвращает элемент множества по ключу (x - если нет - пустая строка) */ var idx = GetIndex( _Key); if ( idx >= 0 ) return Values.Value(idx); end; return ""; END;
>> Ответитьа если? ( Дамир Искандеров 20.08.2007 11:52 )
0(0)вычисляем, является ли рабочим днем:
суббота, и это число является праздником?
что выдаст функция?
>> Ответитьтогда не нужно эту дату субботнию добавлять в список... ( KaMPiLeR 27.08.2007 14:04 )
0(0)она и так уже красный день календаря.
ЗЫЖ календарь из системного сервиса используется бухгалтерией - все субботы рабочие.
>> Ответить
Еще один вариант на VBA ( Плотников Егор 08.10.2007 15:16 )
0(0)Этот набор функций писался для внутренней отчетности, ценен на мой взгляд не код, а алгоритм или точнее подход к решению проблемы. Может кому сгодится. Правда сказать, универсального алгоритма быть не может, пока в стране дни переносят в соответствии с прохождением выборов в местные думы и прочие политические надобности :)
Function Holiday(d As Date) As Boolean Holiday = False Select Case Month(d) Case 1 Select Case day(d) Case 1, 2, 3, 4, 5, 7 Holiday = True End Select Case 2 If day(d) = 23 Then Holiday = True End If Case 3 If day(d) = 8 Then Holiday = True End If Case 5 If (day(d) = 1) Or (day(d) = 9) Then Holiday = True End If Case 6 If day(d) = 12 Then Holiday = True End If Case 11 If day(d) = 4 Then Holiday = True End If End Select End Function Function Workday(day As Date) As Boolean Select Case Weekday(day, vbMonday) Case 1 Workday = (Not Holiday(day - 2)) And (Not Holiday(day - 1)) And (Not Holiday(day)) And (Not Holiday(day + 1)) '' рабочий день если нет праздника в суб, воск, пон, втор. Case 2 Workday = Not Holiday(day) '' возможен еще вариант если суб и воск оба выходные тогда вых - вторник, правда бывает очень редко Case 3, 4 Workday = Not Holiday(day) Case 5 Workday = Not Holiday(day) '' And (Not Holiday(day - 1)) '' вых если черверг праздник, а пятница не праздник - 2007 не работает Case 6 Workday = (Holiday(day + 3)) And (Not Holiday(day + 2)) '' рабочий если вторник праздник а пон нет Case 7 Workday = False ''(Holiday(day - 3)) And (Not Holiday(day - 2)) '' рабочий если четв праздник, а пятница нет. - 2007 не работает так как выборы End Select End Function Function AfterWorkDay(date_beg As Date, day_after As Integer) As Date AfterWorkDay = date_beg Do While day_after > 1 If Workday(date_beg + 1) Then AfterWorkDay = date_beg + 1 date_beg = date_beg + 1 day_after = day_after - 1 Else AfterWorkDay = date_beg + 1 date_beg = date_beg + 1 End If Loop End Function Function NextWorkDay(date_beg As Date) As Date Do date_beg = date_beg + 1 NextWorkDay = date_beg Loop Until Workday(date_beg) End Function
>> Ответитьчтото пишет "неопределенный идентификатор HASH" ( yukson 18.04.2011 14:39 )
0(0)в строке - var h=hash;
>> Ответитьнадо сделать import sets ( KaMPiLeR 18.04.2011 18:56 )
0(0)а сам sets немного поправить - добавить метод AtX
MACRO AtX( _Key: string) /* Возвращает элемент множества по ключу (x - если нет - пустая строка) */ var idx = GetIndex( _Key); if ( idx >= 0 ) return Values.Value(idx); end; return ""; END;
>> Ответить