Как избежать столкновений - PullRequest
       13

Как избежать столкновений

1 голос
/ 08 февраля 2012

У меня есть три таблицы:

Employee(Id,name etc)
Appointment(Id,date,time,employee id, clientid etc)
Client(Id,name etc) 

У таблицы Employee есть 1 ко многим с таблицей назначений, как и с таблицей клиентов.

Однако я пытаюсь добиться того, чтобы система предотвращала повторяющиеся или противоречивые встречи, но не могу понять, как это сделать. Нужна ли мне дополнительная таблица с доступными временными интервалами и как-нибудь связать все это вместе? Или, например, таблица доступности сотрудников дополнительно?

Или я могу добиться того, что мне нужно, с тем, что у меня уже есть, и просто манипулированием запросами?

Большое спасибо

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Чтобы предотвратить столкновения, логика здесь довольно проста:

Столкновение происходит, когда:

RequestStartDate <= EndDate 
and 
RequestEndDate >= StartDate 

Таким образом, приведенный выше запрос является довольно простым.Если произойдет какое-либо столкновение, вышеприведенное вернет записи, и вы просто не разрешите бронирование.

Вышесказанное, конечно, можно ПРОДОЛЖИТЬ на время и даже на отдельную комнату.

Например:

RequestStartTime <= EndTime 
and 
RequestEndTime >= StartTime 
And
RequestDate = BookingDate

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

В Access 2010 действительно есть триггеры таблиц и процедуры хранения, но, поскольку вам нужен пользовательский интерфейс для пользователя, введите кодкак это обычно делает свое дело:

dim strWhere                 as string 
dim dtRequeestStartDate      as date 
dim dtRequestEndDate         as date 

dtRequestStartDate = inputbox("Enter start Date") 
dtRequestEndDate = inputbox("Enter end date") 

strWhere="#" & format(dtRequestStartDate,"mm/dd/yyyy") & "# <= EndDate" & _ 
     " and #" & format(dtRequestEndDate,"mm/dd/yyyy") & "#  >= StartDate" 


if dcount("*","tableBooking",strWhere) > 0 then 
    msgbox "sorry, you cant book 
...bla bla bla.... 

Выше приведен только пример, и я уверен, что вы бы создали хорошую форму, которая запрашивает у пользователя даты бронирования.

Таким образом, приведенные выше простые условия возвращают ЛЮБОЕ столкновение.И, написав так много систем резервирования, я настоятельно рекомендую вам НЕ создавать пустые записи заранее, а использовать вышеупомянутую правильную логику и, таким образом, ТОЛЬКО добавлять записи в систему бронирования и не нужно писать тонны кода, чтобы создать кучу пустыхзаписи с временными интервалами и т. д.

Приведенный выше простой запрос предотвратит столкновения.

1 голос
/ 08 февраля 2012

Я думаю, что таблица встреч будет необходима.Это позволит вам включать только доступные слоты, а также анализировать рабочую нагрузку и доступность сотрудников.Таблица будет включать 15-минутные интервалы для каждого дня для каждого сотрудника.Возможно, вы захотите добавить дополнительную таблицу для праздничных / больничных дней / обычно недоступную в течение некоторого времени.

РЕДАКТИРОВАТЬ

Я предполагал что-то вроде:

Timeslots:
EmployeeID ) Primary key
TimeSlot   ) 
JobID      - Foreign key
Status     ) And so forth
Notes      ) 

«Я хочу назначить раннюю встречу с E1»

SELECT TimeSlots.EmployeeID, TimeSlots.TimeSlot, TimeSlots.JobID
FROM TimeSlots
WHERE TimeSlots.EmployeeID=1
AND TimeSlots.TimeSlot Between #2/9/2012 9:0:0# And #2/9/2012 11:30:0#

«Я хочу назначить встречу в 9:00»

SELECT TimeSlots.EmployeeID, TimeSlots.TimeSlot, TimeSlots.JobID
FROM TimeSlots
WHERE TimeSlots.TimeSlot Between #2/9/2012 9:0:0# And #2/9/2012 9:30:0#
...