Применение VBA-функций в ADO-SQL

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Коллеги, здравствуйте!
Вопрос по применению функций VBA при формировании SQL запросов в объектной модели ADO. Например, если такой запрос через ADO:
sSQL = "SELECT * FROM Контакты _
WHERE Hour(Дата) < 18"

работает прекрасно, то такой:
sSQL = "SELECT * FROM Контакты _
WHERE WeekDay(Дата,vbMonday) < 6"

уже не работает.

Выходит, можно воспользоваться только ограниченным набором функций? Как же разработчики выходят из этого положения? Или есть какой-нибудь другой способ?
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Снова здравствуйте AlexZZZ.
Набор функций SQL нельзя назвать "ограниченным", но он конечно отличается от набора функций VB(A), и зависим от "диалектов" SQL, и "разработчики" используют его функции в соответствии с применяемой СУБД (система управления базами данных).
К примеру ядро JET (MS Access) прекрасно понимает интегрированные в тело запроса и пользовательские функции и функции VBA.
Евгений.
Аватара пользователя
AlexZZZ
Сообщения: 237
Зарегистрирован: 01 июн 2007, 00:27
Откуда: Москва и область

Странно, тогда почему возникает ошибка?
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
Error.jpg (14 КБ) 248 просмотров
Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте AlexZZZ.
я очевидно плохо объяснил, ADO обращается к БД MS Access посредством языка SQL, в его наборе функций отсутствует JET фунция WeekDay. т.е. "внутри" MS Access её применение допустимо, а при обращении с помощью ADO применимы только фунуции SQL:
Src = "SELECT * FROM Контакты WHERE DATEPART('w', Дата) < 6"
Евгений.
Ответить