powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA+Excel+DAO-чудесный селект
8 сообщений из 8, страница 1 из 1
VBA+Excel+DAO-чудесный селект
    #35372846
avdj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имею простой файл с тремя полями. Из другого файла выполняю к нему запрос через ДАО.
попытка 1
select [f1],[f2],[f3] from [Лист1$]
результат - одна запись отобрана
попытка 2
select [f1],[f2],[f3] from [Лист1$] order by [f3] asc
все(8) записи отобраны
Убивайте, но не пойму в чем прикол....
Код процедуры


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
'sBookPath - путь к файлу
'sQuery - запрос
Public Function DaoExecuteQuery(ByVal sBookPath As String, ByVal  sQuery As String) As Variant

    'DAO Object Library Types
    Dim ws As DAO.Workspace
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    
    Set ws = CreateWorkspace("", "admin", "", dbUseJet)
    
    Set db = ws.OpenDatabase(sBookPath, False, True, "Excel 8.0;HDR=NO;IMEX=1")
    
    Set rs = db.OpenRecordset(sQuery)    
    
    If rs.RecordCount <>  0  Then
        DaoExecuteQuery = rs.GetRows(rs.RecordCount)
    Else
        DaoExecuteQuery = Null
    End If
    
    Set tb = Nothing
    Set db = Nothing
    Set ws = Nothing
    Set rs = Nothing
        
End Function
...
Рейтинг: 0 / 0
VBA+Excel+DAO-чудесный селект
    #35373820
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вероятно в этом (хотя и не буду утверждать)

Код: plaintext
1.
2.
    If rs.RecordCount <>  0  Then
        DaoExecuteQuery = rs.GetRows(rs.RecordCount)
    Else

св-во rs.RecordCount не вссегда работает нормально
чтобы он показывал правильное кол-во записей, надо ....

ИМХО для определения наличия записей лучше использовать
Код: plaintext
If not rs.EOF and not rs.BOF then


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
VBA+Excel+DAO-чудесный селект
    #35373848
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RecordCount работает только с клиентским курсором.
...
Рейтинг: 0 / 0
VBA+Excel+DAO-чудесный селект
    #35375757
avdj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-duke RecordCount работает только с клиентским курсором.

Что посоветуете?
...
Рейтинг: 0 / 0
VBA+Excel+DAO-чудесный селект
    #35375767
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала перейти на ADO.
...
Рейтинг: 0 / 0
VBA+Excel+DAO-чудесный селект
    #35375858
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-dukeДля начала перейти на ADO..... выкрасить и выбросить.
Какая разница на что он перейдет, если человек не понимает принципа клиент-сервера?

avdjУбивайте, но не пойму в чем прикол....
Прикол в том, что в обоих случаях отбираются все восемь записей. Но эти записи лежат в буфере сервера базы данных (или в буфере того что заменяет у тебя сервер базы данных). Потом вступает в дело клиентский драйвер и он по необходимости вытягивает данные из серверного буфера в свой собственный. Когда конкретно происходит выкачивание строк зависит от очень многих факторов (и настроек курсоров и версии драйверов) и в общем случае предсказать это невозможно.
А RecordCount отражает только число записей уже физически выкачанных на клиента. Поэтому использовать эту проперть можно только в случае если точно знаешь как ведет себя твой конкретный клиентский драйвер при данных настройках курсора.
...
Рейтинг: 0 / 0
VBA+Excel+DAO-чудесный селект
    #35394806
avdj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl big-dukeДля начала перейти на ADO..... выкрасить и выбросить.
Какая разница на что он перейдет, если человек не понимает принципа клиент-сервера?
Понесло Остапа. Спокойно, ни кто не претендует на Вашу гениальность! :)

White OwlПотом вступает в дело клиентский драйвер и он по необходимости вытягивает данные из серверного буфера в свой собственный.
Смущает разная необходимость в двух аналогичных запросах

White Owl А RecordCount отражает только число записей уже физически выкачанных на клиента. Поэтому использовать эту проперть можно только в случае если точно знаешь как ведет себя твой конкретный клиентский драйвер при данных настройках курсора.
Конкретно и по теме - спасибо.
...
Рейтинг: 0 / 0
VBA+Excel+DAO-чудесный селект
    #35395067
Фотография %?*?%
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avdjУбивайте, но не пойму в чем прикол

Прежде чем брать RecordCount, recordset надо "продернуть":

Set rs = db.OpenRecordset(sQuery)

If Not rs.EOF Then
rs.MoveLast
Debug.Print rs.RecordCount
rs.MoveFirst
End if
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA+Excel+DAO-чудесный селект
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]