powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / CopyFromRecordset выводит не все записи
18 сообщений из 18, страница 1 из 1
CopyFromRecordset выводит не все записи
    #38817775
NikVik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Set cn = New ADODB.Connection
     strConnect = "Provider=MSOLAP.4;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=ICat;Data Source=DS;MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error"
cn.CommandTimeout = 300
cn.Open strConnect
Set rs = New ADODB.Recordset
StrMDX = "MDX запрос"
 rs.Source = StrMDX
Set rs.ActiveConnection = cn
rs.Open
MsgBox rs.RecordCount  ' Показывает 240000 записей в рекордсете
Cells.Clear
Range("A2").CopyFromRecordset rs             ' Выводит 127000 записей
For i = 0 To rs.Fields.Count - 1
    Cells(1, i + 1) = ИмяПоля(rs.Fields(i).Name)
Next
MsgBox rs.RecordCount   ' Показывает 240000 записей в рекордсете


выводит не все записи:
Число записей примерно 240000, выводится около 127000. Сообщений об ошибках нет, Эксель 2010. Как бороться?
Спасибо
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38817854
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikVik,

Возможно запрос возвращает более одной таблицы/результата.
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38818254
guest123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iMrTidyNikVik,

Возможно запрос возвращает более одной таблицы/результата.

+1
Проверяйте NextRecordset
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38818910
NikVik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробовал так:
Код: vbnet
1.
2.
3.
Range("A2").CopyFromRecordset rs             ' Выводит 127000 записей
rs.NextRecordset
Range("Q2").CopyFromRecordset rs             ' пусто


второй рекордсет пустой, если он есть.
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38818911
iMrTidy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikVik,

А что из себя представляет запрос?
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38818916
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikVik
Код: vbnet
1.
rs.NextRecordset

тогда уж
Код: vbnet
1.
Set rs = rs.NextRecordset
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38820019
NikVik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proтогда уж
Код: vbnet
1.
Set rs = rs.NextRecordset

Попробовал, похоже нет второго рекордсета
rs = Null

Кстати, команда:
Код: vbnet
1.
rs.Save NewName, adPersistXML 

сохраняет все записи.

Игрался с MDX запросами (что бы уменьшить количество записей в рекордсете).
На количестве записей от нескольких сотен до нескольких тысяч, появился ещё эффект:
включение в код
Код: vbnet
1.
rs.Save NewName, adPersistXML

увеличивает количество записей, выводимых
Код: vbnet
1.
Range("A2").CopyFromRecordset rs


Минимизировал количество записей в рекордсете до минимума (41 запись).
CopyFromRecordset выводит одну, первую (в ней общая сумма).
Если перед этим включить rs.Save, выводятся все записи.
iMrTidyNikVik,

А что из себя представляет запрос?
Вот "минимальный" запрос:
Код: sql
1.
2.
3.
SELECT {[Measures].[Кол-во]}  ON COLUMNS , NON EMPTY 
Hierarchize(AddCalculatedMembers({DrilldownLevel({[Prof_Products].[Prod_ID].[All]})}))  ON ROWS  FROM [PROF] WHERE 
([Группы_A].[Группы_A].[Левел 0 _A].&[Bluetooth ремешок Akaiwa],[Дата].[Даты по годам].[Год].&[2014]) 


В общем, нет пока у нас с рекордсетом взаимности.
Хелп.
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38820994
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikVik, а какое поведение будет при
Код: vbnet
1.
2.
3.
rs.MoveLast
rs.MoveFirst
Range("A2").CopyFromRecordset r
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38821247
ex-zel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NikVik,

16659078
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38822044
NikVik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKotNikVik, а какое поведение будет при
Код: vbnet
1.
2.
3.
rs.MoveLast
rs.MoveFirst
Range("A2").CopyFromRecordset r

даёт ошибку Error Code 0x80040E24 (The rowset does not support fetching backwards) на:
Код: vbnet
1.
rs.MoveLast



добавление одной строки
Код: vbnet
1.
rs.MoveFirst

действует аналогично
Код: vbnet
1.
rs.Save NewName, adPersistXML

(иногда увеличивает количество выводимых записей)

ex-zelNikVik,

16659078 не понимаю, как этим воспользоваться. Не смог найти работающий пример.
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38822140
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikVik
Код: vbnet
1.
2.
3.
rs.MoveLast
rs.MoveFirst
Range("A2").CopyFromRecordset r

даёт ошибку Error Code 0x80040E24 (The rowset does not support fetching backwards) на:
Код: vbnet
1.
rs.MoveLast




это говорит о том, что у Вас ForwardOnly курсор
Если почитать про RecordCount, то там есть заметка
Код: plaintext
1.
The cursor type of the Recordset object affects whether the number of records can be determined.  The RecordCount property will return -1 for a forward-only cursor ; 
the actual count for a static or keyset cursor; and either -1 or the actual count for a dynamic cursor, depending on the data source.

что приводит к мысли, что то число, которое вы получаете - это просто бага, т.к этот тип курсора не поддерживает подсчет кол-ва
Для проверки сделайте так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Set cn = New ADODB.Connection
     strConnect = "Provider=MSOLAP.4;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=ICat;Data Source=DS;MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error"
cn.CommandTimeout = 300
cn.Open strConnect
Set rs = New ADODB.Recordset
StrMDX = "MDX запрос"
 rs.Source = StrMDX
 rs.CursorLocation = adOpenStatic
Set rs.ActiveConnection = cn
rs.Open
rs.Movelast
rs.MoveFirst
MsgBox rs.RecordCount  ' Показывает 240000 записей в рекордсете
Cells.Clear
Range("A2").CopyFromRecordset rs             ' Выводит 127000 записей
For i = 0 To rs.Fields.Count - 1
    Cells(1, i + 1) = ИмяПоля(rs.Fields(i).Name)
Next
MsgBox rs.RecordCount   ' Показывает 240000 записей в рекордсете
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38822633
guest123456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKotДля проверки сделайте так

А ещё лучше клиентский курсор используйте.
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38822711
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
guest123456HandKotДля проверки сделайте так

А ещё лучше клиентский курсор используйте.
блин, не так написал. надо
Код: vbnet
1.
rs.CursorType= adOpenStatic
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38822960
NikVik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,

Добавление строки
Код: vbnet
1.
rs.CursorType = adOpenStatic

ничего не изменило.

Добавление строки
Код: vbnet
1.
rs.CursorLocation = adOpenStatic

исправило ситуацию, теперь выводятся все записи (столько, сколько показывает rs.RecordCount).


Огромное спасибо! Я уже начал терять надежду)
Правда я не понимаю, как это работает...
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38823115
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikVikHandKot,

....
Добавление строки
Код: vbnet
1.
rs.CursorLocation = adOpenStatic

исправило ситуацию, теперь выводятся все записи (столько, сколько показывает rs.RecordCount).

...


Вам поразительно повезло в том что, по счастью, adOpenStatic = 3
.CursorLocation надо присваивать значениям из набора CursorLocationEnum,
а не из набора CursortypeEnum, как вы пытались сделать в присваивании
Код: vbnet
1.
rs.CursorLocation = adOpenStatic

.

В CursorLocationEnum за тройку отвечает adUseClient

Конечно, от этого в исполнении кода ничего не изменится, но пристойно переписать присвоение либо на
Код: vbnet
1.
rs.CursorLocation = adUseClient


либо
Код: vbnet
1.
rs.CursorLocation = 3



Это будет указывать будущим читателям, что вы не случайно подставляли все, что вам посоветовали в интернете, а понимали, что делали.
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #38823200
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikVikОгромное спасибо! Я уже начал терять надежду)
Правда я не понимаю, как это работает...
как уже сказано
CursorType - отвечает за тип курсора: изменяемый, статичный, только в перед и т.д
CursorLocation - отвечает за местоположение курсора, т.е где будет находится результат после выполнения: сервер, клиент или еще где-то

Установив местоположение курсора в "клиент", весь результат выполнения сразу был передан с сервера на Ваш компьютер.
Возможно CopyFromRecordset не умеет корректно работать с серверным курсором и надо было делать что-нибудь типа FETCH

Лично я всегда использовал "клиентский курсор", как думаю большинство, и поэтому с такой проблемой как у Вас не сталкивался
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #39037702
splenish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot,

Здравствуйте , столкнулся с той же проблемой возврата частичных данных , добавил по Вашей рекомендации указание работать с курсором на клиенте ,
после этого ексел 2013 стабильно вылетает , пробовал на нескольких машинах , и даже через VSTO...

просто экспортировать в XML не помогает , пока -что сделал загрузку обратно XML в ексел - работает ,

кто нибудь сталкивался ? есть идеи ?

Спасибо

Splenish
...
Рейтинг: 0 / 0
CopyFromRecordset выводит не все записи
    #39038008
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
splenish, а ошибка есть?
хотя может проблема именно в эксель, я с таким ещё не работал
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / CopyFromRecordset выводит не все записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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