powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / В процессе выполнения запросов из Excel Access перестаёт возвращать данные
13 сообщений из 13, страница 1 из 1
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930549
Buzzo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
MS Access 2010 (.accdb), база из 40 таблиц (несвязанных), в каждой от 3000 до 100000 строк, вытаскиваю в Excel'евский файл данные (около 8000 строк).
Обращение к той или иной таблице (Table01, Table02...) - в зависимости от двух первых цифр в запросе.
В-основном ближе к концу списка (но есть и в первой половине) запрос не возвращает данные (пустая ячейка), "сольный" запрос (из другой процедуры) также ничего не возвращает.
Итого около 300 пустых строк (кстати, количество пустых при каждом запуске разное).
После ребута запускаю заново на заполнение выделенных на отдельный лист 300 строк - и всё заполняется ("соло" тоже работает).
Изначально на домашнем компьютере с MS Access 2007 и неразделенной базой (1 таблица) всё делалось в 10 раз медленнее, но без выпаданий.

Код:
Код: vbnet
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.
27.
28.
29.
30.
31.
32.
33.
Option Base 1

Sub Add_From_MS()

Dim DBRS As ADODB.Recordset
Dim DBQuery As String
Dim DBConnect As String
Dim WorkRow, WorkRowArr, SearchArr

On Error Resume Next

SearchArr = Range(Cells(2, 1), Cells(8000, 1))

DBConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source = C:\DB.accdb"

For WorkRow = 2 To 8000

    WorkRowArr = WorkRow - 1
    
    DBQuery = "SELECT * FROM Table" & Left(SearchArr(WorkRowArr, 1), 2) & " WHERE [Поле А]='" & SearchArr(WorkRowArr, 1) & "'"

    Set DBRS = New ADODB.Recordset
    DBRS.Open DBQuery, DBConnect, adOpenStatic, adLockReadOnly
    
    Cells(WorkRow, 2) = DBRS![Поле Б]

    DBRS.Close
    Set DBRS = Nothing

Next


End Sub
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930556
Buzzo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Позор на седую голову, ошибки же пропускаются :)
Попробую с выключенными
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930587
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Buzzo
В-основном ближе к концу списка (но есть и в первой половине) запрос не возвращает данные (пустая ячейка)


закомменте временно строку On Error Resume Next
она мешает вам видеть текст ошибки
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930592
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Buzzo
вытаскиваю в Excel'евский файл данные (около 8000 строк).

8000 раз выполняется запрос, может изменить методику расчета

конечно весьма смахивает на некое подобие стат-отчета

и конечно вы уверены, что значение DBRS![Поле Б] обязательно имеется, так как не проверяете на null
Cells(WorkRow, 2) = DBRS![Поле Б]
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930606
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Buzzo,

и я видимо заполняла бы рабочую аксесс таблицу, а затем только сбрасывала в ексель
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930624
Buzzo, lдля начала вместо
SearchArr = Range(Cells(2, 1), Cells(8000, 1))
укажите
SearchArr = Range(Cells(2, 1), Cells(8000, 1)) .Value

Вы не проверяете Recordset на наличие записи. При отсутствии в БД указанного значения это приводит у ошибке, а она - к последствиям.

ЗЫ. Структура БД впечатляет! Т.е. в Table01 у вас все значения начинаются на "01", а в Table40 на "40"? Зачем тогда 40 таблиц, если значения в них не повторяются? Почему не в одной?
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930655
Buzzo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА

8000 раз выполняется запрос, может изменить методику расчета

Пробовал по-разному, этот - самый быстрый способ получается.
В любом случае, сравнение двух списков, будь-то массивы или нет.
Кривцов Анатолий
Buzzo, lдля начала вместо
SearchArr = Range(Cells(2, 1), Cells(8000, 1))
укажите
SearchArr = Range(Cells(2, 1), Cells(8000, 1)) .Value

.Value же у нас по дефолту? Никогда и нигде его не использую))
Кривцов Анатолий

Вы не проверяете Recordset на наличие записи. При отсутствии в БД указанного значения это приводит у ошибке, а она - к последствиям.

Да, понял косяк, но он не объясняет пропуск данных, которые заведомо в базе есть и которые подтягиваются при следующей итерации после перезагрузки.
Или объясняет?
Объясняло бы, но тогда непонятно, почему конкретный запрос к такой записи (из другой процедуры) до перезагрузки также не работает, а после - начинает работать и то, и другое.
Кривцов Анатолий

ЗЫ. Структура БД впечатляет! Т.е. в Table01 у вас все значения начинаются на "01", а в Table40 на "40"? Зачем тогда 40 таблиц, если значения в них не повторяются? Почему не в одной?

Потому что в одной - это более миллиона строк, и обработка в около 10 раз медленнее.
Экселевский файл с 170000 строками мутузился без малого 33 часа!
Давно с Аксессом не общался, почти заново начинаю) Может другие пути ускорения есть
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930660
Buzzo
Кривцов Анатолий
Buzzo, lдля начала вместо
SearchArr = Range(Cells(2, 1), Cells(8000, 1))
укажите
SearchArr = Range(Cells(2, 1), Cells(8000, 1)) .Value

.Value же у нас по дефолту? Никогда и нигде его не использую))

Вы попробуйте, а если что-то изменится - обсудим.
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930704
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Buzzo
Экселевский файл с 170000 строками мутузился без малого 33 часа!

супер много - явно надо менять методику расчета
ведь выбирается одна строка

если более - ошибка в исходной таблице
если не найдено - что же, бывает, но надо обрабатывать эту ситуацию
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930754
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Buzzo,
видимо ускорение будет раз в 10 если переставить пару строк
Option Base 1

Sub Add_From_MS()

Dim DBRS As ADODB.Recordset
Dim DBQuery As String
Dim DBConnect As String
Dim WorkRow, WorkRowArr, SearchArr

On Error Resume Next

SearchArr = Range(Cells(2, 1), Cells(8000, 1))

DBConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source = C:\DB.accdb"
''''''''''''''''''
Set DBRS = New ADODB.Recordset
''''''''''''''''''
For WorkRow = 2 To 8000

WorkRowArr = WorkRow - 1

DBQuery = "SELECT * FROM Table" & Left(SearchArr(WorkRowArr, 1), 2) & " WHERE [Поле А]='" & SearchArr(WorkRowArr, 1) & "'"


DBRS.Open DBQuery, DBConnect, adOpenStatic, adLockReadOnly

Cells(WorkRow, 2) = DBRS![Поле Б]

DBRS.Close

Next
'''''''''''''''''''''''''
Set DBRS = Nothing


End Sub
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930857
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА
видимо ускорение будет раз в 10 если переставить пару строк
К этому бы стоило добавить открытие ADODB.Connection до цикла, а то соединение создаётся каждый раз за кулисами при открытии набора. Ну и заменить adOpenStatic на adOpenForwardOnly (+ adLockReadOnly в таком сочетании получается самый "быстрый" набор)
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930859
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА
Код: vbnet
1.
2.
3.
4.
DBQuery = "SELECT * FROM Table" & Left(SearchArr(WorkRowArr, 1), 2) & " WHERE [Поле А]='" & SearchArr(WorkRowArr, 1) & "'"
    DBRS.Open DBQuery, DBConnect, adOpenStatic, adLockReadOnly
    Cells(WorkRow, 2) = DBRS![Поле Б]
    DBRS.Close


Или даже так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
...
Dim cnn as new ADODB.Connection

cnn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source = C:\DB.accdb"
cnn.Open
...
For...
    With cnn.Execute("SELECT [Поле Б] FROM...")
        if not .EOF then
            Cells(WorkRow, 2) = .Collect(0)
        End if
        .Close
    End with
next
cnn.Close
Set cnn = Nothing
...
Рейтинг: 0 / 0
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
    #39930873
Buzzo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема действительно ушла после обработки отсутствующих значений из базы.
Советы по ускорению также помогли.
Всем спасибо, вы - крутые! :))
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / В процессе выполнения запросов из Excel Access перестаёт возвращать данные
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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