Как использовать переменную VBA для В предложении ‘SourceDB’ запроса MS-ACCESS

#ms-access

#sql #vba #ms-access #ms-access-2010

Вопрос:

Я пытаюсь передать строковую переменную vba в предложение IN инструкции SQL в представлении построителя запросов.

строка создается следующей функцией:

 Public Function GetBackEnd()
    If Len(GetBackEnd) = 0 Then GetBackEnd = BackEnd
End Function
 

сам серверный сервер является производным от выпадающего списка в userform, в таблице есть две записи с двумя разными адресами, по одной для живой и развивающейся базы данных. В раскрывающемся списке при выборе устанавливается переменная «environment».

 Property Get BackEnd() As String
    Select Case Environment
        Case Is = "Development"
            BackEnd = DLookup("VariableValue", "Globals", "Variable= 'TestEnvironment'")
        Case Else
            BackEnd = DLookup("VariableValue", "Globals", "Variable= 'Backend'")
    End Select
End Property
 

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

 SELECT *
FROM TableName IN 'GetBackEnd()';
 

Я полагаю, что это что-то простое, но, посмотрев на это так долго, я просто не могу этого увидеть.

Спасибо.

Комментарии:

1. Я не понимаю эту функцию. Что такое BackEnd ?

2. Я обновил исходное сообщение с функциями для серверной части.

3. Вы не можете этого сделать. Попробуйте создать строку SQL, а затем обновить .SQL свойство запроса в VBA.

4. Но поскольку вы передаете одну строку, зачем вам нужен IN?

5. @VesaKarjalainen: Это особенность. 🙂 — docs.microsoft.com/en-us/office/vba/access/concepts /…

Ответ №1:

Как правило, вы можете делать то, что хотите — использовать функцию для предоставления строк параметров.

 Public Function GetName() As String
    GetName = "foo"
End Function
 
 SELECT * FROM bar WHERE floo = GetName()
 

Но в некоторых частях / случаях вы не можете использовать переменные. Оба IN предложения входят в их число.

Они не будут работать:

 GetInList = "'x', 'y', 'z'"
 
 SELECT * FROM bar WHERE floo IN (GetInList())
 

и ваш вариант использования также невозможен:

 GetDbPath = "C:pathmyDb.accdb"
 
 SELECT * FROM bar IN GetDbPath()
 

Вам придется создавать весь SQL на лету:

 Db.QueryDefs("myQuery").SQL = "SELECT * FROM TableName IN '" amp; GetBackEnd() amp; "'"
 

Комментарии:

1. Большое вам спасибо! вместо этого я пойду по этому пути

Ответ №2:

Отсутствует предложение WHERE в SQL-запросе? Допустим

 SELECT *
FROM TableName 
WHERE Name = GetBackEnd;
 

Комментарии:

1. разве это не было бы просто поиском имени поля в TableName? предложение IN указывает, в какой базе данных находится имя таблицы.

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

3. Я использовал этот синтаксис в существующих запросах, успешно созданных и выполненных из среды VBA. Это первый раз, когда я пытаюсь ввести переменную VBA в конструктор запросов.