我有三张桌子:
Employee(Id,name etc)
Appointment(Id,date,time,employee id, clientid etc)
Client(Id,name etc)
与Client表一样,Employee表与Appointment表有1对多。
然而,我想要实现的是允许系统防止重复或冲突的约会,但不能完全了解如何解决这个问题。我是否需要一个额外的表格,说明可用的时间段和一些如何将它们连接在一起?或者例如是员工可用性表?
或者我可以用我已经拥有的东西以及操纵查询来实现我所需要的东西吗?
非常感谢
答案 0 :(得分:1)
我认为约会表是必要的。它将允许您仅包括可用的插槽,还可以分析员工的工作负载和可用性。该表将包括每位员工每天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点预约”
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#
答案 1 :(得分:1)
为了防止碰撞,这里的逻辑非常简单:
在以下情况下发生碰撞:
RequestStartDate <= EndDate
and
RequestEndDate >= StartDate
以上是一个相当简单的查询。如果发生任何碰撞,那么 以上将返回记录,您只是不允许预订。
上述当然可以很容易地延长时间,甚至是特定的房间。
例如:
RequestStartTime <= EndTime
and
RequestEndTime >= StartTime
And
RequestDate = BookingDate
事实上,由于您可以存储日期+时间列,因此我们可以回到上面的第一个示例(因此,如果您这样做,预订可能会持续多天)。如上所述,如果这是针对特定房间的,那么只需在上面添加一个房间条件。
Access 2010确实有表触发器和存储过程,但由于您需要用户的UI,因此这样的代码通常可以解决问题:
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....
上面只是一个例子,我相信你会建立一个很好的形式 提示用户提供预订日期。
因此上述简单条件确实会导致任何冲突。写了这么多预订系统之后,我强烈建议你不要提前创建空白记录,但要使用上面正确的逻辑,因此只能在预订系统中添加记录,而不必编写大量代码来创建一堆空白带时隙等的记录。
上述简单查询将防止冲突。