我试图限制两个日期之间的新预订。例如,在预订期间,我选择了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
答案 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 law:NOT (x OR y) = NOT(x) AND NOT(y)
CONFLICT: A_in < B_out AND A_out > B_in