Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA+Excel+DAO-чудесный селект / 8 сообщений из 8, страница 1 из 1
14.06.2008, 02:54
    #35372846
avdj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA+Excel+DAO-чудесный селект
Имею простой файл с тремя полями. Из другого файла выполняю к нему запрос через ДАО.
попытка 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
16.06.2008, 08:47
    #35373820
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA+Excel+DAO-чудесный селект
вероятно в этом (хотя и не буду утверждать)

Код: 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
16.06.2008, 09:25
    #35373848
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA+Excel+DAO-чудесный селект
RecordCount работает только с клиентским курсором.
...
Рейтинг: 0 / 0
16.06.2008, 23:04
    #35375757
avdj
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA+Excel+DAO-чудесный селект
big-duke RecordCount работает только с клиентским курсором.

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

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

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

White Owl А RecordCount отражает только число записей уже физически выкачанных на клиента. Поэтому использовать эту проперть можно только в случае если точно знаешь как ведет себя твой конкретный клиентский драйвер при данных настройках курсора.
Конкретно и по теме - спасибо.
...
Рейтинг: 0 / 0
26.06.2008, 00:57
    #35395067
%?*?%
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
VBA+Excel+DAO-чудесный селект
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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA+Excel+DAO-чудесный селект / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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