2013-12-23 8 views
1

Я пытаюсь сделать ограничение для нового резервирования между двумя датами. Например, во время резервирования я выбрал DateIN 24/12/2013, а DateOUT - 28/12/2013 и выбрал номер комнаты и сохранил запись в базе данных.Как предотвратить избыточные бронирования?

Теперь я хочу ограничить любую оговорку между этими двумя датами, например, должно быть ограничение на резервную комнату. Например, DateIN = 26/12/2013 и DateOut = 30/12/2013, потому что номер уже забронирован до 28/12/2013, поэтому DateIN должен быть больше 28/12/2013.

Как я могу сделать это ограничение с помощью 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

что вы имеете в виду, что это не помогает? ошибки? – logixologist

ответ

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 
+0

, но он не разрешит бронирование между не указанными датами .... 1-я Бронирование 26/12/2013 по 28/12/2013 2-я резервирование 10/01/2014 по 15/01/2014 поэтому этот запрос не позволит третьим бронирование 01.01.2012 до 05/01/2014 .......... запрос не срабатывает в этом состоянии ... –

+0

i can not leave not reserved date .... любое предварительное бронирование даже до 6 месяцев разрешается....... –

+1

Да, это произойдет, потому что это будет проверяться независимо для каждой записи бронирования. Если помещение зарезервировано раньше, 'DateOut' не будет больше, чем' new_in'. Если помещение зарезервировано после, 'DateIn' будет не меньше, чем' new_out'. –

3

При проверке для бронирования номера перекрывается, как это (где у вас есть набор Checkout/Checkin время), вам нужно проверить для других заказов, где:

Текущий запрос DateIn-х является: меньше чем другой заказ-х DateOut и больше или равна другой заказ-х DateIn

или

Текущий запрос-х DateOut является: больше, чем другой заказ-х Datein и меньше или равна другой заказ-х DateOut

Или

Текущий запрос-х DateIn меньше, чем другой заказ-х DateIn и Потока Запрос DateOut больше, чем у другого бронирования DateOut

ie:

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) 
+0

это сработало ... спасибо sir :) –

+2

Пока вы говорите, что мой ответ работает, я все же предлагаю что ответ Оливье Жако-Дескомба послужит вам лучше. Не то, чтобы я возражал против представителя за принятый ответ ... –

Смежные вопросы