Управление SQL-запросом Access из нескольких полей со списком в форме - PullRequest
0 голосов
/ 25 марта 2011

Я попал в беспорядок, следуя всевозможным полу-релевантным учебникам, пытаясь выяснить, как отправлять поля со списком, находящиеся в форме, в запрос.

Я использую этот запрос для создания подмножеств контактных данных, из которых можно создавать ярлыки для кампаний по созданию почтовых рассылок. Мне бы хотелось, чтобы комбинированные списки были либо нулевыми, либо использовались совместно, чтобы я мог фильтровать комбинации вариантов. Я выполнил поиск в своих выпадающих списках, чтобы получить их значения, и нашел хороший учебник по работе с IS NULL, но я не понимаю, что VBA необходимо создавать командные кнопки «просмотреть результаты» и «очистить форму».

Это имена моих комбинированных списков, на которые ссылаются в критериях полей запроса:

[Forms]![SearchForm]![cboStatus]
[Forms]![SearchForm]![cboNewsletter]

Эти поля называются Status и Description соответственно.

Фильтруемый мной запрос называется

qryFilter

Это названия моих командных кнопок:

cmdResults 
cmdClear

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

Я бы хотел расширить это, чтобы включить больше критериев, но сначала я хочу, чтобы оно работало!

Любая помощь приветствуется, спасибо заранее, Rob

EDIT: Пытался адаптировать этот код от Патрика:

Private Sub cmdResults_Click()
 Dim tsSql As String
 tsSql = "SELECT * FROM qryAll WHERE "

If cboNewsletter <> "" And Not IsNull(cboNewsletter) Then
 tsSql = tsSql & "qryCorrespondence.NID = " & cboNewsletter & " "
    If (cboStatus <> "" And Not IsNull(cboStatus)) Then
    tsSql = tsSql & " AND "
    End If
 End If

If cboStatus <> "" And Not IsNull(cboStatus) Then
  tsSql = tsSql & "tblCustomers.Status = " & cboStatus & " "
End If

Dim rs As New ADODB.Recordset
rs.Open tsSql, CurrentProject.AccessConnection, 3, 3
End Sub

Последняя строка дает мне ошибку, хотя она выделяет следующую строку в отладчике:

    rs.open tsSql, CurrentProject.AccessConnection, 3, 3,

И говорит синтаксическая ошибка в предложении WHERE

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

Это типичная ситуация для интерфейса Query By Form. Моя практика состоит в том, чтобы в модуле формы была подпрограмма, которая записывает предложение WHERE, что-то вроде этого:

  Private Function GetWhere() As String
    Dim strTemp As String

    If Not IsNull(Me!cboStatus) Then
       strTemp = strTemp & " AND tblCustomers.Status = " & Chr(34) & Me!cmbStatus & Chr(34)
    End If
    If Not IsNull(Me!cboNewsletter) Then
       strTemp = strTemp & " AND qryCorrespondence.NID = " & Chr(34) & Me!cboNewsletter & Chr(34)
    End If
    strTemp = Mid(strTemp, 6)
    If Len(strTemp) > 0 Then
       GetWhere = " WHERE " & strTemp
    End If
  End Function

(код выше предполагает, что tblCustomers.Status и qryCorrespondence.NID доступны в операторе SELECT qryAll)

В событии OnClick () cmdResults вы должны использовать его следующим образом:

  Dim strSQL As String

  strSQL = "SELECT * FROM qryAll"
  strSQL = strSQL & GetWhere()

  [do with strSQL whatever you want]

Приведенный выше код вернет все записи, если ни одно из полей со списком не выбрано.

Для вашего cmbClear у вас будет просто код, который устанавливает два поля со списком в Null.

2 голосов
/ 25 марта 2011

Там действительно нет чистого способа сделать это в Access.

Скажем, у меня есть три поля со списком названных:

cmbName cmbCity cmbState

И кнопка с именем:

btnDoWork

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

Private Sub btnDoWork_Click()
     Dim tsSql as String
     tsSql = "SELECT * FROM tblUser WHERE "

  If cmbName <> "" and Not ISNull(cmbName) Then
     tsSql = tsSql & "user_name = " & cmbName & " "
    if (cmbCity <> "" and Not IsNull(cmbCity)) or (cmbState <> "" and Not IsNull(cmbState))
         tsSql = tsSql & " AND "
    end if
 End If

 if cmbCity <> "" and not isnull(cmbcity) then
      tsSql = tsSql & "city = " & cmbcity & " "
      if cmbState <> "" and Not IsNull(cmbState) then
           tsSql = tsSql & " AND "
      end if
 end if

if cmbState <> "" and not is null(cmbState) then
      tsSql = tsSql & "state = " & cmbState
end if

MyControl.RowSource = tsSql

End Sub 

IЯ уверен, что вы можете изменить его, чтобы включить нули, если хотите.Моя версия исключает пустые значения.

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

MyControl.RowSource = tsSql
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...