Доброго времени суток, коллеги!

Сегодня решал одну интересную, с практичной точки зрения, задачу: клиенту требовалось чтобы при добавлении задачи, если в выбранный период для ответственного в расписании уже существует задача, время начала и время конца автоматически сдвигались на свободный участок в расписании. Спешу поделиться с Вами одним из вариантов решения!

В моем примере за основу взят следующий алгоритм: сдвигаем время задачи на час вперед до того времени, пока не удастся избежать наложения.
Для этого требуется внести следующие изменения в обработчик события btnOkOnClick в сервисе scr_TaskEdit:

         var StartDate = Dataset.ValAsDateTime('StartDate');
         var DueDate = Dataset.ValAsDateTime('DueDate');
         var OwnerIDDataField = Dataset.DataFields.ItemsByName('OwnerID');  
         while(GetIsTaskCoverExists(Dataset, OwnerIDDataField.Value, StartDate,
         DueDate))
         {
              var StartDate = new Date(Dataset.ValAsDateTime('StartDate'));
              var DueDate = new Date(Dataset.ValAsDateTime('DueDate'));            
              StartDate.setHours(StartDate.getHours() + 1);
              DueDate.setHours(DueDate.getHours() + 1);
              StartDate = StartDate.getVarDate();
              DueDate = DueDate.getVarDate();
              Dataset.Values('StartDate') = StartDate;
              Dataset.Values('DueDate') = DueDate;
         }

В итоге получим примерно следующее содержимое функции обработчика события:

1

Нравится

Поделиться

3 комментария

Если есть короткое "окно", в которое всё же влезет новая задача, алгоритм может его перешагнуть и не заметить?

Да, такое возможно. Для коротких задач можно сдвигать время не на час, а к примеру, на 10 минут вперед.

Коллеги, мною данная задача была реализована запросом SQL который пригоден для использования даже в триггере.
Кроме выше описанного, он (запрос) умеет находить наименьшее окно под которое подходит задача. И все это добро может быть легко «прикручено» к расписанию каждого сотрудника в календаре (если не ошибаюсь - это уже тоже реализовано).

Показать все комментарии