Коллеги, здравствуйте!
Вопрос по применению функций VBA при формировании SQL запросов в объектной модели ADO. Например, если такой запрос через ADO:
sSQL = "SELECT * FROM Контакты _
WHERE Hour(Дата) < 18"
работает прекрасно, то такой:
sSQL = "SELECT * FROM Контакты _
WHERE WeekDay(Дата,vbMonday) < 6"
уже не работает.
Выходит, можно воспользоваться только ограниченным набором функций? Как же разработчики выходят из этого положения? Или есть какой-нибудь другой способ?
Применение VBA-функций в ADO-SQL
Модератор: Naeel Maqsudov
-
- Сообщения: 526
- Зарегистрирован: 04 фев 2007, 18:37
- Откуда: Сургут
- Контактная информация:
Снова здравствуйте AlexZZZ.
Набор функций SQL нельзя назвать "ограниченным", но он конечно отличается от набора функций VB(A), и зависим от "диалектов" SQL, и "разработчики" используют его функции в соответствии с применяемой СУБД (система управления базами данных).
К примеру ядро JET (MS Access) прекрасно понимает интегрированные в тело запроса и пользовательские функции и функции VBA.
Евгений.
Набор функций SQL нельзя назвать "ограниченным", но он конечно отличается от набора функций VB(A), и зависим от "диалектов" SQL, и "разработчики" используют его функции в соответствии с применяемой СУБД (система управления базами данных).
К примеру ядро JET (MS Access) прекрасно понимает интегрированные в тело запроса и пользовательские функции и функции VBA.
Евгений.
Странно, тогда почему возникает ошибка?
Dim DBFullName As String
Dim Cnct As String, Src As String
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Col As Integer
DBFullName = ThisWorkbook.Path & "\База данных2.mdb"
Set cn = New ADODB.Connection
Cnct = "Provider=Microsoft.Jet.OLEDB.4.0;"
Cnct = Cnct & "Data Source=" & DBFullName & ";"
cn.Open ConnectionString:=Cnct
Set rs = New ADODB.Recordset
With rs
Src = "SELECT * FROM Контакты WHERE WeekDay(Дата,vbMonday) < 6"
.Open Source:=Src, ActiveConnection:=cn 'Ошибка возникает в этой строке
Cells.Clear
For Col = 0 To rs.Fields.Count - 1
Range("A1").Offset(0, Col).Value = rs.Fields(Col).Name
Next
Range("A1").Offset(1, 0).CopyFromRecordset rs
End With
Set rs = Nothing
cn.Close
Set cn = Nothing
- Вложения
-
- Error.jpg (14 КБ) 247 просмотров
-
- Сообщения: 526
- Зарегистрирован: 04 фев 2007, 18:37
- Откуда: Сургут
- Контактная информация:
Здравствуйте AlexZZZ.
я очевидно плохо объяснил, ADO обращается к БД MS Access посредством языка SQL, в его наборе функций отсутствует JET фунция WeekDay. т.е. "внутри" MS Access её применение допустимо, а при обращении с помощью ADO применимы только фунуции SQL:
Src = "SELECT * FROM Контакты WHERE DATEPART('w', Дата) < 6"
Евгений.
я очевидно плохо объяснил, ADO обращается к БД MS Access посредством языка SQL, в его наборе функций отсутствует JET фунция WeekDay. т.е. "внутри" MS Access её применение допустимо, а при обращении с помощью ADO применимы только фунуции SQL:
Src = "SELECT * FROM Контакты WHERE DATEPART('w', Дата) < 6"
Евгений.