Можно ли сделать динамический SQL-оператор на основе combobox.value в доступе? - PullRequest
0 голосов
/ 20 февраля 2019

Я сделал форму в доступе с 2-мя разными выпадающими списками.Пользователь этого инструмента может выбрать в выпадающем списке 1: таблица (которая должна быть отфильтрована), а второй выпадающий список 2 - это критерии, которые необходимо отфильтровать (например, Language = «EN»), и результат этого запроса должен быть расположен в таблице,

Проблема в том, что я не могу найти решение для передачи значения combobox1 в оператор SQL.Второй пример: где [язык] = формы! Форма! Combo2.value, но часть, где я не могу найти решение, это: select * from (значение combobox1)?Как я могу передать значение поля со списком в качестве имени таблицы для фильтрации?Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Если вы запустите код в событии afterupdate в выпадающем списке, вы можете установить SQL-выражение следующим образом:

Private Sub combobox2_AfterUpdate()
   someGlobalVar = "Select * FROM " & me.combobox1.value & " WHERE language = " & _
         me.combobox2.value
End Sub

И затем вызывать глобальную строку SQL там, где вам это нужно.

0 голосов
/ 20 февраля 2019

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

Если вы хотитечтобы выбрать данные из одной из нескольких таблиц, лучше всего динамически генерировать SQL с использованием VBA.Один из способов сделать это (особенно если вы хотите / хотите, чтобы ваш запрос открывался в представлении «Таблица данных» для конечного пользователя) - это создать «фиктивный» запрос, SQL-код которого можно заполнить с помощью выбора формы.

Например,Допустим, у нас есть 2 таблицы: tTable1 и tTable2.Обе эти таблицы имеют один столбец с именем Language.Вы хотите, чтобы пользователь выбирал данные из первой или второй таблицы с необязательным фильтром.

  1. Создайте форму с 2 полями со списком: один для таблиц и один с выбором критериев.Похоже, вы уже сделали этот шаг.
  2. В этой форме есть кнопка, которая открывает запрос.Код для события press этой кнопки должен выглядеть примерно так:

    Private Sub cmdRunQuery_Click()
        Dim sSQL As String
        Dim db As DAO.Database
        Dim qdf As DAO.QueryDef
    
        If Not IsNull(Me.cboTableName.Value) Then
            sSQL = "SELECT * FROM " & Me.cboTableName.Value
    
            If Not IsNull(Me.cboFilter.Value) Then
                sSQL = sSQL & vbNewLine & _
                        "WHERE Language=""" & Me.cboFilter & """"
            End If
    
            Set db = CurrentDb
            Set qdf = db.QueryDefs("qDummyQuery")
            qdf.SQL = sSQL
    
            DoCmd.OpenQuery qdf.Name
        End If
    End Sub
    

Обратите внимание, как генерируется SQL.Конечно, используя этот метод, вы должны защитить себя от SQL-инъекций: вы должны разрешить только предопределенные значения в поле со списком.Но это служит подтверждением концепции.

Если вам не нужно показывать результаты запроса, вам не нужно использовать фиктивный запрос: вы можете просто открыть набор записей на основе SQL и процессачто.

...