如何防止超量预订房间?

时间:2013-12-23 21:56:34

标签: vb.net ms-access

我试图限制两个日期之间的新预订。例如,在预订期间,我选择了DateIN是2013年12月24日,DateOUT是2013年12月28日,并选择了房间号并将记录保存在数据库中。

现在我想限制这两个日期之间的任何预订,例如应该限制预约房间。例如DateIN = 26/12/2013和DateOut = 30/12/2013,因为房间已经预订到2013年12月28日,因此DateIN必须大于2013年12月28日。

如何使用VB.NET和MS Access进行此限制?我试过这段代码,但在某些情况下失败了。

con = New OleDbConnection(cs)
con.Open()
Dim ct As String = "SELECT RoomNo FROM Temp_Reservation WHERE RoomNo='" _
  & cmbRoomNo.Text & "' AND DateOut BETWEEN  #" & dtpDateIN.Text _
  & "# AND  #" & dtpDateOut.Text _
  & "# AND Status='Confirmed' AND DateIN < #" & dtpDateOut.Text & "#"
cmd = New OleDbCommand(ct)
cmd.Connection = con
rdr = cmd.ExecuteReader()
If rdr.Read Then
    MessageBox.Show("Selected Room is already booked", "Input Error", _
                    MessageBoxButtons.OK, MessageBoxIcon.Error)
    If Not rdr Is Nothing Then
        rdr.Close()
    End If
    Exit Sub
End If

2 个答案:

答案 0 :(得分:3)

当检查房间预订重叠时(如果您有设定的结账/登记时间),您需要检查其他预订地点:

当前查询的DateIn是:小于其他预订DateOut且大于或等于其他预订的DateIn

当前查询DateOut:大于其他预订Datein且小于或等于其他预订的DateOut

当前查询DateIn小于其他预订DateIn,当前查询DateOut大于其他预订DateOut

即:

Dim ct As String
ct = String.Format("Select RoomNo from Temp_Reservation where RoomNo=""{0}""" & _
                   "And Status = ""Confirmed"" And " & _
                   "(#{1}# < DateOut And #{1}# >= DateIn) " & _
                   "Or (#{2}# > DateIn  And #{2}# <= DateOut) " & _
                   "Or (#{1}# < DateIn And #{2}# > DateOut)", _
                   cmbRoomNo.Text, dtpDateIN.Text, dtpDateOut.Text)

答案 1 :(得分:2)

如果房间已经从新的日期之前预订到新的输出日期之后,那么您的BETWEEN子句将不会检测到它们。我认为有人可以在其他人检查的同一天办理登机手续。像这样测试

Temp_Reservation.DateIn < new_out AND Temp_Reservation.DateOut > new_in
    ==> booking conflict!

示例:

 Reservation A:   26/12/2013 to 28/12/2013  
 Reservation B:   10/01/2014 to 15/01/2014  
 Reservation new: 01/01/2014 to 05/01/2014  

 A_in(26/12/2013) < new_out(05/01/2014) AND A_out(28/12/2013) > new_in(01/01/2014)
     ===> True AND False = False (which means: no conflicting record will be returned)

  B_in(10/01/2014) < new_out(05/01/2014) AND B_out(15/01/2014) > new_in(01/01/2014)
     ===> False AND True = False

我是如何找到逻辑的:首先我制定了必须满足的条件预定才能做到。

OK:        A_in >= B_out OR A_out <= B_in

但是你想找到重叠的预订。因此,我根据De Morgan's lawNOT (x OR y) = NOT(x) AND NOT(y)

改变了条件
CONFLICT:  A_in < B_out AND A_out > B_in