внешние данные dbf
Как строить оптимально такие запросы А то обработка и возврат данных затягивается надолго Дело в Экселе
Кто-нибудь работает с внешними данными из файлов dbf? Построение sql-запросов
Как строить оптимально такие запросы А то обработка и возврат данных затягивается надолго Дело в Экселе
Кто-нибудь работает с внешними данными из файлов dbf? Построение sql-запросов
Как строить оптимально такие запросы А то обработка и возврат данных затягивается надолго Дело в Экселе
Я тоже занимаюсь этим вопросом.
Программы на VBA под Excel вообще работают быстрее, если поотключать всю авто-хрень на время выполнения программы:
With Application
.Calculation = xlManual
.CalculateBeforeSave = False
.EnableAnimations = False
.ErrorCheckingOptions.BackgroundChecking = False
End With
Если не пробовал - попробуй...
Конкретизирую. Создаю запрос в MICROSOFT QUERY. Там отображение данных происходит относительно быстро А вот возврат данных в excel занимает много часов В чем тут дело и как можно решить эту проблему?
Здесь может быть очень много факторов влияющих на работу, ну например: состояние операционной системы, забитость реестра всякой чушью, недостаток оперативной памяти, прочие проблемы с быстродействием железа, размер файла xls (это может влиять на быстродействие очень значительно), наличие значительного количества зависящих формул выстроенных в цепочки, ну итд. если можно выложи файлы на посмотреть, попробовать.
Здесь может быть очень много факторов влияющих на работу, ну например: состояние операционной системы, забитость реестра всякой чушью, недостаток оперативной памяти, прочие проблемы с быстродействием железа, размер файла xls (это может влиять на быстродействие очень значительно), наличие значительного количества зависящих формул выстроенных в цепочки, ну итд. если можно выложи файлы на посмотреть, попробовать.
Оперативка 128 Мб, проц 1700 Формул зависящих нет. Открываю новую книгу, сразу внешние данные/создать запрос и связываю 5-6 таблиц Три из них большие порядка 25000 строк, остальные - справочники. QUERY делает запрос в теч 2-3 мин А вот возврат данных в эксель....
Оперативка 128 Мб, проц 1700 Формул зависящих нет. Открываю новую книгу, сразу внешние данные/создать запрос и связываю 5-6 таблиц Три из них большие порядка 25000 строк, остальные - справочники. QUERY делает запрос в теч 2-3 мин А вот возврат данных в эксель....
Есть небольшая разница между тем как работает Query и Excel, в Query тебе показывают только страницу данных и по мере необходимости подкачивают данные, Excel же закачивает все данные к себе, посему 5-6 таблиц 3 из которых 25000 строк - это очень много, попробуй проделать то-же самое на компе с большим количеством памяти (хотя-бы 256), я думаю что быстродействие возрастет значительно!
Есть небольшая разница между тем как работает Query и Excel, в Query тебе показывают только страницу данных и по мере необходимости подкачивают данные, Excel же закачивает все данные к себе, посему 5-6 таблиц 3 из которых 25000 строк - это очень много, попробуй проделать то-же самое на компе с большим количеством памяти (хотя-бы 256), я думаю что быстродействие возрастет значительно!
А вот к другому железу добраться не могу :(
А вот к другому железу добраться не могу :(
ты из какого города?
ты из какого города?
Уляновск. Просто не охота бабки ради этого тратить :-) Тем более на работе.
Уляновск. Просто не охота бабки ради этого тратить :-) Тем более на работе.
Жаль, если-бы ты был из Москвы, я нашел-бы лишний DIMM из своих запасов и дал поиграть........... :(
Жаль, если-бы ты был из Москвы, я нашел-бы лишний DIMM из своих запасов и дал поиграть........... :(
Да, жаль Будем искать решение. Хотя времени нет, блин
Да, жаль Будем искать решение. Хотя времени нет, блин
:???: А если попробовать выгрузить нужные тебе данные в какую-нибудь промежуточную таблицу (*.dbf например, ее просто Excel легко открывает)? А потом импортируй эти данные в Excel и делай там с ними чего тебе надо!:-?
Да, жаль Будем искать решение. Хотя времени нет, блин
А все-таки ты используешь то, что предлагал SergeySV ?
Application.ScreenUpdating = False
....
Application.ScreenUpdating = True
Мне это ускоряет работу с объемными данными на порядки.:x
Кто-нибудь работает с внешними данными из файлов dbf? Построение sql-запросов
Как строить оптимально такие запросы А то обработка и возврат данных затягивается надолго Дело в Экселе
' Попробуй использовать DAO, это должно значительно ускорить работу
'больших баз dBase у меня нет, пробовал на базе Борей.mdb
'831 запись возвращает менее чем за секунду
'Operating System Windows 2000 v5.1.2600
'CPU Model/Name x86 Family 6 Model 8 Stepping 1 with MMX(tm) Technology
'CPU Speed 1403MHz
'Total Physical Memory 512MB
Sub CopyRecords()
'Перед использованием обязательно установить ссылку на Microsoft DAO любой версии!!!
'в папке C:\Program Files\Common Files\Microsoft Shared\DAO
'должны быть библиотеки dao350.dll или dao360.dll
'они копируются при инсталяции Microsoft Office
Dim db As Database, rec As Recordset
Dim iCols As Integer, dPath As String
t = Timer
'путь к базе данных (файлам dbf)
dPath = "c:\Program Files\Microsoft Office\Office10\1049"
'Открываем базу данных
Set db = OpenDatabase(dPath, 0, 0, "dBase IV")
'Открываем набор записей из базы
'текст запроса хранится в Sheets("лист2").Cells(1, 1), в модуле неудобно
'можно вместо Sheets("лист2").Cells(1, 1).Value
Set rec = db.OpenRecordset(Sheets("лист2").Cells(1, 1).Value, dbOpenDynaset)
'для упрощения написания устанавливаем объектную переменную (ссылку на лист)
Set ws = Worksheets("лист1")
'Цикл по всем полям, в котором выводим имена полей
For iCols = 0 To rec.Fields.Count - 1
ws.Cells(1, iCols + 1).Value = rec.Fields(iCols).Name
Next
'копируем набор данных начиная с ячейки "A2"
ws.Range("A2").CopyFromRecordset rec
'Закрываем набор данных
rec.Close
'Закрываем базу данных
db.Close
MsgBox "Затрачено " & Timer - t & "секунд", vbOKOnly, "Затраченное время"
End Sub
Sub CopyRecords()
Dim db As Database, rec As Recordset
Dim iCols As Integer, dPath As String
t = Timer
'путь к базе данных (файлам dbf)
dPath = "c:\Program Files\Microsoft Office\Office10\1049"
'Открываем базу данных
Set db = OpenDatabase(dPath, 0, 0, "dBase IV")....
End Sub
А если таблицы между собой увязываются по ключевым полям? НАпример, основная таблица содержит только определенные коды, а в других таблицах dbf есть словари к этим кодам. Пусть основная (I) таблица dbf содержит поля: 1 поставщики(код), 2 продукция (код) II dbf-таблица содержит: 1 код поставщика, 2 наименование поставщика. III dbf-таблица содержит: 1 код продукции, 2 наименование продукции.
В итоге мне нужно вывести Не коды поставщиков и продукции, а их полные наименования.
Вот Надеюсь понятно
Но если нет, то попробуй так. Как правильно уже писали открываешь recordset (можно через DAO, а можно через более современный ADO - типа универсальный DAO для все баз данных), а в качестве источника задаешь строку SQL-запроса. В твоем случае нужно составить сложный SQL запрос: говоришь всякие связанные таблицы, значит надо юзать конструкцию - INNER JOIN (Загрузи Access, загрузи nnelf твои реальные таблицы и в конструкторе запросов составь итоговый запрос, в нем всеж полегче работать новичкам, например INNER JOINон сам автоматом добавит, когда увидит, что твои таблицы связаны)
На счет заполнения потом ячеек из recordset. Тут такой момент: необходимо контролировать тип данных, если просто брать значение поля в recordset и пихать его ячейку Excel, то тогда Excel будет заниматься неявным преобразованием и далеко не всегда удачно, так что последи за ним.
Хм, а ты разве не так делал в начале. Я думал ты уже пробовал открывать recordset на SQL запросе....
Никогда не пользовался Можно примерчик с пояснением и использованием SQL-запроса?