Обсуждение:Функция определения - рабочий ли день

5 (1)
  • Развернуть Обсуждение:Функция определения - рабочий ли день ( Обсуждение примера  17.08.2007 17:03 )
    0(0)
    Функция определения - рабочий ли день через список с инвертированными праздничными днями через хэш.

    идея такая - если выходной день выпадает на пн-пт, то заносим его в хэш.
    если сб или вс объявлен рабочим - то тоже добавляем.
    создается инвертированный список.

    где пригодится - сами знаете

    Посмотреть пример
    >> Ответить
    • Развернуть заданы 2006 год и 2007, остальные года - смотрим в консультанте/гаранте и добавляем ( KaMPiLeR  17.08.2007 17: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;
        

        >> Ответить