Проблема во избежании дублирования заказов в моем приложении системы бронирования - PullRequest
0 голосов
/ 22 августа 2011

Если бронирование присутствует в базе данных 12/27/2011 в 17:00 в течение 2 часов, и я пытаюсь сделать новое бронирование 12/27/2011 с 17:00 до 19:00, тогда мой код выдает сообщение об ошибке , Даже если я попытаюсь забронировать в 4:00 вечера на 2 часа, он выдаст сообщение об ошибке, поскольку 2-й час будет перекрываться с уже сделанным бронированием с 5:00 до 7:00.

Теперь наступает проблемная часть. При смене дня сообщение об ошибке не генерируется, т. Е. Если бронирование было 12/27/2011 в 23:00 в течение 3 часов, оно не должно разрешать новое бронирование до 28/12/2011 2:00, но когда попытаться забронировать 28/12/2011 в 1:00 утра, он сохраняет его в базе данных и не генерирует сообщение об ошибке. Мне нужно сообщение об ошибке, сгенерированное в таком случае.

Я использую два отдельных поля в базе данных, одно для времени и одно для даты. Оба имеют тип данных DateTime.

новое время относится ко времени, в которое я пытаюсь сделать новое бронирование

добавленное время относится ко времени после добавления продолжительности ко времени, в которое я пытаюсь сделать новое бронирование

Addeddbtime содержит только значение времени (после добавления продолжительности бронирования в базе данных), извлеченное из поля даты и времени, хранящегося в базе данных

newdate относится к следующей дате, так как день меняется в 12:00, поэтому, если резервирование базы данных происходит в 23:00 12.12.2011, в новой дате будет указываться 13.12.2011

Проблема заключается в последней части условия If, которое проверяет перекрывающиеся заказы, если бронирование охватывает более двух дней

Вот мой код:

Dim newtime, addednewtime, addeddbtime, changetime, newdate As DateTime 'defines variables
addeddbtime = dbonlytime.AddHours(dbdur)
newtime = TxtBookTime.Text
addednewtime = newtime.AddHours(TxtBookDur.Text)



changetime = "12:00:00 AM"
newdate = dbdate.AddDays(1)

If TxtBookDate.Text = dbdate And TxtPoolNo.Text = dbpoolno And TxtCrtNo.Text = dbcrtno And TxtTblNo.Text = dbtblno And CmboGame.SelectedItem = dbgame And ((newtime > dbonlytime And newtime < addeddbtime) Or (addednewtime > dbonlytime And addednewtime < addeddbtime) Or (newtime < dbonlytime And addeddbtime > changetime And addednewtime < dbonlytime And addednewtime <= addeddbtime And TxtBookDate.Text = newdate)) Then
MessageBox.Show("The date and time you have entered has already been booked " & vbCrLf & " Try Again!", "Bookings Overlapped", MessageBoxButtons.OK, MessageBoxIcon.Stop)

Exit Sub

End If

1 Ответ

1 голос
/ 22 августа 2011

Хотите, чтобы вы хотели сделать, это иметь процедуру, которая проверяет наличие совпадений между текущим бронированием и существующим. У вас должен быть метод для этого со следующими входными значениями:

  1. Текущие даты бронирования
  2. Список существующих бронирований

Допустим, у вас есть класс с именем Booking, который имеет начало и конец DateTimes (не нужно иметь отдельные поля для даты и времени, объект DateTime содержит оба).

Public Class Booking

    Public Sub New(ByVal beginDate As DateTime, ByVal endDate As DateTime)
        Me.BeginDate = beginDate
        Me.EndDate = endDate
    End Sub

    Public Property BeginDate As Date

    Public Property EndDate As Date

    'Other booking properties here

End Class

У вас может быть такая подпрограмма, которая проверяет, есть ли совпадение с существующим бронированием:

Private Function BookingOverlapping(ByVal booking As Booking, ByVal existingBookings As IEnumerable(Of Booking)) As Boolean
    For Each existingBooking In existingBookings
        If booking.BeginDate < existingBooking.EndDate AndAlso booking.EndDate > existingBooking.BeginDate Then
            Return True
        End If
    Next
    Return False
End Function

Тогда вы бы использовали метод, подобный этому:

' Figure out begin and end DateTimes from user input, 
' then create a booking object.
Dim currentBooking As New Booking(beginDate, endDate)

' The GetExistingBookings method would retrieve bookings from the database 
' and add new Booking objects to a list.
Dim existingBookings As List(Of Booking) = GetExistingBookings()

If BookingOverlapping(currentBooking, existingBookings)
    MessageBox.Show("The date and time you have entered has already been booked " & vbCrLf & " Try Again!", "Bookings Overlapped", MessageBoxButtons.OK, MessageBoxIcon.Stop)
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...