#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 в конструктор запросов.