|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
Здравствуйте. 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 12:56 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
Позор на седую голову, ошибки же пропускаются :) Попробую с выключенными ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 13:08 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
Buzzo В-основном ближе к концу списка (но есть и в первой половине) запрос не возвращает данные (пустая ячейка) закомменте временно строку On Error Resume Next она мешает вам видеть текст ошибки ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 13:40 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
Buzzo вытаскиваю в Excel'евский файл данные (около 8000 строк). 8000 раз выполняется запрос, может изменить методику расчета конечно весьма смахивает на некое подобие стат-отчета и конечно вы уверены, что значение DBRS![Поле Б] обязательно имеется, так как не проверяете на null Cells(WorkRow, 2) = DBRS![Поле Б] ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 13:48 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
Buzzo, и я видимо заполняла бы рабочую аксесс таблицу, а затем только сбрасывала в ексель ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 14:01 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
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 таблиц, если значения в них не повторяются? Почему не в одной? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 14:39 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА 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 часа! Давно с Аксессом не общался, почти заново начинаю) Может другие пути ускорения есть ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 15:36 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
Buzzo Кривцов Анатолий Buzzo, lдля начала вместо SearchArr = Range(Cells(2, 1), Cells(8000, 1)) укажите SearchArr = Range(Cells(2, 1), Cells(8000, 1)) .Value .Value же у нас по дефолту? Никогда и нигде его не использую)) Вы попробуйте, а если что-то изменится - обсудим. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 15:44 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
Buzzo Экселевский файл с 170000 строками мутузился без малого 33 часа! супер много - явно надо менять методику расчета ведь выбирается одна строка если более - ошибка в исходной таблице если не найдено - что же, бывает, но надо обрабатывать эту ситуацию ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 17:03 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.02.2020, 19:49 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА видимо ускорение будет раз в 10 если переставить пару строк ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2020, 05:38 |
|
В процессе выполнения запросов из Excel Access перестаёт возвращать данные
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА Код: vbnet 1. 2. 3. 4.
Или даже так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2020, 05:54 |
|
|
start [/forum/topic.php?fid=45&gotonew=1&tid=1610216]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
136ms |
get topic data: |
11ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 312ms |
total: | 553ms |
0 / 0 |