2014-11-21 4 views
1

Нужна помощь с проблемой, с которой я сталкиваюсь. Это код:Проблема с SELECT WHERE NOT IS/EXISTS Подзапрос (VB.NET, Access)

Private Sub dtpStartDate_ValueChanged(sender As Object, e As EventArgs) Handles dtpStartDate.ValueChanged 
    startDateChanged = 1 

    If endDateChanged = 1 Then 
     cbLocation.Enabled = True 
     cbLocation.Items.Clear() 
     cbLocation.Items.Add(New ListViewItem("")) 
     Dim unbookedLocationsSQL As String = "SELECT locationID FROM Locations WHERE NOT EXISTS (Select LocationID FROM Bookings WHERE @startDate <= bookingEndDate AND bookingStartDate <= @endDate)" 
     Dim unbookedLocationsCommand = New OleDbCommand(unbookedLocationsSQL, globalVariables.objConnection) 
     Dim unbookedLocationsAdapter As New OleDbDataAdapter(unbookedLocationsSQL, globalVariables.objConnection) 
     Dim unbookedLocationsDataSet As New DataSet 

     unbookedLocationsCommand.Parameters.AddWithValue("startDate", dtpStartDate.Value) 
     unbookedLocationsCommand.Parameters.AddWithValue("endDate", dtpEndDate.Value) 

     unbookedLocationsAdapter.Fill(unbookedLocationsDataSet, "Locations") 

     With cbLocation 
      .DataSource = unbookedLocationsDataSet.Tables("Locations") 
      .DisplayMember = "locationID" 
      .ValueMember = "locationID" 
     End With 
    End If 
End Sub 

Первые вещи сначала, если изменить SQL заявление «SELECT * из мест» в поле со списком только отображаются все места.

То, что я пытаюсь достичь, это; когда кто-то меняет дату выбора времени, поле со списком включено и заполняется списком мест, которые не забронированы между этими двумя датами, что определяется таблицей бронирования. Я знаю, что заявление SQL неверно. Я пробовал различные комбинации вещей и пытался изолировать бит и куски, но я не могу получить какой-либо подзапрос, чтобы делать то, что я хочу.

Любая помощь будет оценена по достоинству.

ответ

0

Вот код теперь работает:

Private Sub dtpStartDate_ValueChanged(sender As Object, e As EventArgs) Handles dtpStartDate.ValueChanged 
     startDateChanged = 1 

     If endDateChanged = 1 Then 
      cbLocation.Enabled = True 
      Me.Refresh() 
      cbLocation.Items.Add(New ListViewItem("")) 
      Dim unbookedLocationsSQL As String = "SELECT * FROM Locations WHERE LocationID NOT IN (SELECT LocationID FROM Bookings WHERE bookingEndDate >= @startDate AND bookingStartDate <= @endDate)" 
      Dim unbookedLocationsCommand = New OleDbCommand(unbookedLocationsSQL, globalVariables.objConnection) 
      Dim unbookedLocationsAdapter As New OleDbDataAdapter(unbookedLocationsSQL, globalVariables.objConnection) 
      Dim unbookedLocationsDataSet As New DataSet 

      unbookedLocationsCommand.Parameters.AddWithValue("startDate", dtpStartDate.Value) 
      unbookedLocationsCommand.Parameters.AddWithValue("endDate", dtpEndDate.Value) 
      unbookedLocationsAdapter.SelectCommand = unbookedLocationsCommand 
      unbookedLocationsAdapter.Fill(unbookedLocationsDataSet, "Locations") 

      With cbLocation 
       .DataSource = unbookedLocationsDataSet.Tables("Locations") 
       .DisplayMember = "LocationName" 
       .ValueMember = "LocationID" 
      End With 
     End If 
    End Sub 
0

Я думаю, что что-то здесь не так

WHERE @startDate <= bookingEndDate AND bookingStartDate <= @endDate 

попробуйте изменить его

WHERE bookingStartDate >= @startDate AND bookingEndDate <= @endDate 

также положить в виду поставить ".Date" в ваших параметров ..

unbookedLocationsCommand.Parameters.AddWithValue("startDate", dtpStartDate.Value.Date) 
+0

вы пытались изолировать этот запрос? 'Выберите LocationID FROM Bookings WHERE @startDate <= bookingEndDate AND bookingStartDate <= @endDate)" ' – Codemunkeee

0

Если я правильно понял, каждая запись таблицы Bookings отражает одно бронирование даже для определенного места. В этом случае, вы хотите:

WHERE @startDate >= bookingEndDate OR bookingStartDate >= @endDate 

вместо

WHERE @startDate <= bookingEndDate AND bookingStartDate <= @endDate 

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

И поскольку я не могу прокомментировать (еще) ответы на другие ответы, я буду здесь констатировать, что ответ Codemunkeee неверен - с помощью его запроса (WHERE bookingStartDate >= @startDate AND bookingEndDate <= @endDate) вы получите именно те места, где бронирование перекрывается с требуемыми датами, так что это напротив того, что вы хотите. Если, конечно, я ничего не понял в таблице Bookings.

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