Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Функция ADODB.Recordset.GetRows передаёт в массив не все значения! / 17 сообщений из 17, страница 1 из 1
03.02.2018, 04:48
    #39595978
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
Есть процедура на VBA в задачу, которой входит считать большой объём информации (более 10 тыс. строк) с листа MSExcel в массив:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Public Sub MassPSD3()                                                                           '   Считать все строки из обеспеченности ПСД
Dim s As String
    Dim i As Integer
        If cADO.State <> adStateOpen Then                                                           '   Еслисоединенияещёнет, то
        sCon = sCon1 & sCon2 & ";"                                                              '   Сформироватьстрокуподключения
        cADO.ConnectionString = sCon
        cADO.Open                                                                               '   Открываемфайл
    End If
    s = "SELECT * FROM [" & sHN & "$" & sDiap & "]"                                             '   SQL запрос
    rs.Open s, cADO, Options:=adCmdText                                                         '   Передаем SQL комманду
    If Not (rs.EOF Or rs.BOF) Then                                                              '   Еслиданныеесть, то
        mas3 = rs.GetRows
    End If
    rs.Close
    cADO.Close
'    Set rs = Nothing
'    Set cADO = Nothing
    Debug.Print "mas3(0,7730) = " & mas3(0, 7730)
    Debug.Print "mas3(17,7730) = " & mas3(17, 7730)
    Debug.Print "mas3(18,7730) = " & mas3(18, 7730)
        mas3 = TransposeArray(mas3)                                                                 '   Переворачиваеммассив
End Sub


Проблема в том, что в массив попадают значения не всех ячеек. Например, по адресу mas3(18,7730) ожидается значение «РД в наличии 18.08.2017», но реально там «NULL»:

Подскажите, как решить проблему?
Исходник:
...
Рейтинг: 0 / 0
03.02.2018, 04:51
    #39595979
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
Исходник: ИСХОДНИК
...
Рейтинг: 0 / 0
03.02.2018, 10:39
    #39596001
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
осталось выяснить, что и откуда надо запускать, чтобы воспроизвести вашу проблему. скриншот нечитаемый
...
Рейтинг: 0 / 0
05.02.2018, 14:28
    #39596781
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
Нужно запустить процедуру "MassPSD3"
...
Рейтинг: 0 / 0
05.02.2018, 14:29
    #39596782
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
Shocker.Pro,
нужно запустить процедуру "MassPSD3"
...
Рейтинг: 0 / 0
05.02.2018, 14:43
    #39596799
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
Shocker.Pro,
в эксель файле 7737 строка! В массиве 7730 строка!
...
Рейтинг: 0 / 0
07.02.2018, 06:47
    #39597862
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
Shocker.Pro,
идеи какие нибудь есть, из-за чего это происходить?
...
Рейтинг: 0 / 0
07.02.2018, 08:45
    #39597895
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
АртЮганскShocker.Pro,
идеи какие нибудь есть, из-за чего это происходить?
склонность екселя к автопреобразованию данных

замените строку подключения на OLEDB
к примеру

Код: vbnet
1.
Public Const sCon1 = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"


или
Код: vbnet
1.
Public Const sCon1 = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"



в зависимости от драйвера, который у вас стоит

На будущее, строки подключения
...
Рейтинг: 0 / 0
09.02.2018, 07:53
    #39599474
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
HandKot,

Попробовал, две ваших строки
на строку:
Код: vbnet
1.
sCon1 = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"



Выдаёт ошибку: " Ошибочный аргумент. "

на строку:
Код: vbnet
1.
sCon1 = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1"";"



Выдаёт ошибку: " Невозможно найти устанавливаемый ISAM. "
...
Рейтинг: 0 / 0
09.02.2018, 09:04
    #39599486
АртЮганск
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
HandKot,

Спасибо всем, проблема решена!
С такой строкой:

Код: vbnet
1.
Public Const sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Art\МАКРОСЫ\УНС_Маска\Макрос\bd.xlsb;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"



работает идеально!
...
Рейтинг: 0 / 0
09.02.2018, 15:48
    #39599768
Nik_Kurta
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
Ещё так попробуй

Public Const sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Art\МАКРОСЫ\УНС_Маска\Макрос\bd.xlsb;Extended Properties=Excel 12.0 Xml;"
...
Рейтинг: 0 / 0
12.02.2018, 07:35
    #39600369
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
АртЮганскHandKot,

Спасибо всем, проблема решена!
С такой строкой:

Код: vbnet
1.
Public Const sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Art\МАКРОСЫ\УНС_Маска\Макрос\bd.xlsb;Extended Properties=""Excel 12.0;HDR=YES;IMEX=1"";"



работает идеально!

в Вашем случае обратите внимание на IMEX=1 . Именно этот параметр и НЕ позволяет экселю преобразовывать входящие данные, что и решило Вашу проблему
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
20.02.2019, 14:04
    #39776739
natalitvinenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
HandKotв Вашем случае обратите внимание на IMEX=1 . Именно этот параметр и НЕ позволяет экселю преобразовывать входящие данные, что и решило Вашу проблему
Только собралась написать благодарственный пост с дифирамбами, а тут выяснилось, что действует не на все поля или не на все типы. Оный параметр помог с одним полем и упорно подставляет нули в другое. Оба числовые. Проблемы в тех ячейках, к которым есть примечание "число сохранено как текст". Строка подключения:
Код: javascript
1.
connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" +pppath+"; Persist Security Info=False;Extended Properties='Excel 8.0;HDR=YES;IMEX=1';");


Вообще-то я маяюсь с jscript :-) но, кажется, это неважно в контексте ситуации.
...
Рейтинг: 0 / 0
21.02.2019, 08:08
    #39777085
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
natalitvinenkoтут выяснилось, что действует не на все поля или не на все типы. Оный параметр помог с одним полем и упорно подставляет нули в другое. Оба числовые. Проблемы в тех ячейках, к которым есть примечание "число сохранено как текст". Строка подключения:
Код: javascript
1.
connection.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source =" +pppath+"; Persist Security Info=False;Extended Properties='Excel 8.0;HDR=YES;IMEX=1';");


Вообще-то я маяюсь с jscript :-) но, кажется, это неважно в контексте ситуации.
Добрый день.
Пришлите файлик с примером. Тут посмотрят
...
Рейтинг: 0 / 0
01.03.2019, 10:08
    #39780796
natalitvinenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
HandKotВообще-то я маяюсь с jscript :-) но, кажется, это неважно в контексте ситуации.
Добрый день.
Пришлите файлик с примером. Тут посмотрят[/quot]

Спасибо! Уже сама разгребла и именно так, как Вы сказали - https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1308941&msg=21816519
...
Рейтинг: 0 / 0
01.03.2019, 10:12
    #39780799
natalitvinenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
HandKot, вдогонку к предыдущему посту. Еще немножко чудили пользователи. Данные получались , возможно, путем распознавания бумажной версии, и потому там в одной фамилии присутствовала одинарная кавычка ' . Программа доходила до этой строчки и валилась, хотя вроде всяких try натыкано много. Предварительно чистить поля от всего, что не буква, тоже был не вариант по ряду причин. Отловила злосчастную кавычку, отписали юзерам и решили проблему:-)
...
Рейтинг: 0 / 0
20.03.2019, 09:04
    #39788787
An111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ADODB.Recordset.GetRows передаёт в массив не все значения!
АртЮганскидеи какие нибудь есть, из-за чего это происходить?

При открытии Recordset-a ADODB пытается определить тип поля. Делает он это не по всем строкам, а только по первым. Соответственно если в первых строках в столбце стоит число, а где-то в середине в нем же написано "Вася", то эта строка не будет добавлена в Recordset.

При желании можно самим принудительно указать тип полей Recordset-a, например, следующим образом:

SELECT ' ' AS F1, 0 AS F2, ... WHERE 1=2
UNION
SELECT F1, F2, ...

В общем, как-то так, насколько помню
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Функция ADODB.Recordset.GetRows передаёт в массив не все значения! / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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